728x90
DI를 구현하는 방법은 필드주입, 세터 주입, 생성자 주입으로 3가지가 있다.
이 3가지에 대해서 간단하게 정리하려고 한다.
먼저 DI를 하면 외부에서 의존성을 주입받기 때문에
(1) 테스트가 용이해지고
(2) 객체간 결합도를 낮추고
(3) 코드의 재사용성을 높인다.
1. 필드 주입
@Controller
public class FoodController {
@Autowired
private FoodService foodService;
}
필드에 @Autowired 어노테이션만 붙여주면 의존성이 주입된다.
코드가 간결하지만 프레임워크에 의존적이고 외부에서 수정이 불가하다.
외부에서 수정이 불가하다는 것은 테스트 코드 작성시 객체를 수정수 없다는 말이 된다.
2. 세터 주입
@Controller
public class FoodController {
private FoodService foodService;
@Autowired
public void setFoodService(FoodService foodService) {
this.foodService = foodService;
}
}
세터는 어쩔수 없이 public으로 해야 한다.
세터주입에서 세터의 목적은 DI이다.
즉, 의존성을 주입할때 세터를 사용해야 하는것이다.
하지만 public으로 되어있는 세터는 의존성을 주입할때 이외에도 사용될수가 있다는 문제가 있다.
3. 생성자 주입
@Controller
public class FoodController {
private final FoodService foodService;
@Autowired
public FoodController(FoodService foodService){
this.foodService = foodService;
}
}
생성자는 처음 객체를 생성할때에만 실행되므로 불변성을 유지하면서 의존성을 주입받을 수 있다.
또한 객체끼리 서로 의존성을 가지고 있는 순환참조를 방지할수 있다.
필드 주입보다 코드가 길어보이지만 Lombok의 @RequiredArgsConstructor 어노테이션으로 생성자 코드를 생략할 수 있다.
추가로 테스트를 할 때 용이하다.
그래서 생성자는 필드 주입, 세터 주입의 단점들을 극복하는 주입 방법이라고 생각한다.
참고
https://dev-coco.tistory.com/70
https://programforlife.tistory.com/111
728x90
'개발 > Spring Boot' 카테고리의 다른 글
[Spring Boot] 오버로딩 언제 할 수 있을까 (0) | 2023.06.11 |
---|---|
[Spring Boot] Mockito란? (1) | 2023.05.31 |
[Spring Boot] dotenv(.env) 때문에 날려버린 2일 (0) | 2023.05.24 |
[Spring Boot] 어노테이션 정리 (0) | 2023.05.17 |
[Spring Boot] Setter vs Constructor vs Builder (0) | 2023.05.16 |