
여러 강의를 듣고, 참고자료를 찾아보며 사람들마다 의존성 주입 방법이 다른 것을 느낄 수 있었다.
나는 지금까지 생성자를 이용해서 의존성 주입을 하고있었는데, 롬복을 활용한 방법을 보고 궁금증이 생겨 공부를 하고 이 글을 작성하게 되었다.
의존성 주입이란?
필요한 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아 사용하는 것이다.
이를 통해 객체간의 결합도를 줄이고 코드의 재활용성을 높일 수 있다.
의존성 주입의 3가지 방법
기본적으로 의존성 주입에는 3가지 방법이 있다.
- 생성자 주입
- 필드 주입
- setter 주입
1) 생성자 주입
private DeveloperRepository developerRepository; //final로 선언 가능
@Autowired
public DMakerService(DeveloperRepository developerRepository) {
this.developerRepository = developerRepository;
}
클래스의 생성자가 하나이고, 그 생성자로 주입 받을 객체가 빈으로 등록되어있다면 @Autowired를 생략할 수 있다.
2) 필드 주입
필드에 @Autowried 어노테이션만 붙여주면 자동으로 의존성 주입이 된다.
@Autowired
private DeveloperRepository developerRepository;
- @Autowired(required = false)
: 필수적으로 주입할 대상인지에 대한 명시
(기본적으로 required 속성은 true로 되어있다. true인데 주입 안해주면 에러)
3) Setter 주입
setter 메서드에 @Autowired 어노테이션을 붙이는 방법으로, setter 에서드를 public으로 열어두어야 하기때문에 언제 어디서든 변경이 가능한 단점이 있다.
private DeveloperRepository developerRepository;
@Autowired
public void setDeveloperRepository(DeveloperRepository developerRepository) {
this.developerRepository = developerRepository;
}
이 3가지 중에서 생성자 주입 방식을 사용했던 이유는 더 안전하게 코드를 쓸 수 있기 때문이다.
생성자 주입 방법이 좋은 이유
- A가 B를 참조하고, B가 다시 A를 참조하는 순환 참조를 방지할 수 있다.
- 생성자로 의존성을 주입할 때 final로 선언할 수 있고, 이로 인해 런타임에서 의존성을 주입받은 객체가 변할일이 없어진다. (불변성)
이러한 이유로 생성자 주입 방법을 통해 코드를 작성하고 있었는데, 꽤 많은 강사님들과 블로그 글들이 lombok을 이용하더라고요?? 그래서 찾아봤습니다.
롬복을 사용한 생성자 주입
생성자 의존 관계 주입을 할 때 우리는 생성자 코드를 반드시 작성해야 한다.
그러나 만약, 생성자에 파라미터가 추가되어야 한다면 생성자를 계속 수정해줘야 할것이다.
이는 유지보수 측면에서 별로 좋지 않다..
그러나 lombok 라이브러리의 @RequiredArgsConstructor을 사용하면 알아서 final이 붙은 변수를 파라미터로 받는 생성자를 만들어주기 때문에, 기능은 다 제공되면서 아래와 같이 코드는 깔끔한, 보이지 않는 생성자 주입을 사용할 수 있다.
@RequiredArgsConstructor
public class DevleoperService{
private final DeveloperRepository developerRepository;
}
그렇다면 final이 들어간 기본 생성자를 자동으로 만들어주게 되는 이유가 뭘까?
-> final이 붙었다면, final이 붙은 친구는 무조건 존재해야 하기 때문이다! (나중에 바꾸는 것이 불가능하니까)
delombok 했을 때
delombok을 해보았더니 이렇게 생성자가 들어있는 것을 알 수 있다.
public DMakerService(DeveloperRepository developerRepository) {
this.developerRepository = developerRepository;
}
정리하면, 생성자 주입으로 인한 장점을 가지고, 생성자가 하나만 있으면 @Autowired를 생략할 수 있다는 점을 이용해 lombok을 사용하여 생성자까지 자동으로 추가시켜주는 것이다.
따라서 lombok을 사용하고 있다면 이런식으로 의존성을 추가하는 것도 괜찮은 것 같다!!
'Spring' 카테고리의 다른 글
| [ spring ] @Component 와 @Configuration (0) | 2022.12.16 |
|---|---|
| [ Spring ] 트랜잭션 (0) | 2022.12.12 |
| [ Spring ] Swagger이란 (0) | 2022.11.17 |
| [ Spring ] restTemplate (0) | 2022.11.11 |
| [spring] 어노테이션 (Annotaions) (0) | 2022.11.04 |