@Autowired
정의
@Autowired는 Spring에서 의존성 주입(DI)을 자동으로 수행하도록 지원하는 애너테이션이다.
@Autowired는 타입을 기준으로 Bean을 자동 연결하며, 같은 타입의 Bean이 여러 개 있으면 추가 지정이 필요할 수 있다.
📌 주요 역할
- 필요한 의존 객체를 타입 기준으로 자동 주입한다.
- 같은 타입의 Bean이 여러 개 있으면
@Qualifier로 구분할 수 있다. - 생성자, Setter, 필드에 적용할 수 있다.
📌 적용 위치
| 적용 위치 | 추천 정도 | 특징 |
|---|---|---|
| 생성자(Constructor) | ✅ 권장 | 불변성과 의존 관계가 명확하다. |
| Setter 메서드 | ⚠️ 주의 | 선택적 주입이나 재주입이 필요할 때 사용한다. |
| 필드(Field) | ❌ 비권장 | 테스트와 유지보수가 어렵다. |
🧩 의존성 주입 방식
Constructor Injection
- 가장 권장되는 방식이다.
- 불변성을 유지하기 쉽고, 필요한 의존성을 명확하게 드러낼 수 있다.
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
Setter Injection
- 의존성 재주입이나 선택적 주입이 필요할 때 사용할 수 있다.
@Service
public class UserService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
Field Injection
- 코드가 짧아 보이지만 유지보수와 테스트에 불리하다.
- 특별한 이유가 없다면 사용을 피하는 편이 좋다.
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
}
🔀 @Qualifier로 Bean 선택
- 같은 타입의 Bean이 여러 개 있을 때 명시적으로 선택한다.
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(@Qualifier("jdbcUserRepository") UserRepository userRepository) {
this.userRepository = userRepository;
}
}
📌 장점과 단점
장점
- 자동 주입이 편리하다
- 코드가 간결해진다
- 의존 관계를 쉽게 연결할 수 있다
단점
- 암묵적인 의존 관계가 생길 수 있다
- Field Injection은 테스트와 유지보수에 불리하다
📌 정리
@Autowired는 Spring의 대표적인 의존성 주입 애너테이션이다.- 생성자 주입이 가장 권장된다.
- 같은 타입 Bean이 여러 개일 때는
@Qualifier와 함께 사용한다.
댓글남기기