Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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 31
Archives
Today
Total
관리 메뉴

Everything has an expiration date

[inflearn] 20240106 [스프링-프레임워크] - 10강 필기 본문

[Inflearn]/자바 스프링 프레임워크(renew ver.)

[inflearn] 20240106 [스프링-프레임워크] - 10강 필기

Jelly-fish 2024. 1. 8. 00:46

10강 - 의존객체 선택

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` 속성 값을 그대로 넣어주면 된다.