본문 바로가기

spring

생성자 자동 주입의 장점, @RequiredArgsConstructor

불변이다.

  • 의존관계를 설정하는 부분과 시스템을 돌아가게하는 부분은 분리되어야 한다. (CleanCode)
  • 변경 가능성을 최소화하라. (Effective Java)
  • 수정자 주입을 사용하려면 setter 를 public 으로 열어야한다.
  • 객체의 상태가 변경가능하면 문제가 생길 여지가 너무 많다.
  • 생성자 주입은 빈이 등록되기위해 싱글톤 객체가 생성될 때 딱 한번만 주입하고 변경하지 않는다.

 

테스트의 편함

  • 수정자 주입에서는 의존관계가 무엇이 있었는지 있긴 한지는 코드의 setter 를 까봐야한다.
  • 또한 런타임에 에러가 나게 된다.

  • 생성자 주입은 생성자의 매개변수로 주지 않으면 애초에 컴파일에러가 난다.
  • 또, IDE 의 도움을 받으면 코드 작성시 매개변수를 볼 수 있다.

 

final

  • 생성자 주입방식을 쓰면 final 을 쓸 수 있다.
  • 필드에 final 을 쓰면 생성자나 필드 선언시에 초기화를 해야한다. 안그러면 컴파일에러낸다.
  • 따라서 의존관계 주입 로직을 누락하는 실수를 방지할 수 있다.

 

 

 

앵간하면 생성자 주입을 쓰고, 특수한 상황에서는 setter(수정자) 주입을 쓰자.

필드 주입은 테스트하기 어려운 등 단점이 존재하여 Intellij 에서도 되도록 쓰지말라고 경고를 띄운다.

 

 

 

@RequiredArgsConstructor

롬복의 이 기능을 쓰면 final 이 붙은 필드로 생성자를 한개 만들어준다.

생성자가 하나만 있으면 @Autowired 가 자동으로 붙는 것을 이용할 수 있다.

 

생성자를 하나만 두고 @Autowired 를 생략하는 방법을 많이 쓰기 때문에,

롬복까지 이용하여 생성자를 하나 만드는 @RequiredArgsConstructor 어노테이션을 사용하면, 코드가 매우 깔끔해진다.

 

'spring' 카테고리의 다른 글

스프링 빈의 생명주기와 초기화 분리  (0) 2021.03.20
자동 주입시 빈이 2개 이상일 때 문제 해결  (0) 2021.03.19
@Autowired  (0) 2021.03.18
@ComponentScan  (0) 2021.03.18
DTO 는 어떻게 써야하나  (0) 2021.03.15