[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 |