728x90
@Resource, @Autowired, @Inject는 모두 의존성 주입(DI)을 위한 어노테이션이지만,
작동 방식, 지원 프레임워크, 객체 검색 방식 등에서 차이점을 가지고 있습니다.
구분 | @Resource | @Autowired | @Inject |
지원 프레임워크 | Java | Spring | Java, Spring |
객체 검색 방식 | 이름 기반 (기본), 타입 기반 (선택) | 타입 기반 | 타입 기반 |
필드 설정 | setter, 필드 | setter, 생성자, 필드 | setter, 생성자, 필드 |
널 허용 | 허용 (기본), @Required 사용 시 필수 | 불허용 | 불허용 |
스프링과의 연동 | 별도 설정 필요 | 기본 제공 | 별도 설정 필요 (선택) |
사용 시점 | 초기화 후 | 객체 생성 시점 | 초기화 후 또는 객체 생성 시점 |
@Resource
- Java에서 제공하는 어노테이션으로, 스프링 프레임워크에 종속적이지 않습니다.
- 기본적으로 이름 기반으로 객체를 검색하지만, @Qualifier 어노테이션을 함께 사용하면 타입 기반 검색도 가능합니다.
- setter 메서드와 필드에만 사용할 수 있으며, 생성자에 사용할 수 없습니다.
- 널 값을 허용하는 기본 설정이지만, @Required 어노테이션을 사용하면 필수로 설정할 수 있습니다.
- 스프링 프레임워크를 사용하지 않는 경우 또는 객체 이름으로 주입해야 하는 경우에 유용합니다.
- 찾는 순서 : 이름 → 타입 → @Qualifier → 실패
- name 속성의 이름을 기준으로 찾습니다. 없으면 타입, 없으면 @Qualifier 어노테이션의 유무를 찾아 그 어노테이션이 붙은 속성에 의존성을 주입한다.
- <context:annotation-config/> 구문을 꼭 xml 설정파일에 추가해야한다.
@Required
- 필수 의존성을 명시하는 데 사용됩니다.
- 의존성이 주입되지 않으면 컴파일 시점 오류가 발생합니다.
- Setter 메서드 및 생성자에만 사용할 수 있습니다.
- 애플리케이션이 필수적으로 의존하는 객체가 주입되지 않으면 작동하지 않을 경우 사용합니다.
- 의존성 누락으로 인한 오류를 컴파일 시점에 발견하고 싶을 경우 사용합니다.
@Qualifier
- 자동 DI 시 특정 빈을 선택하는 데 사용됩니다.
- 동일한 타입의 여러 빈이 존재할 때 유용합니다.
- 필수 의존성을 명시하는 데 사용할 수도 있지만, @Required 어노테이션만큼 강력하지는 않습니다.
- Setter 메서드, 생성자, 필드에 사용할 수 있습니다.
- 동일한 타입의 여러 빈이 존재하고 특정 빈을 사용하고 싶을 경우 사용합니다.
- 예를 들어, "prod" 프로파일에서 "prodDataSource" 빈을, "dev" 프로파일에서 "devDataSource" 빈을 사용하도록 설정할 수 있습니다.
- @Autowired 어노테이션과 함께 사용하여 자동 DI 시 더욱 정밀하게 제어하고 싶을 경우 사용합니다.
@Autowired
- 스프링 프레임워크에서 제공하는 어노테이션으로, 스프링 프레임워크를 사용할 때 기본적으로 사용됩니다.
- 타입 기반으로 객체를 검색하며, setter 메서드, 생성자, 필드에 사용할 수 있습니다.
- 널 값을 허용하지 않으므로, 주입될 객체가 반드시 존재해야 합니다.
- 스프링 프레임워크에서 의존성 주입을 가장 간편하게 수행할 수 있도록 설계되었습니다.
- 찾는 순서 : 타입 → 이름 → @Qualifier → 실패
- @Autowired는 주입하려고 하는 객체의 타입이 일치하는지를 찾고 객체를 자동으로 주입한다. 만약에 타입이 존재하지 않는다면 @Autowired에 위치한 속성명이 일치하는 bean을 컨테이너에서 찾는다. 그리고 이름이 없을 경우 @Qualifier 어노테이션의 유무를 찾아 그 어노테이션이 붙은 속성에 의존성을 주입한다.
- <context:annotation-config/> 구문을 꼭 xml 설정파일에 추가해야한다.
@Inject
- Java에서 제공하는 어노테이션이며, 스프링 프레임워크와 별도로 설정하면 사용할 수 있습니다.
- @Autowired와 동일하게 타입 기반으로 객체를 검색하며, setter 메서드, 생성자, 필드에 사용할 수 있습니다.
- 널 값을 허용하지 않아, 주입될 객체가 반드시 존재해야 합니다.
- 스프링 프레임워크를 사용하지 않거나, @Autowired보다 명확한 코드를 작성하고 싶을 때 사용할 수 있습니다.
- 찾는 순서 : 타입 → @Qualifier → 이름 → 실패
- @Aurowired와 동일하게 작동하지만 찾는 순서가 다릅니다.
- @Inject를 사용하기 위해서는 maven이나 gradle에 javax 라이브러리 의존성을 추가해야한다.
참고 출처 : https://velog.io/@sungmo738/Resource-Autowired-Inject-%EC%B0%A8%EC%9D%B4
728x90
'STUDY > SpringLegacy' 카테고리의 다른 글
[Spring] @Autowired null 문제 해결 (필드 주입 사용 시) (0) | 2024.06.10 |
---|---|
[Spring] Bean 등록하는 다양한 방법 (1) | 2024.05.21 |
[Spring] [JS] SSE (Server-Sent Events) 사용하기 (0) | 2024.05.21 |
[Spring] Log4j2 설명 (0) | 2024.04.29 |
[Spring] Log4j2 사용해 상세한 SQL 쿼리 로그 출력 설정 (0) | 2024.04.29 |