/ SPRING

Spring 개발일지(8) - 의존 객체의 선택

Spring 개발일지는 여러 절로 구성되어 있습니다.


설명하기에 앞서

안녕하세요. 풀스택 개발자를 위해 달려나가는 김준호 입니다.
저번 시간에는 자동적으로 Spring DI(Dependecy Injection)주입하는 방법에 대해 알아보았습니다..
오늘은 주입 객체가 동일한 것이 여러개 일 때 선택하는 방법에 대해 알아보겠습니다.


자동 주입 선택

우리는 의존하는 객체를 자동으로 주입할 때 @AutoWired와 @Resource를 배웠습니다.
@AutoWired에서는 식별을 Class로 한다고 하였는데 하나의 클래스를 여러개의 빈으로 생성한다면 당연히 스프링에서는 에러가 뜨게 되겠죠.
이것을 해결하는 방법은 아래 2가지 종류로 제안하고 있습니다.

@Qualifier

@Inject


@Qualifier

<!-- ApplicaionContext.xml 파일입니다. -->
    <!--... 생략 -->
    <bean id="registerDAO" class="dao.RegisterDAO"></bean>
    <bean id="registerDAO1" class="dao.RegisterDAO"></bean>
    <bean id="registerDAO2" class="dao.RegisterDAO"></bean>
    <!--... 생략 -->
    <bean id="registerService" class="service.RegisterService"/>

우리가 만약 여러개의 bean 객체를 생성하고 그 bean 객체를 AutoWired로 넣는다고 가정해봅시다. 이 처리는 당연하게 에러가 나오게 됩니다.
그래서 여러개의 같은 클래스를 식별하기 위해서는 아래와 같은 @Qualifier 작업이 필요합니다.

<!-- ApplicaionContext.xml 파일입니다. -->
    <!--... 생략 -->
    <bean id="registerDAO" class="dao.RegisterDAO">
     <qualifier value="firstRegDao"></qualifier>
    </bean>
    <bean id="registerDAO1" class="dao.RegisterDAO"></bean>
    <bean id="registerDAO2" class="dao.RegisterDAO"></bean>
    <!--... 생략 -->
    <bean id="registerService" class="service.RegisterService"/>
    /* RegisterService.java 파일입니다. */
    @Autowired
    @Qualifier("firstRegDao")
    RegisterDAO registerDAO;
    
//	/* Autowired로 주석 처리 */
//	RegisterService(RegisterDAO registerDAO) {
//		this.registerDAO = registerDAO;
//	}
//	

이렇게 하면 @Qualifier 를 통하여 하나의 클래스를 여러 개의 빈으로 생성하여도 식별할 수 있습니다.


@Inject

@Inject 속성은 사실 @Autowired@Resource나 마찬가지로 자동 주입을 위한 어노테이션입니다.
하지만 개발자 분들은 많이 Autowired 혹은 Resource로 넘어가고 있는 추세이고 Inject를 많이 사용하지 않는 것 같습니다.. (저만의 뇌피셜..)
이것도 Resource와 같이 id로 식별할 수 있는데 식별하기 위해서는 @named 어노테이션을 사용합니다. 사용법은 다음과 같습니다.

<!-- ApplicaionContext.xml 파일입니다. -->
    <!--... 생략 -->
    <bean id="registerDAO" class="dao.RegisterDAO"></bean>
    <bean id="registerDAO1" class="dao.RegisterDAO"></bean>
    <bean id="registerDAO2" class="dao.RegisterDAO"></bean>
    <!--... 생략 -->
    <bean id="registerService" class="service.RegisterService"/>

우리가 만약 여러개의 bean 객체를 생성하고 그 bean 객체를 Inject 넣는다고 가정해봅시다. 이 처리는 당연하게 에러가 나오게 됩니다.
그래서 여러개의 같은 클래스를 식별하기 위해서는 아래와 같은 @Named 작업이 필요합니다. @Named 는 xml id를 가져오기 때문에 xml에서의 추가적인 작업은 필요없습니다.

    /* RegisterService.java 파일입니다. */
    @Inject
    @Named(value="registerDAO")
    RegisterDAO registerDAO;
    
//	/* Autowired로 주석 처리 */
//	RegisterService(RegisterDAO registerDAO) {
//		this.registerDAO = registerDAO;
//	}
//	

이렇게 하면 @Inject@named 를 통하여 하나의 클래스를 여러 개의 빈으로 생성하여도 식별할 수 있습니다.


마무리

기본적인 spring 단계는 끝난 것 같습니다. 다음 시간부터는 간단한 MVC 웹 프로젝트를 만들어보겠습니다. 이러한 Spring Container를 기반이 기초로 있어야지 MVC 웹 프로젝트를 어렵지 않게 수행할 수 있습니다. 지금까지 했던 내용들을 다시 머리 속으로 잘 정리하고 있으시길 바라겠습니다.!!