● IoC(Inversion of Control ) : 제어 역전

 - 프로그램 흐름을 제어하는 주체가 개발자에서 다른 프로그램으로 바뀜

 - 스프링에서는 이 제어하는 주체가 스프링 컨테이너로 바뀜

 

DI(Dependency Injection) : 의존성 주입

 - IoC 구현방법 중 하나 (DL 과 DI 가 있음)

 - 객체가 다른객체에 의존하며 그 다른객체를 외부에서 생성해서 주입하는 것

 

① 의존성(Dependency) : 한 객체가 다른 객체를 내부에서 사용함.

Class Battery {}

Class ElectronicToy {
    private Battery battery;
    
    ElectronicToy() {
        battery = new battery();
    }
}

→ ElectronicToy 클래스에서 Battery 클래스를 사용함 ☞ ElectronicToy 객체는 Battery 객체에 의존관계이다.

    new 연산자를 통해 직접 객체를 만들고 있음.(강한 결합)

 

② 주입(Injection) : 외부에서 객체를 생성해서 넣어 주는 것

  1) 생성자를 이용한 주입

Class Battery {}

Class ElectronicToy {
    private Battery battery;
    
    ElectronicToy(Battery battery) {
        this.battery = battery;
    }
}

→ battery 객체를 외부에서 생성해서 ElectronicToy 클래스에 생성자를 이용해 주입하고 있음.

 

 2) setter를 이용한 주입

Class Battery {}

Class ElectronicToy {
    private Battery battery;
    
    ElectronicToy() {}
    
    public setBattery(Battery battery) {
        this.battery = battery;
    }
}

→ battery 객체를 외부에서 생성해서 ElectronicToy 클래스에 setter를 이용해 주입하고 있음.

 

In Spring

스프링에서는 클래스 간의 의존 관계를 미리 설정해 놓은 빈(Bean)설정 정보를 바탕으로 컨테이너가 자동으로 연결

  • 개발자들은 단지 빈 설정파일(=스프링컨테이너)에서 의존관계가 필요하다는 정보를 추가하면 됨
  • 객체 레퍼런스를 컨테이너로부터 주입 받아서, 실행 시에 동적으로 의존관계가 생성
  • 컨테이너가 흐름의 주체가 되어 어플리케이션 코드에 의존 관계를 주입

 

 

applicationContext.xml(스프링 컨테이너이면서 IoC 컨테이너) -> BeanFactory를 상속받음

- 빈을 만들고 빈 사이의 의존성을 엮어주며 그 빈을 제공해줌

- 의존성 주입은 스프링 IoC 컨테이너에 들어있는 빈 끼리만 가능함.

 

① 생성자를 이용한 의존 객체 주입 : constructor-arg 태그 사용

<beans ~~~~~~~>
    <bean id="studentDao" class="ems.member.dao.StudentDao" />	<!-- ems.member.dao.StudentDao studentDao = new ems.member.dao.StudentDao -->
    
    <bean id="registerService" class="ems.member.service.StudentRegisterService">
    	<constructor-arg ref="studentDao" />
    </bean>
    
    <bean id="modifyService" class="ems.member.service.StudentModifyService">
    	<constructor-arg ref="studentDao" />
    </bean>
    
    <bean id="deleteService" class="ems.member.service.StudentDeleteService">
    	<constructor-arg ref="studentDao" />
    </bean>   
 </beans>

→ 스프링 컨테이너 안에 4개의 bean이 있음. studentDao라는 빈이 나머지 3개의 Service빈에 주입되고 있음.

 

② setter를 이용한 의존 객체 주입 : property 태그 사용

<beans ~~~~~~~>
    <bean id="s" class="ems.member.dao.StudentDao" />	<!-- ems.member.dao.StudentDao studentDao = new ems.member.dao.StudentDao -->
    
    <bean id="registerService" class="ems.member.service.StudentRegisterService">
    	<property name="studentDao" ref="s" />		<!-- name에 프로퍼티를 적어줘야함 -->
    </bean>
    
    <bean id="modifyService" class="ems.member.service.StudentModifyService">
    	<property name="studentDao" ref="s" />
    </bean>
    
    <bean id="deleteService" class="ems.member.service.StudentDeleteService">
    	<property name="studentDao" ref="s" />
    </bean>   
 </beans>
<bean id="dataBaseConnectionInfoDev" class="ems.member.DataBaseConnectionInfo">
    <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe" />
    <property name="userId" value="scott" />		<!-- setUserId("scott") -->
    <property name="userPw" value="1111" /> 		<!-- setUserPw("1111") -->
</bean>

 

③ 일반 method를 통한 의존 객체 주입


● 자동주입 : @Autowired, @Resource

- 의존객체를 주입할 떄 <constructor-arg> or <property>태그를 사용하지 않고 자동으로 주입해주는 기능.

- setter역할을 하기 때문에 setter가 필요 X

- 자동 주입을 사용하기 위한 설정

  1. 스프링 컨테이너에 <context:annotation-config /> 추가

  2. <beans> 태그에 스키마속성 추가  <beans xmlns:context="www.springframework.org/schema/context">

- 생성자가 아닌 속성과 메서드에 사용시 디폴트생성자가 있어야함.

 

@Autowired

 - 객체의 타입이 일치하는 객체 자동 주입

 - 생성자, 속성, 메서드에 모두 사용 O

 

ex) WordRegisterService.java

public class WordRegisterService {

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

 

@Resource

 - 객체의 이름이 일치하는 객체 자동 주입(id or name)

 - 속성, 메서드에 사용 O, 생성자에는 사용 X

 

※ 동일 객체가 2개 이상일 경우 자동 주입 객체를 판단 못하면 Exception 발생.

  -> @Resource대신 @Autowired를 사용하기 위해서는 @Qualifier 사용(value를 이용하여 id부여해준다고 생각)

 

ex) applicationContext.xml

<beans ~~~~~~~>

    <bean id="wordDao1" class="ems.member.dao.wordDao">
    	<qualifier value="usedDao" />
    </bean>
    <bean id="wordDao2" class="ems.member.dao.wordDao"></bean>
    <bean id="wordDao3" class="ems.member.dao.wordDao"></bean>
    
    <bean id="registerService" class="ems.member.service.StudentRegisterService" />
   
    <bean id="searchService" class="ems.member.service.StudentModifyService" />
   
    
 </beans>
    
  
    

WordRegisterService.java

public class WordRegisterService {
    
    //둘 중 택1
    @Resource(name="wordDao1")
    private WordDao wordDao;
    
    @Autowired
    @Qualifier("usedDao")
    private WordDao wordDao;
    
    
    public WordRegisterService(WordeDao wordDao) {
    	this.wordDao = wordDao;
    }
    
}

'Framework > Spring' 카테고리의 다른 글

Spring MVC  (0) 2020.08.16
Spring JDBC  (0) 2020.08.02
Spring 모듈  (0) 2020.08.01
Java Configuration 사용  (0) 2020.04.17
요약  (0) 2020.04.09

+ Recent posts