우선 Spring의 의존성 주입 방법은 세 가지입니다.
- 필드 주입
- setter 주입
- 생성자 주입
1
2
3
4
5
|
@Service
public class ProblemService {
@Autowired
private ProblemRepository problemRepository;
}
|
cs |
먼저 필드 주입입니다.
필드 바로 위에 @Autowired를 붙입니다.
1
2
3
4
5
6
7
8
9
|
@Service
public class ProblemService {
private ProblemRepository problemRepository;
@Autowired
public void setProblemRepository(ProblemRepository problemRepository) {
this.problemRepository = problemRepository;
}
}
|
cs |
다음은 setter 주입입니다.
setter 메소드 바로 위에 @Autowired를 붙입니다.
1
2
3
4
5
6
7
8
9
|
@Service
public class ProblemService {
private final ProblemRepository problemRepository;
@Autowired
public ProblemService(ProblemRepository problemRepository) {
this.problemRepository = problemRepository;
}
}
|
cs |
마지막 생성자 주입입니다.
생성자를 통해서 의존성을 주입하고, @Autowired를 붙입니다. (Spring 4.3버전 부터는 어노테이션은 생략해도 됩니다.)
1
2
3
4
5
|
@Service
@RequiredArgsConstructor
public class ProblemService {
private final ProblemRepository problemRepository;
}
|
cs |
그리고 lombok에서 제공하는 @RequiredArgsConstructor 어노테이션을 사용할 수 있습니다.
이러면 코드가 없더라도 생성자 주입을 자동으로 해줍니다.
저는 과거에 @Autowired를 주로 사용했었습니다.
단지 간단하고 편하다는 이유만으로 사용을 했으며, 이 방법의 문제점에 대해 생각하지 않았습니다.
현재, Spring에서는 "생성자 주입" 방법을 권장한다고 합니다.
필드 주입의 단점
우선 이용한 필드 주입은 @Autowired 어노테이션으로 의존성 주입을 남발할 수 있습니다.
그로 인해 생성자의 매개변수도 많아지고, 단일 책임 원칙에 위배될 수 있다고 합니다.
또한 final 사용이 불가능해서 변할 수 있는 객체 (mutable)라는 단점도 있습니다.
setter 주입의 단점
setter 메소드는 public으로 열려있어 객체가 변경될 가능성이 존재합니다.
실제로 변경이 있는 경우는 드물다고는 하지만 가능성이 있다는 것부터 단점입니다.
객체의 불변성 확보
필드 주입, setter 주입 모두 객체가 변할 수 있다고 언급하였습니다.
생성자 주입은 final 사용이 가능하고, 객체 생성 시 한 번 호출되므로 객체의 불변성을 확보할 수 있습니다.
@RequiredArgsConstructor 어노테이션은 final을 강제합니다.
객체가 final으로 생성되기 때문에 클래스 생성 시 초기값이 세팅이 되고, 변하지 않습니다. (immutable)
결론은 필드, setter 주입의 단점을 보완하는 생성자 주입을 쓰자였습니다.
'Spring' 카테고리의 다른 글
SpringBoot Redis 연동 (0) | 2022.12.27 |
---|---|
SpringBoot OAuth 적용 [Naver - 2] (0) | 2022.10.18 |
SpringBoot OAuth 적용 [Naver - 1] (0) | 2022.10.17 |
SpringBoot OAuth 적용 [Kakao - 2] (0) | 2022.10.17 |
SpringBoot OAuth 적용 [Kakao - 1] (0) | 2022.10.14 |