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;
...
}
훨씬 간결하게 표현이 가능하다
'BE > Java' 카테고리의 다른 글
yml ? properties? (0) | 2024.05.23 |
---|---|
Spring Security 6.1 이상 csrf 설정 방법 (0) | 2024.03.27 |
Spring JPA - update 로직 수행 (0) | 2024.03.26 |
[빡침주의] server application 설정 파일이 원복되는경우;; (1) | 2024.03.22 |
WebClient 로 외부 API 호출 시 301 에러 (0) | 2024.03.14 |