[JPA] @Autowired보다 생성자 주입을 사용해야하는 이유
MVC패턴 스프링프로젝트에서 Controller에서 Service를 의존성 주입할때 대부분 @Autowired로 필드주입을 한다.
하지만 JPA를 사용하는 경우 @Autowired 필드 주입보다는 생성자 주입 사용을 권장한다.
그 이유가 무엇인지 알아보자.
필드 주입(Field Injection)이란?
사용법이 매우 간단하여 많은 개발자들이 사용한다. 필드에 @Autowired만 붙여주면 끝!
해당 필드에 자동으로 의존성이 주입된다.
- ApiController.java
1
2
3
4
5
public class ApiController {
NoticeService noticeService;
}
생성자 주입(Constructor Injection)이란?
생성자로 의존성을 주입한다. 방법은 총 두가지이다.
첫번째 방법: 정석
- ApiController.java
1
2
3
4
5
6
7
8
public class ApiController {
NoticeRepository noticeRepository;
public ApiController(NoticeRepository noticeRepository) {
this.noticeRepository = noticeRepository;
}
}
두번째 방법: @RequiredArgsConstructor + final사용
위의 방법을 쉽게 할 수 있는 스프링프레임워크의 어노테이션이 있다!
바로 @RequiredArgsConstructor를 넣은 뒤 필드를 final로 선언해주면 된다.
- ApiController.java
1
2
3
4
5
6
public class ApiController {
private final NoticeRepository noticeRepository;
}
스프링팀에서 쉬운 필드 주입보다 생성자 주입은 권장하는 이유는?
- 순환참조 방지해서 애플리케이션이 뻗어버리는 걸 방지
- final선언이 가능해서 불변성 확보