728x90
의존성 주입(DI, Dependency Injection)
의존성은 하나의 객체가 다른 객체의 상태에 따라 영향을 받는 것을 의미한다. 의존성과 주입을 결합해서 생각하면 '객체가 필요한 특정 객체를 외부에서 밀어 넣는다'는 의미가 된다. 즉, 어떤 객체가 필요로 하는 의존관계에 있는 다른 객체를 스프링 컨테이너가 생성하여 주입하는 것이 의존성 주입(DI)이다.
스프링에서는 ApplicationContext
가 필요한 객체들을 생성하고, 필요한 객체들을 주입하는 역할을 해준다. ApplicationContext가 관리하는 객체들을 빈(Bean)이라 하고, 빈과 빈 사이의 의존관계를 처리하는 방식으로 ① XML 설정, ② 어노테이션 설정, ③ JAVA 설정 방식을 이용할 수 있다.
XML 기반 설정 방법
1. 의존하는 객체를 전달받을 생성자/set메서드 작성
2. 설정파일에 태그를 이용하여 설정
3. IoC Container 생성 (ApplicationContext)
4. 빈 얻어오기 (getBean)
생성자 이용 방식 - 태그 이용
- 생성자를 이용한 의존관계 설정
- 클래스에 생성자를 지정
- 의존하는 객체를 생성자를 통해 전달
// 의존하는 객체(UserDAO)를 전달받을 생성자를 작성
public class UserService {
UserDAO dao;
public int num;
public UserService(UserDAO dao, int num) {
this.dao = dao;
this.num = num;
}
// UserDAO 에 특정 list를 반환해주는 함수 list()가 있다고 가정
public List<String> list() {
return dao.list();
}
}
<!-- Spring Bean Configuration File -->
<!-- 빈 등록 -->
<bean id="dao" class="com.dao.UserDAO"/>
<bean id="service" class="com.service.UserService">
<constructor-arg name="dao" ref="dao" />
<constructor-arg name="num" value="10" />
</bean>
설정파일에 <constructor-arg>
태그를 이용하여 설정
- 주입할 데이터 값이 기본형(int, float, ...)이나 문자열(string)일 경우 value 속성 사용
- 주입할 데이터 값이 객체인 경우 ref 속성 사용
// Main
public class UserMain {
public static void main(String[] args) {
// IoC Container 생성
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/config/user.xml");
// 빈 얻기
UserService service = ctx.getBean("service", UserService.class);
List<String> list = service.list();
System.out.println(list);
System.out.println(service.num);
}
}
생성자 이용 방식 - namespace 이용
<bean id="" class="" c:생성자의변수명="값" c:생성자의변수명-ref="값" />
<bean id="dao" class="com.dao.UserDAO"/>
<bean id="service" class="com.service.UserService"
c:dao-ref="dao" c:num="100"
set 메서드 이용 방식 - 태그 이용
- setXXX 메서드를 이용한 의존관계 설정 방식
- 클래스에 set 메소드를 지정
- 의존하는 객체를 set 메서드를 통해 전달
// 의존하는 객체를 전달받을 setter 메서드를 작성
public class UserService {
UserDAO dao;
public int num;
public void setDao(UserDAO dao) {
this.dao = dao;
}
public void setNum(int num) {
this.num = num;
}
// UserDAO 에 특정 list를 반환해주는 함수 list()가 있다고 가정
public List<String> list() {
return dao.list();
}
}
<!-- 빈 등록 -->
<bean id="dao" class="com.dao.UserDAO"/>
<bean id="service" class="com.service.UserService">
<property name="dao" ref="dao" />
<property name="num" value="50" />
</bean>
설정파일에 <property>
태그를 이용하여 설정
- 주입할 데이터 값이 기본형(int, float, ...)이나 문자열(string)일 경우 value 속성 사용
- 주입할 데이터 값이 객체인 경우 ref 속성 사용
set 메서드 이용 방식 - namespace
<bean id="" class="" p:set메서드명="값" p:set메서드명-ref="값" />
<bean id="dao" class="com.dao.UserDAO"/>
<bean id="service" class="com.service.UserService"
p:dao-ref="dao" p:num="40" />
총 정리 ✨
스프링에서 의존성 주입(DI)
1) 태그 이용
- 생성자 이용
<bean id="" class="" >
<constructor-arg name="" value="값" />
<constructor-arg name="" ref="값" />
</bean>
- set 메서드 이용
<bean id="" class="">
<property name="" value="" />
<property name="" ref="" />
</bean>
2) namespace 의 속성 이용
- 생성자 이용
<bean id="" class="" c:생성자변수명="값" c:생성자변수명-ref="값" />
- set 메서드 이용
<bean id="" class="" p:set메서드명="값" p:set메서드명-ref="값" />
728x90
'WebServer > Spring' 카테고리의 다른 글
[Spring] BeanFactoryPostProcessor를 이용한 설정 메타데이터 정의 (0) | 2023.09.13 |
---|---|
[Spring] 빈 생명주기(LifeCycle) 콜백 메서드 (0) | 2023.09.12 |
[Spring] 의존성 주입(DI, Dependency Injection) - ② 어노테이션 설정 (0) | 2023.09.12 |
[Spring] 컬렉션 의존성 주입 (0) | 2023.09.04 |
[Spring] Spring 개요 (0) | 2023.08.30 |