Spring 숙련주차/1주차

2. 같은 타입의 Bean이 2개라면?

note994 2024. 8. 21. 17:06

같은 타입 Bean 등록

food 패키지를 만들고 Food 인터페이스와 Chicken 클래스, Pizza 클래스를 만든다.

 

Food 인터페이스에 eat() 메서드를 선언한다.

 

Chicken Class
Pizza Class

Chicken 클래스와 Pizza 클래스에 각각 코드를 작성한다. 모두 Food 인터페이스를 implements 했다.

 

즉, Chicken과 Pizza는 같은 인터페이스의 구현체 클래스이다. 

 

그리고 @Component로 Bean으로 등록되었다는것을 알 수 있다.


테스트 해보기

Test 폴더에 BeanTest 파일을 만든다.

먼저 이렇게 코드를 작성한다. 그럼 Food를 Autowired 할 수 없다고 하는데 그 이유는 Food 타입으로 등록된 Bean이 2개 이상이기 때문이다.

 

즉, food에 Bean을 주입을 해줘야 하는데 같은타입의 Bean이 2개 이상이라 뭘 주입해줘야하는지 모르는것이다.


해결법1

등록된 Bean의 이름으로 변수를 선언한다.

이러면 pizza Bean을 등록해준다.

 

여기서 알 수 있는점은 @Autowired 애노테이션은 기본적으로 자료형(Food)을 기준으로 주입을 해준다는 것이다. 

 

Chicken과 Pizze는 다른 객체이다. 그러나 같은 타입의 Bean인 이유는 같은 인터페이스를 구현한 구현체이기 때문이다.

테스트 코드를 완성시키고 실행한다. 그럼 eat() 함수가 제대로 실행되는것을 볼 수 있다.


해결법2

Chicken 클래스

Chicken 클래스의 애노테이션으로 @Primary를 붙여주었다.

BeanTest 테스트 클래스

그리고 BeanTest로 가보면 Food food로 선언해도 오류가 발생하지 않는것을 알 수 있다. 기본적으로 chicken Bean을 주입하도록 @Primary를 이용했기 때문이다.


해결법3

Pizza 클래스

@Qualifier 애노테이션을 달아줬다. 이 애노테이션은 명칭이 필요하다.

 

BeanTest 테스트 클래스

그리고 그 @Qualifier 애노테이션을 복사해서 Food 타입의 변수에 달아주면 pizza Bean이 주입된다.


@Primary와 @Qualifier 중 Qualifier가 더 우선순위가 높다.

 

범용적으로 사용되는 Bean에는 @Primary를, 지엽적으로 사용되는 Bean에는 @Qualifier 애노테이션을 사용하는것이 좋다.