웹/Spring

[Spring] @Autowired

킹형준 2025. 2. 10. 01:24
 

[Spring] Spring Bean

[Spring] DI란?강한 결합 vs. 느슨한 결합A 클래스의 함수에서 B 클래스의 함수를 호출할 때를 생각해보자.A 클래스 내에서  b.f() 처럼 호출하려면 B 클래스를 레퍼런스 하기 위한 필드를 가져야 한다

brothergiven.tistory.com

앞선 포스팅에서 Spring에서 지원하는 3가지 의존성 주입의 방법은 의존성을 주입할 때(생성자, 세터, 필드) @Autowired 애노테이션을 붙임으로써 사용할 수 있다고 하였는데, 이에 대해 더 자세하게 알아보자.

 

ApplcationContext 객체 생성, @ComponentScan(Stereotype Annotation 또는 @Configuration 클래스)를 통해 IoC 컨테이너에 빈을 등록했다. 해당 빈에 @Autowired를 지정해놓았다면 Spring은 IoC 컨테이너에 등록된 다른 빈을 찾아 의존성을 자동으로 주입해준다. 기본 빈 조회전략은 타입의 같은 빈을 찾아서 자동으로 주입해주며, 생성자(또는 필드, 세터) 파라미터 개수 즉 해당 빈이 가지는 의존성의 개수에 관계없이 전부 자동으로 주입해준다.

 

이 때 타입이 같은 빈이 컨테이너에 여러 개 존재한다면 어떻게 될까? 

컴파일 에러가!

위 예시 코드의 경우 OrderServiceImpl 구현체에 DiscountPolicy 타입의 할인 정책을 받고있는데, 컨테이너가 여기에 어떤 빈을 읜존성으로 주입해야 할 지 모른다고 컴파일 에러를 띄워버린다.

 

이 경우 해결 방법은

1. @Autowired 필드 명 매칭

@Autowired 가 사용된 코드에 필드 명을 등록하려는 빈의 이름으로 설정해준다. @Autowired 매칭은 타입으로 먼저 매칭을 시도한 다음 결과가 2개 이상이라면 필드 명(또는 파라미터)과 빈 이름을 매칭시킨다.

 

2. @Qualifier

필드 또는 빈 이름에 추가 구분자를 붙여준다. 빈 등록 시에도 주입을 위한 구분자를 붙여줄 수 있고, 그럴 필요 없이 필드 앞에만 빈 이름으로 구분자를 줄 수도 있다. 예시로 보자

fixDiscountPolicy 빈은 의존성 주입 시 중복이 있다면 "mainDiscountPolicy"로 구분된다. @Qualifier가 없는 빈의 경우 의존성 주입시 @Qualifier("빈 이름")의 형식으로 해도 됨.

 

이런 식으로

RateDiscountPolicy 빈은 구분자 설정이 되어있지 않고 rateDiscountPolicy의 이름으로 빈 등록이 되어있는 상태였다.

 

3. @Primary

@Autowired시 여러 빈이 매칭되면 @Primary가 우선권을 가진다.

@Qualifier는 매우 상세하게 의존성 주입시 빈을 매칭 시킬 때 사용한다. @Primary는 해당 빈 자체에 우선순위를 주는 것이며 두 애노테이션이 겹칠 경우 @Qualifier가 높은 우선순위를 가진다.

 

' > Spring' 카테고리의 다른 글

[Spring] 빈 생명주기 콜백  (0) 2025.02.10
[Spring] 싱글톤 컨테이너  (0) 2025.02.10
[Spring] Spring Boot  (0) 2025.02.08
[Spring] Spring JDBC  (0) 2025.02.08
[Spring] Spring Bean  (0) 2025.02.08