왜 @Autowired 대신에 @Resource를 쓸까?

Kevin·2024년 2월 7일
0

Spring

목록 보기
11/11
post-thumbnail
@Controller
public class DeviceController {

  @Resource(name = "XXXService")
	protected XxxService xxxService;

이번 글도 회사 코드를 보다가 생긴 궁금증을 풀어가기 위한 글이다.

의존성을 주입하는 코드들 중 기존 @Autowired나 생성자 주입이 아닌 @Resource 라는 어노테이션을 사용해서 의존성을 주입하는 코드가 있었다.

의존성을 주입하는 코드라는 것은 웹 서치를 통해 알게되었는데, 여기서 궁금한 것은 왜 굳이 @Autowired를 두고, @Resource를 사용했는지이다.

그러면 먼저 둘의 가장 핵심적인 차이점에 대해서 간략하게 알아보자.

@Autowired

먼저 @Autowired는 의존 객체의 타입을 기준으로 Bean 객체를 선택한다.

또한 Spring 전용 어노테이션이다. 즉 @Autowired 을 사용하기 워해서는 Spring이 전제가 되어야 한다.

Autowired 의 동작 순서는 아래와 같이 동작한다.

  1. Spring 컨테이너는 `@Autowired`가 적용된 필드, 생성자 또는 메서드 파라미터의 타입에 해당하는 빈(Bean)을 검색한다.
  2. 일치하는 빈이 하나만 있는 경우, 해당 빈을 주입한다. 하지만 여러 개의 빈이 있는 경우, 타입에 따라 자동으로 선택될 수 있다. 다음 조건에 따라 주입될 빈이 결정된다
    • 타입이 일치하는 빈이 하나만 존재하는 경우, 해당 빈이 주입된다.
    • 타입이 일치하는 빈이 여러 개 존재하는 경우, Spring은 해당 타입의 빈 중에서 @Primary 어노테이션이 지정된 빈을 우선적으로 선택한다.
      • 이 때 만약 @Primary 어노테이션이 지정되지 않은 경우, 예외가 발생한다.
    • @Qualifier 어노테이션을 사용하여 명시적으로 주입할 빈을 지정할 수 있다.
  3. 선택된 빈이 존재하고 주입될 빈이 필요한 객체의 생성 또는 초기화 시점에 해당 빈이 생성되고 초기화된다. 이 과정에서 해당 빈의 의존성도 재귀적으로 주입된다.
  4. 주입된 빈은 @Autowired가 적용된 필드, 생성자 또는 메서드 파라미터에 주입되어 사용된다.

@Resource

@Resource는 이름을 기준으로 Bean 객체를 선택한다.

또한 Java Specification Request 스펙의 일부로 Java에서 제공하는 어노테이션이다.

그렇기에 Spring이 아닌 다른 Java EE 컨테이너에서도 사용할 수 있다.

Resource의 동작 순서는 아래와 같이 동작한다.

  1. name 속성에 지정된 빈 객체를 찾는다.
  2. name 속성이 없을 경우 동일한 타입을 갖는 빈 객체를 찾는다.
    1. 이 때 동일한 타입을 갖는 빈 객체가 두 개 이상이면, 같은 이름을 가진 빈 객체를 찾는다.
    2. 이 때 동일한 타입을 갖는 빈 객체가 두 개 이상이고, 같은 이름을 가진 빈 객체가 없는 경우 @Qualifier를 이용해서 주입할 빈 객체를 찾는다.



위 차이점에서부터 알 분들은 다 아셨겠지만, @Resource를 사용하는 이유는 Spring 프레임워크에서 벗어나, Java EE 컨테이너나 Spring과 연동되는 경우에는, @Resource를 사용하는 것이 더 적절할 수 있다.

profile
Hello, World! \n

0개의 댓글