티스토리 뷰

Spring으로 개발을 하면 Spring에서 제공하는 Bean이나 개발자가 직접 생성한 Bean을 외부에서 주입받아야 하는경우가 많다. 이건 스프링의 핵심기술인 DI (Dependency Injection) 입니다.

 

스프링에서는 DI를 하기위해 @Autowired 어노테이션이라는걸 제공해주는데 간략히 설명하자면 필드, 생성자에 주로 사용되는데 해당 어노테이션을 선언해주면 스프링이 관리하는 Bean중에서 해당 타입의 Bean이 있다면 필드 또는 생성자 파라미터 주입해주는 어노테이션이다. 일단 @Autowired의 기본적인 동작과 예제코드를 한번 살펴보도록 합니다.

 

테스트할 Bean객체 생성

BeanConfig.java 파일에 TestBean이라는 타입의 Bean을 생성하여 setBeanName 메서드로 'test1' 이라는 값을 세팅해주었습니다.

 

테스트

@Autowired 어노테이션으로 해당 Bean을 주입받고 테스트 해본결과 정상적으로 Bean이 등록된 걸 확인할 수 있습니다.

 

동일 타입의 Bean을 여러개 생성

이번에는 동일한 TestBean 타입의 Bean을 추가로 정의하였습니다.

 

테스트 (2)

이번에는 예외가 발생되면서 테스트에 실패하였다. 어떤 예외가 발생되었는지 확인해보겠습니다.



예외메세지를 확인해보면 No qualifying bean of type'com.kjh.study.model.TestBean' available: expected single matching bean but found 2: testBean,testBean2라는 메세지가 나왔습니다.

 

예외메세지를 해석하면 TestBean 타입의 Bean을 DI 하는 과정에서 TestBean 타입의 Bean이 2개가 생성되어 어떤걸 주입해줘야 할지 모르기 때문 에 발생된 것입니다.

 

이렇게 동일한 타입의 Bean이 2개가 있을 때 원하는 Bean을 주입하는 방법은 2가지가 제공됩니다.

하나는 @Qualifier 어노테이션을 추가로 선언하여 해당타입의 Bean 이름을 방법입니다.

 

테스트 (3)

위 사진처럼 @Qualifier 어노테이션을 선언하여 어노테이션 인자에 해당 Bean이름을 적어주면
해당 이름과 일치하는 Bean을 주입시킬 수 있습니다.

 

두번째로는 사진은 없지만 @Bean으로 Bean 생성 시 @Primary 어노테이션으로 동일타입의 Bean들 중에서 주입우선순위를 지정해줄 수 있습니다.

 

동작순서

Spring은 Bean을 주입할 때 주입 우선순위가 정해져있습니다. 

1. Bean 이름

2. @Primary로 지정된 Bean

3. @Qualifer로 지정된 Bean

4. 해당타입의 Bean

 

위 순서대로 Bean을 주입합니다. 밑의 사진에서 계속이어가겠습니다.

 

현재 위 사진에는 TestBean 이라는 동일한 타입의 Bean이 정의되있는데 타입은 같지만 Bean 이름은
testBean, testBean2로 선언되어져 있습니다. 

참고 : 위처럼 메서드에 @Bean 어노테이션이 선언되있으면 해당 메서드의 이름이 Bean이름이 됩니다.

 

 

그리고 이렇게 @Qualifier 어노테이션으로 TestBean 타입의 Bean중 'testBean2' 라는 이름을 가진 Bean을 찾아
주입해주었습니다.

 

그런데 동일한 타입의 Bean이 2개이상 존재할 때 @Primary, @Qualifier을 쓰지않아도 주입시켜주는 방법은 있습니다.
그것은 Bean 이름과 필드의 변수명을 동일하게 작성해주면 됩니다, 즉 우선순위를 제일높게 잡아주면 됩니다.

 

테스트 (4)

TestBean 타입의 객체 2개를 주입받도록 코드를 작성하고 필드변수명을 Bean 이름과 동일하게 선언하고 테스트를 해보니 정상동작 되었습니다.

 

여기서 알 수 있는 사실은

1. 런타임에 동일한 타입의 Bean이 N개가 발생되어도 그 N개가 모두 필요로한 곳에 잘 주입이 되어주거나

2. @Primary, @Qualifier 어노테이션으로 특정 Bean을 지목해서 주입해준다면 정상적으로 구동되는걸 알 수 있습니다.

그 외 참고

Spring 4.3부터는 @Autowired 어노테이션이 없어도 생성자에 파라미터가 있으면 그 파라미터에 맞는 Bean을 주입시켜줍니다. 단 생성자가 여러개일 경우 @Autowired를 명시해줘야 합니다.

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함