Spring 개발일지(8) - 의존 객체의 선택
Spring 개발일지는 여러 절로 구성되어 있습니다.
- Spring 개발일지(1) - 기본적인 상식
- Spring 개발일지(2) - 개발환경 구축
- Spring 개발일지(3) - 스프링 프로젝트 생성
- Spring 개발일지(4) - 자바로 스프링 개발
- Spring 개발일지(5) - 의존성 주입(DI)
- Spring 개발일지(6) - 의존 객체 주입 방법
- Spring 개발일지(7) - 의존 객체 자동 주입
- Spring 개발일지(8) - 의존 객체의 선택
설명하기에 앞서
안녕하세요. 풀스택 개발자를 위해 달려나가는 김준호 입니다.
저번 시간에는
자동적으로 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 는 xmlid
를 가져오기 때문에 xml에서의 추가적인 작업은 필요없습니다.
/* RegisterService.java 파일입니다. */
@Inject
@Named(value="registerDAO")
RegisterDAO registerDAO;
// /* Autowired로 주석 처리 */
// RegisterService(RegisterDAO registerDAO) {
// this.registerDAO = registerDAO;
// }
//
이렇게 하면
@Inject
와@named
를 통하여 하나의 클래스를 여러 개의 빈으로 생성하여도 식별할 수 있습니다.
마무리
기본적인 spring 단계는 끝난 것 같습니다. 다음 시간부터는 간단한 MVC 웹 프로젝트를 만들어보겠습니다. 이러한 Spring Container를 기반이 기초로 있어야지 MVC 웹 프로젝트를 어렵지 않게 수행할 수 있습니다. 지금까지 했던 내용들을 다시 머리 속으로 잘 정리하고 있으시길 바라겠습니다.!!