● 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 |