Spring
spring 의존관계 주입 방법 4가지
kelicia
2021. 5. 6. 23:01
(1) 생성자 주입
(2) 수정자 주입
(3) 필드 주입
(4) 일반 메소드 주입
(1) 생성자 주입
- 생성자 호출시점에만 의존관계 인스턴스 할당
- immutable, 필수 의존관계에 사용
- 예제
/* kotlin */
// spring bean 한정으로, 생성자 1개면 @Autowired 생략 가능
@Service
class MemberService(private val memberRepo: MemberRepo)
// 생성자가 2개 이상이면 @Autowired 명시 필요
@Service
class OrderService() {
private var orderRepo: OrderRepo? = null
@Autowired
constructor(orderRepo: OrderRepo): this() {
this.orderRepo = orderRepo
}
}
(2) 수정자 주입
- setter 통해서 의존관계 인스턴스 할당
- 선택적 또는 변경될 수 있는 의존관계에 사용
- 예제
/* kotlin */
@Service
class OrderService() {
private var orderRepo: OrderRepo? = null
@Autowired(required = false)
set(value) {
field = value
}
}
(3) 필드 주입
- 외부에서 의존관계 주입이 불가능하기 때문에 의존관계 구현체 별로 테스트하기 어려움
- DI 프레임워크(ex. spring)가 반드시 필요, 그래서 테스트하려면 `@SpringBootTest`와 같은 통합 테스트에서만 가능
- 예제
/* kotlin */
@Service
class OrderService {
@Autowired
private lateinit var orderRepo: OrderRepo // !권장하지않음!
}
- 기본적으로 권장하지 않는 방법이지만, 예외적으로 사용한다면 `@SpringBootTest` 내에서 테스트 코드 작성하는 경우가 있겠다.
- 권장하지 않는 이유는 위 설명한 2가지 단점 때문이고, 이 단점들을 (1), (2) 방법으로 해결할 수 있기 때문
(4) 일반 메소드 주입
- 예제
/* kotlin */
@Service
class OrderService {
private var orderRepo: OrderRepo? = null
@Autowired
fun init(orderRepo: OrderRepo) {
this.orderRepo = orderRepo
}
}
- (1), (2) 방법으로 충분히 대체 가능하기 때문에 잘 쓰이진 않음.
[ ref. java 버전으로 좀 더 자세한 설명이 필요하다면 '스프링 핵심 원리 - 기본편' 강의 추천 ]