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 기능을 이용해 빈을 생성/주입해 사용해보고, 객체에 대한 관리와 의존관계를 스프링이 관리한다 의 의미를 이해할 수 있어야 함
'WebApplication' 카테고리의 다른 글
Spring Framework_MVC (0) | 2022.12.27 |
---|---|
관점 지향 프로그래밍 AOP(Aspect Oriented Programming) (0) | 2022.12.25 |
[Spring] 스프링 MVC 트랜잭션(Transaction) 관리 (0) | 2022.08.07 |
[Spring] AOP 설정 및 Advice 적용(Pointcut > Before Advice) (0) | 2022.08.06 |
[Spring] REST방식의 데이터 전송(@ResponseBody) (0) | 2022.08.02 |