본문 바로가기
Java/[스프링 5 프로그래밍 입문]

Dependency, DI, Assembler (의존, 의존 주입, 주입기) 개념 정리

2021. 7. 22.
반응형

스프링의 주요 특징 중 하나인 DI에 대해 알아보려고 한다. 스프링에 적용된 DI에 대해 배우기 전에 의존과 의존 주입이 무엇인지 알아보자. 객체 간의 의존은 변경 때문에 영향을 받는 관계이다. 이를 처리하는 방식에 의존 주입이 있으며, 주입기를 통해 의존성을 주입할 수 있다.

 

의존(dependency)과 의존 주입(DI: Dependency Injection)

  • 여기서 말하는 의존(dependency)은 객체 간의 의존이며, 변경에 의해 영향을 받는 관계를 의미한다. 즉 변경에 따른 영향이 전파되는 관계다.
  • 한 클래스가 다른 클래스의 메서드를 실행할 때 이를 의존한다고 표현한다. 예를 들어 클래스 A가 클래스 B의 메서드를 사용한다면, A가 B에 의존한다고 표현할 수 있다.

 

의존 처리 방식

그럼 이 의존 관계를 어떻게 처리하는지 두가지 방법을 알아보자.

 

1. 의존 대상 객체를 직접 생성하는 방식

public class A {
	private B b = new B();
}

의존 대상 객체를 직접 생성하는 방식을 알아보자. 위 코드를 보면 A 객체를 생성할 때 B 객체도 함께 생성된다. 직관적이고 쉽게 의존 관계를 생성할 수 있지만, 유지보수 관점에서 문제가 발생할 수 있다.

 

만약 A 뿐 아니라 C도 B에 의존한다면 의존 처리 방식은 다음과 같다.

public class C {
	private B b = new B();
}

 

이때 A와 C에서 B 클래스가 아닌 B를 상속받는 BB 클래스를 사용하게 된다면, 두 곳의 코드를 모두 변경해야 한다.

public class A {
	private B b = new BB();
}

public class C {
	private B b = new BB();
}

지금 예시에서는 두 곳의 코드만 변경했지만, B를 의존하는 객체가 늘어나면 그만큼 변경해야 하는 코드도 늘어나게 된다. 이 상황을 해결하기 위해서 DI(의존 주입)을 이용할 수 있다.

 

2. 의존 주입(Dependency Injection)을 통한 의존 처리

DI는 의존하는 객체를 직접 생성하는 대신 의존 객체를 전달받는 방식을 사용한다. A와 B 사이의 예를 DI를 이용하여 다시 표현하면 아래와 같다.

public class A {

	private B b;
    
	public A(B b){
		this.b = b;
	}
}

여기서는 의존 객체를 생성자를 통해서 주입하였다. 따라서 A 객체를 사용하는 위치에서 B 객체를 생성하여 A 객체에 주입한다. DI를 이용하면 의존 객체 변경의 유연함을 얻을 수 있다.

 

DI를 이용한 이 코드에서, 이전의 예시처럼 B가 아닌 BB 클래스를 사용하게 된다면 아래처럼 의존 객체를 생성하는 한 곳만 변경하면 된다.

// 변경 전
B b = new B();
A a = new A(b);
C c = new C(b);

// 변경 후
B b = new BB();
A a = new A(b);
C c = new C(b);

 

객체 조립기(Assembler)

앞서 작성한 코드처럼 객체를 생성하고 주입하는 코드를 main 메서드에 작성할 수도 있지만, 이 과정을 수행하는 클래스를 따로 작성하는 것이 더 좋다. 의존 객체를 주입한다는 것은 서로 다른 두 객체를 조립한다고 생각할 수도 있기에 이 클래스를 조립기(Assembler)라고도 표현한다.

public class Assembler{
	private B b;
	private A a;
	private C c;
	
	// B 객체를 생성하고 A, C 객체에 대한 의존을 주입한다.
	public Assembler(){
		b = new B();
		a = new A(b);
		c = new C(b);
	}
	
	public getB(){
		return b;
	}
	
	public getA(){
		return a;
	}
	
	public getC(){
		return c;
	}
}

위의 코드처럼 의존 대상 객체를 생성하고 주입하는 과정은 조립기가 수행하고, 이들 객체가 필요한 곳에서는 조립기 객체를 생성한 뒤 필요한 객체를 getter로 가져와 사용하면 된다.

 

 

지금까지 객체 사이의 의존 관계와 의존 주입의 의미 및 예제를 알아보았다. 의존 대상을 직접 생성하는 대신 의존 주입을 이용하면 유지보수가 편리해지는 장점이 있다. 다음에는 스프링에서 어떤 방식으로 의존 주입을 하는지 알아볼 것이다.

 

 

참고 서적: <초보 웹 개발자를 위한 스프링 5 프로그래밍 입문>

 

초보 웹 개발자를 위한 스프링5 프로그래밍 입문

COUPANG

www.coupang.com

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

728x90
반응형

댓글