1️⃣ 필드 주입 (권장 X)
@Component
public class UserService {
@Autowired
private UserRepository userRepository;
}
✅ 장점: 코드 간결
❌ 단점:
DI 프레임워크 없이 테스트 어려움 (필드 직접 설정 불가)
불변성(immutable) 보장 안됨
Spring에 강하게 결합됨 (외부에서 변경 불가)
📌 → 필드 주입은 거의 쓰지 않는 게 좋음!
2️⃣ 세터 주입 (가급적 X)
@Component
public class UserService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
✅ 장점: 필요할 때만 의존성을 변경 가능
❌ 단점:
객체 생성 후에도 의존성이 바뀔 수 있어 불변성 보장 안됨.
의존성이 없으면 객체 생성이 실패할 수도 있음.
📌 → 보통 사용하지 않음. 특별한 경우에만 사용.
3️⃣ 생성자 주입 (💡 추천)
@Component
public class UserService {
private final UserRepository userRepository;
@Autowired // (Spring Boot 4.x부터는 생략 가능)
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
✅ 장점:
불변성 보장 (final 사용 가능)
Spring에 덜 의존적 (@Autowired 없어도 Spring Boot 4.x에서는 자동 주입됨)
테스트가 쉬움 (의존성을 직접 주입 가능)
📌 → 가장 권장되는 방식!
📌 private final + 생성자 주입 방식
@RequiredArgsConstructor
@Component
public class UserService {
private final UserRepository userRepository;
}
@RequiredArgsConstructor → 모든 final 필드에 대한 생성자 자동 생성
Spring Boot 4.x에서는 @Autowired 없이도 자동 주입됨
가장 깔끔한 코드 → 이 방식 추천!