개발/Spring
Spring 프레임워크에서 Repository 주입 방법 (@Autowired, @Resource, @Inject)
피터JK
2025. 2. 1. 16:22
728x90
Spring 프레임워크에서 Repository 또는 Service 등을 주입할 때 여러 가지 방법이 있습니다.
대표적으로 @Autowired, @Resource, @Inject가 있으며, 각각의 차이점과 사용법을 정리해보겠습니다.
1. @Autowired (Spring 제공)
- @Autowired는 Spring에서 제공하는 의존성 주입(DI) 어노테이션입니다.
- 타입(Type) 기반으로 Bean을 검색하여 주입합니다.
- 기본적으로 주입 대상이 없으면 예외(NoSuchBeanDefinitionException)가 발생합니다.
✅ 사용법
1.1. 필드 주입 (비추천)
@Component
public class MyService {
@Autowired
private MyRepository myRepository;
}
❌ 비추천 이유: 테스트 및 유지보수가 어렵고, Mocking이 불가능함.
1.2. 생성자 주입 (추천)
@Component
public class MyService {
private final MyRepository myRepository;
@Autowired
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
}
✅ 추천 이유: final 키워드를 사용할 수 있어 불변성이 보장됨.
1.3. Setter 주입
@Component
public class MyService {
private MyRepository myRepository;
@Autowired
public void setMyRepository(MyRepository myRepository) {
this.myRepository = myRepository;
}
}
✅ 선택적 의존성 주입에 유용하지만, 불변성이 깨질 가능성이 있음.
2. @Resource (JDK 제공, Spring 지원)
- 이름(name) 기반으로 Bean을 검색하여 주입.
- name을 명시하지 않으면 필드 이름과 동일한 Bean을 찾고, 없으면 타입(Type) 기반으로 검색.
✅ 사용법
@Component
public class MyService {
@Resource
private MyRepository myRepository;
}
✅ Spring 독립적이므로 Java EE 환경에서도 사용 가능.
❌ 단점: @Autowired처럼 @Primary, @Qualifier 등을 활용할 수 없음.
3. @Inject (JDK 표준, Spring 지원)
- @Autowired와 유사하며, 타입 기반 주입을 수행.
- @Autowired(required = false)처럼 빈이 없어도 예외를 발생시키지 않게 하는 기능이 없음.
✅ 사용법
@Component
public class MyService {
@Inject
private MyRepository myRepository;
}
✅ JSR-330 표준을 지원하며, Spring에 의존하지 않음.
4. @Autowired vs @Resource vs @Inject 비교 정리
| 어노테이션 | 제공 주체 | 주입 방식 | 주입 대상이 없을 때 | 추가 기능 |
| @Autowired | Spring | 타입 기반 | 예외 발생 (기본) | @Primary, @Qualifier 지원 |
| @Resource | Java EE | 이름 기반 (없으면 타입) | 예외 발생 | name 속성으로 특정 빈 지정 가능 |
| @Inject | JSR-330 | 타입 기반 | 예외 발생 | @Qualifier 지원 (Spring 환경에서만) |
5. 결론 - 어떤 것을 사용할까?
✅ Spring 환경에서 @Autowired가 가장 일반적이고 추천됨
@Component
public class MyService {
private final MyRepository myRepository;
public MyService(@Qualifier("myRepositoryImpl") MyRepository myRepository) {
this.myRepository = myRepository;
}
}
✅ @Resource는 Spring이 아닌 Java EE 환경에서도 동작해야 할 때 고려
@Resource(name="myRepository")
private MyRepository myRepository;
✅ @Inject는 JSR-330 표준을 따르고 싶다면 사용 가능
@Inject
private MyRepository myRepository;
🚀 최종 정리
- @Autowired (추천): Spring 공식 지원, 타입 기반, @Qualifier, @Primary 지원.
- @Resource: Java EE 표준, 이름 기반, Spring 없이도 사용 가능.
- @Inject: @Autowired와 유사하지만, JSR-330 표준을 따름.
✅ Spring 프로젝트라면 @Autowired + 생성자 주입 방식을 사용하세요!
728x90