1. 의존성 주입 (DI : Dpendency Injection)
- 객체를 직접 생성하는 것이 아닌, 외부에서 생성한 후 주입시키는 방식
=> spring이 알아서 객체를 주입해 줌
- 모듈간의 결합도 낮춤. 유연성 높임.
2. 의존성 주입 방법
1) 생성자 주입 (Constructor Injection)
- 생성자를 통해 의존성을 주입하는 방법
- 생성자 주입은 생성자 호출 시점에 1회 호출되는 것이 보장 됨
=> 주입받은 객체가 변하지 않거나, 반드시 객체의 주입이 필요한 경우 강제하기 위해 사용
- 생성자가 1개만 있을 경우, @Autowired를 생략해도 주입이 가능함
- Spring 프레임워크에서 가장 권장하는 방식
@Service
public class BoardService {
private BoardDao boardDao;
public BoardService(BoardDao boardDao) {
this.boardDao = boardDao;
}
}
@Service
@AllArgsConstructor
public class BoardService {
private BoardDao boardDao;
}
2) setter 주입 (Setter Injection)
- setter를 통해 의존성 주입
- setter에 @Autowired 어노테이션 붙임
- setXXX를 public으로 설정해야 하므로, 언제 어디서든 변경이 가능하다는 단점이 있음
@Service
public class OrderService {
private DiscountPolicy discountPolicy;
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
}
3) 필드 주입 (Field Injection)
- 가장 간단한 방식이나, 권장되지 않는 방식.
- 주입되는 필드에 @Autowired 어노테이션 붙임
- 외부에서 변경이 불가능 => 테스트하기 힘들다는 단점있음
- 의존 관계가 눈에 잘 보이지 않아 추상적 => 의존성 관계가 과도하게 복잡해질 수 있음
@Service
public class OrderService {
@Autowired
private DiscountPolicy discountPolicy;
}