자바생
Published 2022. 5. 2. 19:48
Filed Injection을 지양하자! Spring
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

disadvantage of setter injection

728x90
profile

자바생

@자바생

틀린 부분이 있다면 댓글 부탁드립니다~😀

검색 태그