-
스프링 4.0 - DI(Dependency Injection) : 의존성 주입 - 수동 설정웹프로그래밍/spring 2018. 7. 10. 13:03
의존(Dependency)
클래스에서 어떤 기능을 실행하기 위해서 또 다른 클래스(또는 타입)를 필요로 하는 것
다수의 클래스에서 의존하는 객체를 직접 생성하는 방식은 개발 효율을 떨어트린다.
DI(의존성 주입) : 의존 객체를 외부(Assembler)에서 조립
의존성 주입이란? 클래스에서 의존 객체를 직접 생성하지 않고 외부로부터 전달 받는 것.
조립기에서 B객체를 생성해서 A클래스에 연결(의존성 주입)한다. 스프링 프레임 워크의 DI와 동일하다.
스프링 DI에서 의존 객체를 전달하는 방식은 생성자 방식과 프로퍼티 설정 방식으로 나뉜다.
조립기 클래스 생성자 코드에서 필요한 객체를 생성한다.
조립기 클래스의 생성자에서 의존할 객체를 생성하고 그 객체를 리턴하는 메소드를 포함한다.
다른 클래스에서 조립기 클래스의 객체를 생성하면서 생성자 안에 담겨 있던 의존 객체가 생성되고
그 객체를 리턴하는 메소드로 의존 객체를 사용할 수 있다.
추후 의존 객체가 수정되어도 조립기 클래스의 코드만 수정하면 된다.
스프링 DI 컨테이너, 조립기
스프링은 객체를 생성하고 연결해주는 조립기 역할을 한다.
GenericXmlApplicationContext는 조립기 기능을 구현한 클래스이다. (스프링 3.0부터 추가 됨)
XML 파일에 정의된 설정 정보를 읽어와 객체를 생성하고 연결 한뒤 내부적으로 보관한다.
그래서 '객체 컨테이너' 라고도 부른다.
아래 코드로 config.xml 파일에서 bean으로 등록된 객체를 getBean()에 bean id 값을 넣어서 가져오고
클래스 내에서 사용할 수 있다.
마찬가지로 프로퍼티 설정/생성자 방식 2가지가 있다.
AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:/config/config.xml");
클래스타입 변수명 = ctx.getBean("xml의 Bean id", 클래스타입.class);
※위 getBean() 메소드의 첫번째 파라미터를 생략되어도 자동으로 클래스 타입명으로 xml파일에 bean객체를 찾는다.
1. 프로퍼티 설정 방식
의존 객체를 전달받기 위해서 set메소드를 이용한다.
xml에서 설정한 프로퍼티 이름과 일치하는 set메서드를 사용해서 값을 설정한다.(프로퍼티 첫글자를 대문자로 변환)
bean 객체의 경우 <ref>태그 사용
<bean id="user1" class="spring4.chap02.User">
<constructor-arg value="abcd"/>
<constructor-arg value="1234"/>
</bean>
<bean id="user2" class="spring4.chap02.User">
<constructor-arg value="efgh"/>
<constructor-arg value="1234"/>
</bean>
<bean id="userRepository" class="spring4.chap02.UserRepository">
<property name="users">
<list>
<ref bean="user1"/>
<ref bean="user2"/>
</list>
</property>
</bean>
public void setUsers(List<User> users) {
for (User u: users)
userMap.put(u.getId(), u);
}
<bean id="authFailLogger" class="spring4.chap02.AuthFailLogger">
<property name="threshold" value="2"/>
</bean>
private int threshold;
public void setThreshold(int thresold) {
this.threshold = thresold;
}
2. 생성자 방식
생성자 방식은 객체를 생성하는 시점에 의존 객체를 파라미터로 전달 받는다.
bean 태그의 순서가 전달되는 파라미터의 순서이다. index,name 속성으로 명시적 지정도 가능하다.
<bean id="user1" class="spring4.chap02.User">
<constructor-arg value="abcd"/>
<constructor-arg value="1234"/>
</bean>
public class User {
private String id;
private String password;
public User(String id, String password) {
this.id = id;
this.password = password;
}
c(생성자)와 p(프로퍼티) 네임스페이스
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c" 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">
'웹프로그래밍 > spring' 카테고리의 다른 글
스프링4.0 - Validator / Errors / BindingResult로 객체 검증 : 에러 메시지 (0) 2018.07.17 스프링4.0 - AOP : @Aspect 기반 (0) 2018.07.16 스프링4.0 - AOP 기초 (0) 2018.07.15 스프링 4.0 - DI : 의존성주입 자동 연결 (0) 2018.07.10 스프링3.0 - Database 연동하기 (0) 2018.07.03