728x90
Spring에서 DI를 하는 방법에는 필드 주입, 생성자 주입, Setter 주입이 있다
intellij에서 필드 주입을 사용하면 “Field injection is not recommended” 요런 문구를 볼 수 있다
왜 필드 주입은 추천하지 않는 것일까?
왜 생성자 주입을 선호하는 것일까?
필드 주입의 단점
- final 키워드를 붙일 수 없음
- final은 선언 시 초기화를 해줘야하기 때문에 컴파일 에러 발생
- 따라서 immutable을 보장할 수 없음
- @Autowired private final QuestionRepository questionRepository; //compile error
- spring 컨테이너 외부에서 사용할 수 없음 == spring에 종속적
- 순수 자바 코드(@SpringBootTest 사용 X)로 테스트 작성할 경우, @Autowired가 작동하지 않게 되어 필드는 null이 됨
- 생성자 주입을 사용할 시 spring 컨테이너를 띄우지 않아도 테스트 가능함!!
- hidden dependency
- 필드 주입을 할 경우, 의존관계를 외부에 숨기게 됨
- 생성자 주입을 생각해보면, 파라미터를 통해 의존관계를 알 수 있음
Setter injection
- Setter injection은 dependency가 주입됐는지 여부를 보장받을 수 없음
- 생성자 주입은 모든 dependency가 주입될 때까지 객체가 생성되지 않음
- 해결방법
- @PostConstruct 사용 시 의존관계 주입이 완료되면 알려줌(콜백 메서드)
- 보안 위험(불변성 보장 X)
- setter 메서드를 사용하여 다른 dependency를 주입받을 수 있음
- Circular dependency
- 개체 간에 Circular dependency 발생할 수 있음
- 생성자 주입은 ObjectCurrentlyInCreationException을 반환함
생성자 주입
private final QuestionRepository questionRepository;
//@Autowired
public QuestionController(QuestionRepository questionRepository) {
this.questionRepository = questionRepository;
}
REFERECES
728x90
'Spring' 카테고리의 다른 글
@Scheduled를 사용하여 API를 주기적으로 호출 (0) | 2022.06.07 |
---|---|
MapStruct (0) | 2022.05.30 |
spring boot 2.6.x에 swagger 3.0 설정해보자(+수정 openapi 3.0 2022.05.30) (0) | 2022.05.11 |
JSON 변환 시 지연로딩에 따른 InvalidDefinitionException 에러 해결 (0) | 2022.04.17 |
HandlerMapping에서 order는 어디에 사용될까? (0) | 2022.03.11 |