- 필드 주입
- 생성자 주입
- setter 주입
1. 필드 주입 (@Autowired 사용)
@Service
public class MyService {
@Autowired
private MyRepository myRepository;
public String getData() {
return myRepository.fetch();
}
}
장점
- 코드가 간결하다.
단점
- final 키워드 사용 불가 (불변성 떨어짐).
- 테스트 시 mock 객체 주입이 어렵다. (테스트 어려움)
- 순환 참조 문제를 컴파일 타임에 잡기 힘듦.
2. 생성자 주입
@Service
public class MyService {
private final MyRepository myRepository;
// 생성자 하나 → @Autowired 생략 가능 (Spring 4.3 이상)
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
public String getData() {
return myRepository.fetch();
}
}
장점
- final로 불변성 보장.
- 테스트 시 주입이 쉬움 (생성자 파라미터로 mock 객체 주입 가능).
- 순환 참조 시 컴파일 타임에 오류를 파악하기 쉬움.
- 코드 명시성이 좋아서 협업 시 가독성도 좋음.
단점
- 생성자에 인자가 많을 경우 코드가 길어진다 (but, RequiredArgsConstructor로 보완 가능)
3. setter 주입
@Service
public class MyService {
private MyRepository myRepository;
@Autowired
public void setMyRepository(MyRepository myRepository) {
this.myRepository = myRepository;
}
public String getData() {
return myRepository.fetch();
}
}
장점
- 의존성을 나중에 변경할 수 있어 옵셔널한 의존성에 유리함.
- 테스트나 프레임워크 내부에서 동적으로 주입하고 싶은 경우 사용.
단점
- final 사용 불가.
- 객체가 생성된 이후 주입되므로, 주입이 안 될 위험도 있음.
항목 | 필드 주입 | 생성자 주입 | 세터 주입 |
사용 편의성 | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
테스트 용이성 | ❌ 어려움 | ✅ 좋음 | 보통 |
불변성 보장 (fianl) | ❌ 불가능 | ✅ 가능 | ❌ 불가능 |
순환 참조 잡기 | ❌ 어려움 | ✅ 쉬움 | ❌ 어려움 |
선택적 주입 | ❌ 어려움 | ❌ 어려움 | ✅ 가능 |
스프링 권 | ❌ | ✅ 권장 | 특정 상황에 가능 |
728x90
'Java' 카테고리의 다른 글
[Java] int와 Integer과 null (0) | 2025.05.03 |
---|---|
[Java] 시간 초과 (0) | 2025.05.03 |
[Java] RuntimeException (0) | 2025.05.03 |
[Java] Queue의 add/offer, remove/poll, element/peek 의 차이 (0) | 2025.05.03 |
[Java] 접근 제어자 (0) | 2025.05.03 |