본문 바로가기

WebApplication

Spring 의존성 주입(DI) / 제어의 역전(IOC )

DI(의존성주입) : 객체에 대한 관리와 의존 관계를 개발자가 직접 코드로 작성하여 설정하는 것이 아니라, XML이나 어노테이션을 이용해 객체를 주입하고 객체들간의 의존 관계를 맺어주어 결합도를 낮춤 (스프링이 객체를 제어하도록 함 : IOC)

> DI로 IOC 기능을 구현하므로 DI라는 용어를 주로 사용

public class BoardServiceImpl implements BoardService {
	private BoardDAOImpl dao;
	
	public BoardServiceImpl(BoardDAOImpl dao) {
		this.dao = dao;
	}
}

// 객체 생성 시점에 생성자 호출시, 외부에서 (파라미터로)주입받는 객체로 클래스 멤버변수를 초기화 함

 

> 스프링에서 생성자를 통한 객체 주입시 사용하는 @Autowired 어노테이션 기능의 내부 구조라 볼 수 있음

> new 연산자  사용해서 객체 생성하는 것이 아니라, 생성자를 호출할 때 주입되는 객체로 BoardDAOImpl 참조변수 초기화 (DI 적용 예시)

> 스프링에서는 의존 객체를 컨테이너 실행시 주입하기 때문에 Dependency Injection 이라 부름

각 클래스 객체를 bean 이라 부르는데, bean에 대한 의존 관계 설정은 xml파일에서 <bean>태그로 설정해두고 /  스프링 관리 대상 객체로 구분하기 위한 @어노테이션을 사용하여 설정하는 방식을 함께 사용

 

스프링에서의 의존객체(bean) 주입 방법

 

    bean : 스프링 실행 시 사용하는 클래스 객체(인스턴스)

    setter 주입

public class BoardServiceImpl implements BoardService {
	private BoardDAOImpl dao;

	public void setDao(BoardDAOImpl dao) {
		this.dao = dao;
	}
    
    @Override (ex/ BoardService 인터페이스에서 override한 메서드라 가정)
    public void sayHello() {
    	System.out.println("name :: " + name);
	}
	
}

// setter 메서드를 이용해 컨테이너에서 생성된 BoardDAOImpl 객체를 주입
setter 주입시 xml 파일 설정
// 기본형 데이터를 빈의 속성값으로 직접 주입해서 사용하는 예시
<beans>
	<bean id="boardServiceImpl(참조변수명)" class="com.pro.yoon.BoardServiceImpl(실제 참조하는 클래스)">
		<property name = "name(필드명)">
		<value>setter 테스트 (객체 생성시 초기화 하려는 값)</value>
	</bean>      
<beans>        


public static void main(String[] args) {
		boardServiceImpl.sayHello();
	}
}
        
        // 출력 결과 
        // name :: setter 테스트 
        // 이렇게 xml에 설정해둔대로 bean에 대한 객체를 생성하고 사용할 수 있음
        

// 의존관계에 있는 빈을 속성값으로 주입해서 사용하는 예시
// service 클래스에서 DAO클래스를 빈주입하여 사용하는 경우

<beans>
	<bean id="boardServiceImpl(참조변수명)" class="com.pro.yoon.BoardServiceImpl(실제 참조하는 클래스)">
		<property name = "boardDAO(필드명)" ref :: "boardDAO"> // xml 파일에서 ref와 같은 이름을 가지는 bean 클래스를 참조
	</bean>      
    <bean id="boardDAO" class="com.pro.yoon.BoardDAOImpl"/>
<beans> 

// id가 boardDAO인 빈을 BoardDAOImpl을 이용해 만듬
// setter 주입 방식으로 id가 boardDAO인 빈을 boardServiceImpl 속성에 주입함

 

생성자 주입 

생성자 주입시 xml 파일 설정
<beans>
	<bean id="boardServiceImpl1(참조변수명)" class="com.pro.yoon.BoardServiceImpl(실제 참조하는 클래스)">
		<constructor-arg value= "생성자 주입 테스트"/>
	</bean>      
   	<bean id="boardServiceImpl2(참조변수명)" class="com.pro.yoon.BoardServiceImpl(실제 참조하는 클래스)">
		<constructor-arg value= "생성자 주입 테스트2"/>
		<constructor-arg value= "테스트 메세지 입니다"/>
	</bean>      
<beans> 

// 빈주입 타입이 기본형이 아닌 참조형일 경우 ref 속성을 이용해 주입해야 함

// 위와 같이 인자 한개인 생성자와 인자 두개인 생성자를 각각 설정
// 인자 한개인 생성자 호출시 첫번째 설정대로 bean객체를 생성하고 
// 인자 두개인 생성자로 호출시 두번째 설정대로 값을 초기화하여 객체를 생성함

 

// 결론

(new 연산자를 사용하지 않고) 스프링의 DI 기능을 이용해 빈을 생성/주입해 사용해보고, 객체에 대한 관리와 의존관계를 스프링이 관리한다 의 의미를 이해할 수 있어야 함