의존성 주입(DI, Dependency Injection)
객체지향 프로그래밍에서 다른 객체를 사용한다는 것은 다른 객체에 의존한다는 의미와 같음
다른 객체를 사용하기 위해서 객체를 직접 생성하거나 생성된 객체를 할당 받아 사용
직접 생성
A 객체가 new 키워드를 이용해 B 객체와 C 객체를 직접 생성하여 사용(= A는 B와 C의 기능에 의존)
객체의 생성부터 소멸까지 라이프사이클의 전반을 개발자가 관리하므로 강한 결합
예시
Singer 클래스
public class Singer{
public void sing(){
System.out.print("가수가 노래를 합니다.");
}
}
Stage 클래스
public class Stage {
private Singer singer;
public Stage(Singer singer) {
this.singer = singer;
}
public void stage() {
System.out.print("무대에서 ");
singer.sing();
}
}
Broadcast 클래스
public class Broadcast {
private Stage stage;
public Broadcast(Stage stage) {
this.stage = stage;
}
public void broadcast() {
System.out.print("방송에 송출될 ");
stage.stage();
}
}
Main 메서드에서 사용
public class MainJava {
public static void main(String[] args) {
Singer singer = new Singer();
Stage stage = new Stage(singer);
Broadcast broadcast = new Broadcast(stage);
broadcast.broadcast();
}
}
각 객체를 생성해 생성자를 이용하여 다른 객체를 입력받아 메서드 호출
생성된 객체 할당
A객체가 외부에 이미 생성된 B 객체와 C 객체를 요청하면 외부에서 B 와 C 객체를 A에 주입
→ 여기서 A 가 요청한 객체를 생성하고 의존 주입을 관리하는 컨테이너가 스프링이 이 역할을 함
이를 개발자 입장에서 객체를 관리하는 역할이 스프링이라는 컨테이너로 넘어갔다는 것을 IoC(Inversion of Control, 제어의 역전)
이미 생성된 객체를 주입받아 사용만하므로 약한(느슨한) 결합
예시
bean-container에 특정 클래스 파일을 삽입하기 위한 두가지 방법이 있는데,
1. xml 파일을 이용한 클래스 수동 지정
2. context 네임스페이스를 활용한 컴포넌트 스캔지정
→ 아래 사용할 방식은 일단 1번
객체 생성을 bean-container에 요청(→ xml 파일_root-context.xml을 활용하여 객체를 등록)
외부 패키지에 속한 파일을 사용하기 위해서 beans 태그 내부에 작성
<!-- class 속성은 '패키지 경로.클래스명' 으로 작성 -->
<bean id="singer" class="com.test.controller.di.classfile.Singer"></bean>
<bean id="stage" class="com.test.controller.di.classfile.Stage">
<constructor-arg ref="singer"/>
</bean>
<bean id="broadcast" class="com.test.controller.di.classfile.Broadcast">
<constructor-arg ref="stage"/>
</bean>
하단의 Beans Graph 탭에서 확인 가능
+ root-context.xml 하단 탭에 Beans Graph 탭이 없을 때
root-context.xml 우클릭 - Spring - Add as Bean Configuration
추가된 Beans Graph
작성하고 나면 Spring에서 관리되는 파일의 표시인 S를 확인할 수 있음
Main 메서드에서는 bean container에서 완성된 객체를 받아와 실행
→ 사용하는 객체는 GenericXmlApplicationContext
public class MainSpring {
public static void main(String[] args) {
GenericXmlApplicationContext context
= new GenericXmlApplicationContext
("file:src/main/webapp/WEB-INF/spring/root-context.xml");
Broadcast.broadcast = context.getBean("broadcast", Broadcast.class);
broadcast.broadcast();
context.close();
}
}
root-context.xml 이라는 bean container를 지정했기 때문에 해당 객체를 사용 가능
context 객체를 이용해 getBean("bean이름(id속성)", 자료형.class)
메서드 호출
'Spring' 카테고리의 다른 글
[Spring] 커넥션 풀(Connection Pool) 설정 (0) | 2021.09.12 |
---|---|
[Spring] Oracle DB 연결 테스트 (0) | 2021.09.11 |
[Spring] Maven repository 외부 라이브러리 추가 (0) | 2021.09.10 |
[Spring] Maven 의존성 관리와 pom.xml (0) | 2021.09.09 |
[Spring] 컴포넌트 스캔(component-scan) (0) | 2021.09.08 |