@Autowired는 어디에 쓰는 게 좋을까?@Autowired는 Spring의 의존성 주입(DI, Dependency Injection)을 위한 어노테이션으로, Spring 컨테이너가 자동으로 빈(Bean)을 주입하도록 도와줍니다. 하지만 무조건 @Autowired를 사용하는 것이 아니라, 올바른 위치에서 사용해야 코드의 유지보수성과 테스트 용이성이 좋아집니다.
@Autowired를 사용할 수 있는 곳Spring에서 @Autowired를 사용할 수 있는 대표적인 위치는 다음과 같습니다.
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
}
final로 만들 수 없으므로, 단위 테스트 시 의존성을 직접 주입하기 어렵다. 📌 필드 주입은 가능한 한 지양하고, 생성자 주입을 권장합니다.
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired // 생략 가능
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
✔ 불변성 유지: final 키워드를 사용하여 의존성이 변경되지 않도록 할 수 있다.
✔ 테스트 용이: 단위 테스트 시 new UserService(mockUserRepository) 형태로 주입할 수 있다.
✔ Spring 4.3+에서는 @Autowired 생략 가능: 생성자가 하나만 있는 경우, 자동으로 주입된다.
✔ 순환 참조 방지: 애플리케이션 실행 시 순환 참조가 발생하면 에러가 발생하여 즉시 확인 가능하다.
📌 Spring 공식 문서에서도 "생성자 주입을 기본으로 사용하라"고 권장합니다.
@Service
public class UserService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
✅ 선택적 의존성: 필수적인 의존성이 아닐 경우 사용 가능
✅ 런타임 동안 변경 가능: 동적으로 다른 구현체를 주입해야 하는 경우 유용
❌ 불변성을 보장하지 못함: final을 사용할 수 없어, 객체가 변경될 가능성이 있음
📌 테스트 목적이나, 특정 상황(예: 조건부 주입)에서만 사용하고 기본적으로 생성자 주입을 사용하세요.
@Autowired를 쓰는 게 가장 좋을까?| 주입 방식 | 사용 예 | 장점 | 단점 | 권장 여부 |
|---|---|---|---|---|
| 필드 주입 | @Autowired private UserRepository userRepository; | 코드가 간결 | 테스트 어려움, 순환 참조 위험 | ❌ (비추천) |
| 생성자 주입 | public UserService(UserRepository userRepository) | 불변성 유지, 테스트 쉬움 | 코드 길어짐 (하지만 의미 있음) | ✅ (권장) |
| 세터 주입 | @Autowired public void setUserRepository(...) | 선택적 주입 가능 | 불변성 없음, 유지보수 어려움 | ⚠ (특정 경우에만) |