본문 바로가기
Spring

[Spring] 의존성 주입(Dependency Injection)

by jane.dev 2021. 9. 7.
반응형
의존성 주입(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) 메서드 호출