본문 바로가기
Spring

Dependency Injection ( DI )

by Coarti 2023. 6. 13.

( 스프링 사용 방법이 아닌 개념에 관한 글입니다. )

 

종속성 주입 == 부품조립

A 클래스의 필드로 C클래스를 가질 때

C는 A의 부품이라고 표현할 수 있다.

 

또 C 부품을 2가지 관계로 분류할 수 있는데

1. 일체형 조립관계

2. 조립형 부품관계

 

아래 코드를 보자

 

public class A { // Composition has a : 일체형 관계
	private C c;

	public A() { // 객체가 생성될 때 C를 생성하여 자신이 가진다
		this.c = new C();
	}
	
	public A(C c) {
		this.c = c;
	}
}
public class B { // Association has a : 조립형 관계
	private C c;

	public B() {	}

	public void setC(C c) { // setter를 통해 세팅하여 사용
		this.c = c;
	}
}
public class C {	}

A 클래스의 기본생성자를 보자

A의 객체가 만들어질때 C가 생성되어 자신이 가져가는 형태가 보인다

따로 때어낼수 없기에 일체형 관계로 볼 수 있다

 

B클래스를 보자

클래스가 생성되고 난 후에 setter를 통해 C 부품을 받아서 사용하는 형태가 보인다

이를 조립형 관계로 볼 수 있다

 

이렇게 되면 A클래스는 사용자가 어떤 부품을 사용하는지 알기 어렵다.

그래도 완성품인 측면에서는 바로 사용할 수 있다는 장점이 있다.

 

B 클래스는 사용자가 원하는 부품을 사용할 수 있다는 것은 장점이다

그렇지만 부품을 조립을 해야하는 불편함이 발생한다.


코드의 유지보수 측면에서는 B 클래스를 좀 더 유용하게 사용할 수 있다

부품을 다른 부품으로 변경하거나 업그레이드를 하기 좋기 때문이다

조립형을 선호하는 이유가 된다

 

 

main 함수를 보자

public class Main {

	public static void main(String[] args) {
		A temp = new A(); // 사용자가 어떤 부품이 있는지 알 수 없다
		
		C c1 = new C();
		A a = new A(c1); // 생성자 호출 시 Construction Injection이 일어남
		// 대리점에서 완성형 컴퓨터를 산다
					   

		C c2 = new C(); // 사용자가 원하는 부품을 찾는다
		B b = new B(); // 도구 생성 <- Dependency
		b.setC(c1); // 그 부품을 장착시킨다 <- Setter Injection
		// 조립컴퓨터를 산다
		// 조립하는 일이 불편하다면 서비스를 받으면 된다
		// Spring은 조립과 생성해준다 스프링을 이용하는 기본적인 이유
	}
}

위에서 말한 부분을 코드로 나타냈다고 보면 된다

그리고 B클래스 형태로 조립을 할 때 DI가 일어난다고 볼 수 있다

설명에 없던 부품을 받아서 생성되는 A클래스도 마찬가지로 DI가 일어난다

 

 

추가적으로 조립을 할때 2가지 방법이 있다

1. 생성자를 통한 조립

2. Setter 메소드를 통한 조립

 

앞서 언급한 조립형은 직접 넣어줘야 한다는 불편함이 존재하는데

스프링에서 어노테이션, xml 등으로 도움을 받을 수 있다

스프링을 사용하는 기본적이 이유가 된다

 


조립형

장점 : 부품을 쉽게 바꿀 수 있다

단점 : 조립을 시켜주어야 한다.

 

방안 : 스프링으로 할 수 있다.

 

조립 방법

1. Setter

2. Constructor

728x90

'Spring' 카테고리의 다른 글

@Autowired, @Qualifier 사용법  (0) 2023.08.05
XML 사용법  (0) 2023.08.05
Inversion of Control Container ( Ioc Container )  (0) 2023.06.14
Dependency Injection ( XML )  (0) 2023.06.14
Dependency Injection ( 순수 Java )  (0) 2023.06.14