Everything has an expiration date
[inflearn] 20240106 [스프링-프레임워크] - 10강 필기 본문
[inflearn] 20240106 [스프링-프레임워크] - 10강 필기
Jelly-fish 2024. 1. 8. 00:4610강 - 의존객체 선택
10-1 의존객체 선택
10-2 의존객체 자동 주입 체크
10-3 @Inject
10-1 의존객체 선택
동일한 데이터 타입의 객체가 2개 이상인 경우 스프링 컨테이너는
자동 주입 대상 객체를 판단하지 못해서 Exception 을 발생시킨다.
이때, 해결할 수 있는 것은 `@Qualifier` 어노테이션이다.
(* Qualifier : 예선 통과자, 우선자.)
즉, 이런 동일한 객체가 3개가 있을 때, 우선적으로 사용할 Bean 객체를 표시하기
위한 어노테이션이다.
[applicationContext.xml]
<context:annotation-config />
<bean id="wordDao" class="com.word.dao.WordDao">
<qualifier value="usedDao" />
</bean>
<bean id="wordDao2" class="com.word.dao.WordDao">
<bean id="wordDao3" class="com.word.dao.WordDao">
①
위와 같이, 똑같은 WordDao 타입의 객체가 wordDao, wordDao2, wordDao3 로
총 3개로 이루어져 있을 때 우선적으로 wordDao를 사용하려 한다면
`<bean>` 태그 사이에 `<qualifier>` 태그를 작성하고 `value="usedDao"`로 설정한다.
②
이후, WordDao 객체를 필요로 하는 클래스에서
WordDao 프로퍼티 변수 위에 어노테이션으로
`Qualifier("qualifier value 값")` → `Qualifier("usedDao")` 형식으로 작성해 주면
스프링 컨테이너에서 우선적으로 삽입해야 하는 의존객체를
`@Qualifier` 태그로 판단하여 자동으로 주입해 준다.
[WordRegisterService.java - WordDao 객체를 필요로 하는 클래스]
public class WordRegisterService
{
@Autowired
@Qualifier("usedDao")
private WordDao wordDao;
...
}
※ 바람직하지 않지만, 또 다른 방법으로는 다음과 같이
여러 개의 빈 객체를 applicationContext.xml 에 정의할 때
우선적으로 사용할 Bean 객체의 id를
WordDao 객체를 필요로 하는 클래스
`WordRegisterService.java`에서의 속성 변수명(프로퍼티 명)과 동일하도록 구성하면
`@Qualifier` 어노테이션을 쓰지 않고도
프로퍼티명과 동일한 bean id를 갖는 의존객체를 우선적으로 주입한다.
[applicationContext.xml]
<context:annotation-config>
<bean id="wordDao" class="com.word.dao.WordDao" />
<bean id="wordDao2" class="com.word.dao.WordDao" />
<bean id="wordDao3" class="com.word.dao.WordDao" />
[WordRegisterService.java - WordDao 객체를 필요로 하는 클래스]
public class WordRegisterService
{
@Autowired
private WordDao wordDao;
...
}
10-2 의존객체 자동 주입 체크
(스프링 설정 파일 - wordDao 빈 객체를 생성하지 않음.)
<!-- <bean id="wordDao" class="com.word.dao.WordDao"> -->
<bean id="registerService" class="com.word.service.WordRegisterServiceUseAutowired" />
<bean id="searchService" class="com.word.service.WordSearchServiceUseAutowired" />
(Java 파일)
@Autowired
private WordDao wordDao;
※ 스프링 설정 파일에서 wordDao Bean 객체를 생성해 주지 않았기 때문에
Exception 발생!!
위와 같이, WordDao 빈 객체를 생성하지 않으면
Java 파일에서 주입해 줘야 할 Bean 객체인 `WordDao` 가 생성되지 않았기 때문에
Exception이 발생한다.
↓
(스프링 설정 파일 - wordDao 빈 객체를 생성하지 않음.)
<!-- <bean id="wordDao" class="com.word.dao.WordDao"> -->
<bean id="registerService" class="com.word.service.WordRegisterServiceUseAutowired" />
<bean id="searchService" class="com.word.service.WordSearchServiceUseAutowired" />
(Java 파일)
@Autowired(required = false)
private WordDao wordDao;
bean 객체가 없을 경우에, Exception을 발생시키지 않는 방법은
`@Autowired` 어노테이션의 속성 중에 `required` 속성 값을 `false`로주면 된다.
`required = false`의 의미는
의존 객체가 있을 땐 주입을 하고, 없을 땐 주입을 하지 말라는 의미이다.
* 실제로 이렇게 코딩을 하는 경우는 거의 존재하지 않으므로 참고 수준으로 알아 두도록 하자.
10-3 @Inject
`@Autowired`와 거의 비슷하게 `@Inject` 어노테이션을 이용해서 의존 객체를 자동으로 주입을 할 수 있다.`@Autowired`와 차이점 이라면 `@Autowired`의 경우 required 속성을 이용해서 의존 대상 객체가 없어도 Exception 을 피할 수 있지만,`@Inject` 의 경우 required 속성을 지원하지 않는다.
즉, 의존 객체 Bean이 존재하지 않을 때에도 의존객체주입을 무조건적으로 시도하기 때문에Exception 이 발생한다는 것이다. 하지만 빈 객체가 없을 때 의존객체를 주입하는 시도를 웬만해서는 하지 않기 때문에`@Inject`는 `@Autowired`와 거의 동일한 어노테이션이라고 보아도 무방하다.
`@Autowired`가 일반적으로 실무에서 더 많이 쓰이는 방법이다.
[@Inject 어노테이션을 사용할 때, 빈 객체가 여러 개일 경우 우선적으로 사용할 빈 객체 지정하기]
[applicationContext.xml]
<context:annotation-config>
<bean id="wordDao1" class="com.word.dao.WordDao" />
<bean id="wordDao2" class="com.word.dao.WordDao" />
<bean id="wordDao3" class="com.word.dao.WordDao" />
[WordRegisterService.java - WordDao 객체를 필요로 하는 클래스]
public class WordRegisterService
{
@Inject
@Named(value="wordDao1")
private WordDao wordDao;
}
`@Named`의 value 속성에 applicationContext.xml 에서 작성한 여러 개의 bean 객체들 중
우선적으로 사용할`bean id` 속성 값을 그대로 넣어주면 된다.
'[Inflearn] > 자바 스프링 프레임워크(renew ver.)' 카테고리의 다른 글
[inflearn] 20240108 [스프링-프레임워크] - 12-1강 필기 (0) | 2024.01.08 |
---|---|
[inflearn] 20240106 [스프링-프레임워크] - 11강 필기 (1) | 2024.01.08 |
[inflearn] 20240106 [스프링-프레임워크] - 9강 필기 (0) | 2024.01.07 |
[inflearn] 20240106 [스프링-프레임워크] - 8강 필기 (0) | 2024.01.07 |
[inflearn] 20240106 [스프링-프레임워크] - 6 ~ 7강 필기 (0) | 2024.01.07 |