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 [스프링-프레임워크] - 9강 필기 본문

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

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

Jelly-fish 2024. 1. 7. 23:28

 

09강 - 의존객체 자동 주입

9-1 의존객체 자동 주입이란?
9-2 @Autowired
9-3 @Resource

 

 9-1 의존객체 자동 주입이란?

스프링 설정 파일에서 의존 객체를 주입할 때

`<constructor-arg>` 또는 `<property>` 태그로

의존 대상 객체를 명시하지 않아도 스프링 컨테이너가 자동으로 필요한 의존 대상 객체를 찾아서

의존 대상 객체가 필요한 객체에 주입해 주는 기능이다.

구현 방법은 @Autowired 와 @Resource 어노테이션을 이용해서 쉽게 구현할 수 있다.

 

 

 

9-2 @Autowired

주입하려고 하는 객체의 타입이 일치하는 객체를 자동으로 주입한다.

 

`@Autowired` : 객체를 타입을 보고 자동으로 객체를 넣어준다.

 

`applicationContext.xml` 에서 `<constructor-arg>` 또는 `<property>` 태그를 사용하지 않고

 

아래처럼 `WordDao` 객체를 필요로 하는 생성자 위에`@Autowired` 어노테이션을 작성해 준다.

publc class WordRegisterService 
{
	private WordDao wordDao;
    
    @Autowired
    public WordRegisterService(WordDao wordDao)
    {
    	this.wordDao = wordDao;
    }

}

 

하지만, 위에서 처럼만 구성해서는 안 되고

`applicationContext.xml` 파일에서

`<context:annotation-config />` 라는 태그를 추가적으로 넣어 주어야 하는데...

이 과정에서도 `namespace`와 `schema`를 추가시켜 주어야 한다.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    [추가된 내용 ①]
    *************************************************************
	xmlns:context="http://www.springframework.org/schema/context"
    *************************************************************
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        [추가된 내용 ②]
        *************************************************************
 		http://www.springframework.org/schema/beans/spring-beans.xsd 
 		http://www.springframework.org/schema/context 
        *************************************************************        
        
 		http://www.springframework.org/schema/context/spring-context.xsd">
                                              *************************** 
                                              → /beans/spring-beans.xsd 에서 변경됨

	<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" />
	
	<bean id="registerService" class="com.word.service.WordRegisterServiceUseAutowired" />
	
	<bean id="searchService" class="com.word.service.WordSearchServiceUseAutowired" />
	
</beans>

 

 

단, 주의해야 할 사항은생성자에 `@Autowired` 속성을 부여할 때는 상관이 없지만

속성 변수나, 메소드에 넣어주고 싶을 때는 반드시 디폴트 생성자를 명시해 주어야 한다.

public class WordRegisterService
{
	@Autowired
    private WordDao wordDao;

	// ★ 반드시 디폴트 생성자 명시!
    public WordRegisterService()
    {
    }
    
    
    public WordRegisterService(WordDao wordDao)
    {
        this.wordDao = wordDao;
    }

    @Autowired
    public void setWordDao(WordDao wordDao)
    {
        this.wordDao = wordDao;
    }
}

 

    WordRegisterService 객체가 생성이 되어야 property나 메소드에서 wordDao를 가져올 수 있기 때문에...
    하지만 디폴트 생성자가 없이
    매개변수로 `WordDao` 파라미터를 받는 생성자만 존재할 경우,
    `wordDao`가 있어야만 WordRegisterService 객체를 생성할 수 있는데 
    `wordDao`를 찾을 수가 없으므로 에러가 발생하는 것이다.

 

9-3 @Resource

주입하려고 하는 객체의 이름이 일치하는 객체를 자동으로 주입한다.

 

 

`@Resource` : 스프링 컨테이너(IoC)에서 빈 객체 중에 객체의 이름이 동일한 객체를 찾아서

그 이름을 갖는 객체를 자동으로 주입해 준다.

 


`@Autowired` 와 `@Resource` 의 사용 가능 범위

 

구분 @Autowired @Resource
Property (프로퍼티)
Constructor (생성자)
Method (메소드)

 

 

publc class WordRegisterService 
{
	// ○ 프로퍼티에 사용 가능.
	@Resource 
	private WordDao wordDao;
    
    // Ⅹ!! @Resource는 생성자에 사용 불가능!
    @Resource 
    public WordRegisterService(WordDao wordDao)
    {
    	this.wordDao = wordDao;
    }
    
    // ○ 메소드에 사용 가능.
	@Resource 
    public void setWordDao(WordDao wordDao)
    {
        this.wordDao = wordDao;
    }

}