Spring

[ Spring ] 의존성 주입 방법 (feat.lombok)

인생은단짠단짠 2022. 11. 23. 13:51

 

여러 강의를 듣고, 참고자료를 찾아보며 사람들마다 의존성 주입 방법이 다른 것을 느낄 수 있었다. 

나는 지금까지 생성자를 이용해서 의존성 주입을 하고있었는데, 롬복을 활용한 방법을 보고 궁금증이 생겨 공부를 하고 이 글을 작성하게 되었다.

 

 

 

의존성 주입이란?

필요한 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아 사용하는 것이다.

이를 통해 객체간의 결합도를 줄이고 코드의 재활용성을 높일 수 있다.

 

 

 

 

의존성 주입의 3가지 방법

 

기본적으로 의존성 주입에는 3가지 방법이 있다.

 

  1. 생성자 주입
  2. 필드 주입
  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가지 중에서 생성자 주입 방식을 사용했던 이유는 더 안전하게 코드를 쓸 수 있기 때문이다.

 

 

생성자 주입 방법이 좋은 이유

  1. A가 B를 참조하고, B가 다시 A를 참조하는 순환 참조를 방지할 수 있다. 
  2. 생성자로 의존성을 주입할 때 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