문득 프로젝트를 진행하다가 이런 생각이 들었다.
"왜 레포지토리나 서비스를 생성자로 처리하는 것일까?"
private final UserRepository userRepository;
public CustomUserDetailsService(UserRepository userRepository){
this.userRepository = userRepository;
}
궁금해서 찾아보니 세 가지 방식이 있었다.
1. @Autowired 생성자 주입
2. @RequiredArgsConsructor lombok 사용
3. 수동 생성자 주입
위 소스코드는 수동 생성자 주입 방법이고 세 가지 방법에서 효율차이가 있는지 살펴봤다.
근데 황당하게도 성능적인 차이는 실제로 없다고 한다.
@Autowired를 사용한 생성자 주입
- 장점:
- 간단하고 짧은 코드로 의존성 주입 가능
- 빠른 개발에 유용
- 단점:
- 불변성을 보장할 수 없고, final 필드를 사용할 수 없음
- 의존성 주입이 명시적이지 않아 코드 가독성이 떨어짐
- 테스트가 어려울 수 있음
@Component
public class MyService {
private final MyRepository myRepository;
@Autowired // 명시적으로 @Autowired를 사용
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
/*
@Autowired
private MyRepository myRepository;
이 방법은 불변성을 보장할 수 없기 때문에 사용 지양
*/
}
@RequiredArgsConstructor를 사용한 생성자 주입
- 장점:
- 코드가 간결해지고, final 필드로 불변성 보장
- 생성자 주입을 자동으로 처리하여 코드 길이 감소
- 단점:
- Lombok 라이브러리 의존성이 추가됨
- Lombok을 모르거나 이해하지 못하는 개발자에게는 불편할 수 있음
@Component
@RequiredArgsConstructor // Lombok을 사용하여 생성자 자동 생성
public class MyService {
private final MyRepository myRepository;
}
수동 생성자 주입 (수동으로 생성자 작성)
- 장점:
- 의존성이 명시적으로 보이고, 불변성 보장
- 의존성 주입이 명확하게 드러나므로 가독성 좋음
- 단점:
- 코드가 길어질 수 있음
- 반복적인 코드 작성이 필요해짐 (특히 의존성이 많을 경우)
@Component
public class MyService {
private final MyRepository myRepository;
// 생성자를 수동으로 작성
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
}
필자는 @RequiredArgsConstructor 방식을 가장 선호하는데 (짧을수록 좋다는 생각)
처음 스프링 부트를 공부한다면 수동 생성자 주입 방식이 가장 좋다고 생각한다.
점점 개발을 진행할 수록 lombok에 대한 내용을 파악하게 된다면
자연스레 @RequiredArgsConstructor 방식으로넘어가지 않을까 한다
'Java > 공부' 카테고리의 다른 글
효율적인 리팩토링을 위한 전략 (0) | 2025.01.24 |
---|---|
자바 컬렉션 프레임워크 종류와 사용 사례 (0) | 2025.01.23 |