@Autowired, @Inject, @Resource 차이

알비레오·2025년 7월 28일

자바

목록 보기
13/17

1. @Autowired

Spring 프레임워크에서 제공(CDI/JSR-330 표준X)
타입을 기준(타입 매칭)으로 의존성 주입
생성자, 필드, 메서드, Setter 주입 가능
기본적으로 required=true (빈이 없으면 예외 발생, @Autowired(required = false)로 선택적 주입 가능)
Qualifier와 함께 사용해 이름 지정 가능

@Autowired
private UserService userService;

@Autowired(required = false)
private ItemService itemService; // 없어도 무관

장점/특징:
Spring에서 가장 많이 사용
타입 중심 매칭, 같은 타입이 여러 개면 @Qualifier로 빈명 지정

2. @Inject

자바 표준 의존성 주입 어노테이션(JSR-330)
내부적으로는 @Autowired와 거의 동일하게 동작 (Spring에서 사용할 때)
required=false 옵션 없음 (Optional 등으로 주입 조건 완화 가능)
Qualifier와 함께 이름 명시 가능

@Inject
private UserService userService;

@Inject
@Qualifier("mainItemService")
private ItemService itemService;

장점/특징:
표준에 의존(다른 DI 프레임워크로의 이식성 有)
일부 선택적 의존성 주입은 Java 8의 Optional로 처리(별도의 required 옵션 없음)

3. @Resource

Java EE(구 J2EE) 표준 어노테이션(JSR-250)
빈 이름(이름 기반 매칭)이 우선, 없으면 타입 매칭
required 옵션 없음
Setter, 필드, 메서드 모두 사용 가능
디폴트로 필드명과 동일한 빈을 먼저 찾음

@Resource
private UserService userService; // 빈 이름 'userService' 먼저 매칭, 없으면 타입 매칭

@Resource(name = "mainItemService")
private ItemService itemService; // 이름으로 주입

장점/특징:
이름 기반 매칭 우선(이름이 다르면 원하는 빈이 안 주입될 수 있음)
XML, 레거시 환경이나 도메인 별 매칭 상황에서 사용

4. 정리

0개의 댓글