728x90
의존성 개념
- 객체간의 관계를 뜻함, 의존관계
주입 개념
- 외부에서 객체를 생성해서 넣어주는 것
정의
- 필요한 객체를 setter나 constructor로 전달 받아서 넣어주는 것
일반적으로 의존성 주입은 SPRING에서 많이 사용되며, 주입방법도 여러가지가 있음
의존성 주입 방법
- 필드 주입
- 수정자 주입
- 생성자 주입
일반적으로 익숙한건 @Autorwired를 통한 필드 주입이 익숙할 듯 (필자는 생성자 주입을 선호함)
필드 주입
@Service
public class UserService {
@Autowired
private UserRepository userRepository
}
주입방법중 가장 간단함, 간단해서 막 추가가능(장점이라보기 어려움), 주입 필드를 Final로 정의 불가
수정자 주입
@Service
public class UserService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
setter 메서드를 통하여 주입 (필자는 생소함), 필드 주입과 동일하게 Final로 정의 불가함
생성자 주입
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
스프링에서도 무조건 권장하는 의존성 주입 방법, Final로 정의를 함 (필자는 Lombok을 이용하여 해당 방식으로 주입함)
생성자 주입의 장점
- Final을 선언해여 주입하기 때문에 불변성을 유지가 가능함
- 생성자 주입은 순환참조가 발생할 경우 BeanCurrentlyCreationExeption 발생시켜서 순환참조를 방지함 (필드주입이나 수정자 주입으로는 순환참조를 발견할 방법이 없음)
순환참조
- A클래스가 B클래스를 참조하는데, B클래스가 다시 A클래스를 참조하고, B클래스가 C클래스를 참조하고 A클래스가 B클래스를 참조하는 경우 (해당 설명 예시만 들어도 끔찍함)
스프링에서 생성자 주입을 권장하는 이유가 있음, 생성자주입에 익숙해지자
'SPRING' 카테고리의 다른 글
[SPRING] DISPATCHER-SERVLET (0) | 2021.06.07 |
---|---|
[SPRING] Bean (0) | 2021.05.23 |
[SPRING] 컨테이너 (Container) (0) | 2021.05.23 |
[SPRING] JPA 연관관계 (0) | 2021.05.19 |
[SPRING] JPA 영속성 컨텍스트 (0) | 2021.05.16 |