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 버전으로 좀 더 자세한 설명이 필요하다면 '스프링 핵심 원리 - 기본편' 강의 추천 ]