0. 의존성 주입 (Dependency Injection)
Spring Framework에서는 필요한 클래스를 직접 생성하는 대신 XML이나 애너테이션을 이용해 객체를 주입하는 방식을 사용한다.
의존성 주입(Dipendency Injection)을 적용함으로써 얻을 수 있는 장점은 다음과 같다.
- 클래스 간 의존 관계의 최소화와 코드의 단순화
- 애플리케이션의 유지보수 용이
- 객체의 생성, 소멸, 객체 간 의존 관계를 개발자가 아닌 스프링 컨테이너 대신 처리
개발자가 직접 객체를 제어하지 않고 스프링이 담당하는 점에서 제어의 역전(Inversion of Control)이라고도 한다.
* 왜 의존성 주입인가?
우리는 특정 클래스에서 어떠한 클래스의 기능이 필요할 때 해당 클래스의 기능을 사용하기 위해 객체를 생성한다.
class MemberServiceImpl extends IMemberService{
IMemberDAO dao = MemberDAOImpl.getInstance();
}
클래스에서 다른 클래스 객체를 생성한다는 것은 해당 클래스가 작업에 필요하다는 의미이고, 다시 말해 이는 해당 클래스에 '의존'한다는 뜻이다.
클래스에 다른 클래스의 객체를 생성하므로써 의존 관계가 형성되고, 이 의존 관계를 약하게 만들어 유지보수 및 관리를 쉽게 만드는 것이 바로 의존성 주입이다.
1. XML 파일 생성
의존성 주입은 XML 파일에 클래스(빈) 간의 관계를 설정하는 것으로 수행할 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans
PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="memberService1" class="com.spring.ex03.MemberService1">
<property name="dao" ref="memberDAO"/>
</bean>
<bean id="memberService2" class="com.spring.ex03.MemberService2">
<constructor-arg ref="memberDAO"/>
</bean>
<bean id="memberDAO" class="com.spring.ex03.MemberDAO"/>
</beans>
| 속성 이름 | 설명 |
| id | 빈 객체의 고유 이름으로, 빈 id를 이용해 빈에 접근함. |
| name | 객체의 별칭 |
| class | 생성할 클래스. 패키지 이름까지 입력해야 함. |
| constructor-arg | 생성자를 이용해 값을 주입할 때 사용 |
| property | setter를 이용해 값을 주입할 때 사용 |
<bean> 태그의 id 속성과 class 속성을 통해 생성할 빈을 설정할 수 있다.
의존성 주입은 생성자 또는 setter 메서드를 사용해 수행할 수 있는데
생성자의 경우 <constructor-arg> 태그를,
setter의 경우 <property> 태그를 사용하면 된다.
<constructor-arg> 태그는 value 속성을 통해 필드 값을 주입하거나 ref 속성을 통해 다른 클래스(빈)을 주입할 수도 있다. ref를 통해 주입되는 클래스의 경우에도 <bean> 태그를 이용해 설정해두어야한다. 여기서 작성된 <constructor-arg> 태그는 작성한 순서대로 생성자의 파라미터로 넘어간다.
<bean id="personService" class="com.spring.ex02.PersonServiceImpl">
<constructor-arg ref="personDAO"/> <!-- ref의 값으로는 해당 빈의 id 값을 준다. -->
<constructor-arg value="홍길동"/>
<constructor-arg value="27"/>
</bean>
<bean id="personDAO" class="com.spring.ex02.PersonDAOImpl"/>
<property> 태그는 name 속성을 통해 주입할 필드명을 지정하고 내부에 <value> 태그를 작성하여 필드 값을 주입할 수 있다. 빈을 주입할 경우 <property> 태그의 ref 속성을 사용하면 된다.
<bean id="personService" class="com.spring.ex02.PersonServiceImpl">
<property name="dao" ref="personDAO"/> <!-- ref의 값으로는 해당 빈의 id 값을 준다. -->
<property name="name">
<value>홍길동</value>
</property>
<property name="age">
<value>27</value>
</property>
</bean>
<bean id="personDAO" class="com.spring.ex02.PersonDAOImpl"/>
2. XML 파일 읽어와 빈 생성하기
설정이 끝난 XML 파일은 ApplicationContext 인터페이스와 그 구현 클래스를 통해 읽어올 수 있다. 그리고 ApplicationContext 인스턴스가 생성되면서 XML 파일에 설정한 빈이 생성된다. 이렇게 생성된 빈은 getBean() 메서드를 사용해 가져올 수 있다.
ApplicationContext context = new ClassPathXmlApplicationContext("person.xml");
IPersonService service = (PersonServiceImpl) context.getBean("personService");
'Java > Spring Framework' 카테고리의 다른 글
| [Spring Framework] MyBatis 연동하기 (0) | 2023.01.19 |
|---|---|
| [Spring Framework] Eclipse 스프링 STS 설정하기 (0) | 2023.01.19 |
| [Spring Framework] @RequestParam 과 @ModelAttribute (0) | 2023.01.15 |
| [Spring Framework] 어노테이션을 이용한 페이지 구현 (0) | 2023.01.15 |
| [Spring Framework] 관점 지향 프로그래밍 (Aspect Oriented Programming) (0) | 2023.01.11 |