반응형

Lombok 을 활용한 Spring 의존성주입 방법을 알아보자 

 

학원에서 처음 spring 강의를 들을 때는 @Autowired 라는 어노테이션을 필드에 추가해 간편하게 의존성 주입을 할 수가 있다. 는 내용을 들었고 당시에 개발에 대한 이해가 부족했던지라 아 그렇구나하고 넘어가고 실무에서도 그런식으로 사용하고 있었다.

 

하지만 직장에서 동료분이 @Autowired 를 톻한 필드 주입이 아닌 생성자 주입을 통해 의존성을 주입하는 걸 보고 의문이 들어 물어보게 되었고 그 친구의 대답도 '요즘은 이렇게 한다' 라는 애매한 대답이 돌아온지라 내가 다시 파해쳐보기로 하였다.

 

결론은 동료분의 말대로 @Autowired 의 사용은 지양하고 생성자주입의 형태로 의존성을 주입 받는걸 권장하고 있다.

 

이유는 @Setter 어노테이션의 사용을 지양하고 Builder 형태로 데이터를 받는 이유와도 비슷한데 

final 객체로 생설할 수 없어 객체의 변경이 가능해지고 객체의 불변성이 보장되지 않기 때문이다.

 

또한 필드주입을 통한 방법은 런타임간 순환참조 문제를 감지할 수 없다. 생성자 주입은 생성자에 필요한 인자를 먼저 확인한 후 인자에 해당하는 Bean 을 생성하기 때문에 순환참조가 발생하는 경우 런타임 시 오류가 발생한다. 

 

이 생성자 주입을 간편하게 활용 할 수  있게 만들어 주는 어노테이션이 @RequiredArgsConstructor 이다.

 

아래는 @RequiredArgsConstructor 를 사용하지 않고 생성자 주입 코드를 모두 작성한 경우의 예시

 

@Controller
@RequestMapping("/test")
public class Example {

  private final FirstService firstService;
  private final SecondService secondService;
  private final ThirdService thirdService;
  
  @Autowired
  public Example(FirstService firstService, SecondService secondService, ThirdService thirdService) {
    this.firstRepository = firstRepository;
    this.secondRepository = secondRepository;
    this.thirdRepository = thirdRepository;
  }
}

 

 

아래는 @RequiredArgsConstructor 를 사용한 예시

 

@Controller
@RequiredArgsConstructor
@RequestMapping("/test")
public class Example {

  private final FirstService firstService;
  private final SecondService secondService;
  private final ThirdService thirdService;
  
  ...
}

 

 

훨씬 간결하게 표현이 가능하다

반응형