개인적인 공부 용도로 제가 이해한대로 블라블라 쓰는 글입니당 :)
잘못된 부분이나 추가할 부분이 있으면 댓글 부탁드립니다!
DI? 의존성 주입?
List<Integer> list = new ArrayList<>();
위의 코드처럼 new를 사용하면 인스턴스가 생성된다.
인스턴스란 실제 메모리에 할당된 객체를 의미한다.
기존 알고리즘 문제를 풀거나 간단한 문제를 풀었을 때에는 위의 방식으로 인스턴스를 생성해 문제를 해결한 경험이 많다. 하지만 API를 만들어보며 DI가 왜 필요한지 이해를 했다.
[예시]
기업 회원가입 페이지 (Enterprise.html)
일반 회원가입 페이지 (personal.html)
User | ||
id | int(AI) | |
username | varchar(50) | |
password | varchar(50) | |
role | int |
위의 User 테이블을 함께 사용하고 role 번호에 따라 기업/일반을 나눈다.
(바로 작성한거라 코드가 이상할 수도 있어여 흑흑....ㅠㅠ)
public class UserService {
private UserRepository userRepository;
public UserService(){
this.userRepository = new UserRepository();
}
// View에서 받아온 값(userDTO)을 DB에 저장
public UserDTO join(UserDTO userDTO){
return userRepository.save(userDTO);
}
}
public class EnterpriseService {
private UserRepository userRepository;
public EnterpriseService(){
this.userRepository = new UserRepository();
}
public UserDTO join(UserDTO userDTO){
return userRepository.save(userDTO);
}
}
실제로 이렇게 사용하진 않겠지만 아무튼...!
UserService와 EnterpriseService을 구현하려면 실행되면 UserRepository의 내용이 필요하고,
실행 시에 자동으로 UserRepository의 인스턴스 객체를 생성합니다. 형식이나 기능이 변경되면 서로에게 문제가 생길 수 있고 이를 의존성이라고 표현합니다.
또, 두 서비스는 회원가입 시에 사용하는 DB 테이블은 동일하기 때문에 동일한 Repository를 사용합니다.
"어짜피 같은건데 각 클래스마다 필요하면 인스턴스를 계속 생성해야해...? 공유하면 안되는거야...? 그리고 갑자기 내가 써야하는 기능이 변경되면 문제가 생기잖아 ㅠㅠ"
"아니! 공유할 수 있지롱! 그리고 내 상황에 맞춰 변경도 가능하게 할 수 있어! DI로 가능하지롱!"
해서 DI으로 의존성을 낮추고 코드 재사용의 기능이 올라갑니다.
DI 방법 3가지
1. 필드 주입
public class UserService{
@Autowired private UserRepository userRepository;
}
2. 생성자 주입
public class UserService{
private UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository){
this.userRepository = userRepository;
}
}
3. 세터주입
public class UserService{
private UserRepository userRepository;
@Autowired
public void setUserService(UserRepository userRepository){
this.userRepository = userRepository;
}
}
필드 주입의 경우 상황에 맞춰 변경이 불가능하고 세터주입의 경우 외부에서 참조해 사용할 수 있기 때문에 생성자 주입을 가장 많이 사용한다고 합니다!
'Develop > Spring' 카테고리의 다른 글
[Spring Boot] Naver Email 보내기 (0) | 2021.07.16 |
---|---|
[Spring/JPA] 연관관계 매핑 (0) | 2020.12.20 |
[Spring/JPA] 영속성(persistence) (0) | 2020.12.15 |
[Spring]테스트 기본 구조? 사용하면 편한 구조? (0) | 2020.11.02 |
Spring이란? (0) | 2020.10.17 |