sin prisa pero sin pausa

[Spring] Dependency Injection(DI) 와 IoC Container 본문

더 알아보고 싶은데?

[Spring] Dependency Injection(DI) 와 IoC Container

EstherDmt 2021. 7. 13. 18:19
반응형

내일부터 Spring 수업 진도가 나가는데 일단 왜 이 프레임워크를 쓰는 건지 궁금해서

뉴렉처 영상을 보다가 

 

 1. Dependency Injection(의존성 주입) 

2. Transaction Management(트랙잭션 처리)

 

이라는 2가지 이유가 나와서 한 번 찾아보았다. 

 

원래는 자바 EE(Enterprise Edition)도 가지고 있었던 기능이지만 

스프링이 훨씬 깔끔하고 쉽게 처리하면서 자바 EE의 기능을 모두 커버하기 시작하자 

스프링을 쓰기 시작함

(자바 EE의 유료화 시작이라는 점도 교체의 큰 원인)

 

찾아보니 Dependency Injection이 마침 오늘 시험을 본 클래스 다이어그램과 연관되는 내용이라 잊기 전에 바로 작성!

 

프로그램이란 객체들의 조립 관계를 통해 이루어진다.

그러니 Dependency를 이해하기 쉽게 부품이라고 생각해보자. 


먼저 Dependency란 한 객체 안에서 다른 객체를 가져다 쓰는 것이다.

쉽게 생각해보면 가져다 쓴 다른 객체의 값이 달라지거나 했을 경우,

참조한 클래스 안에서도 코드 변화가 일어나야 한다면 그게 바로 의존성!

 

또 다른 객체를 부품으로 쓰고 있는 클래스를 객체로 만들어버리면

그 안에 어떤 객체를 부품으로 사용하고 있는지도 모르고 수정하기도 어려움


Dependency Injection은 이 부품을 가져다가 꽂아주는 작업을 의미한다. 

참조당한 객체가 생성자의 매개변수를 통해 이미 외부에서 온전한 형태로 전달만 되는 방식으로 되어 있기 때문에 

참조당한 객체의 값이 달라져도 참조한 객체의 코드 수정이 필수적으로 요구되지 않는다.

유지보수도 좋아지고 재활용성도 높아진다!

또 메소드 단위로 이루어지는 유닛테스트(Unit Test)도 용이하게 된다.

 

방법 1) Setter Injection : set함수를 이용해서 세팅함방법 2) Contruction Injection : 생성자 매개변수를 통해 주입한다.


public class BuyCar {
	
    // 1. Driver,Car 클래스를 가져다 쓰고 있는 의존성
	private Driver bestDriver;
	private Car carType;
	
	public BuyCar(Driver d) {
    	
        // 2. 마찬가지로 새로 객체를 만들어 종속되게 하는 의존성
   		// Composition
		this.carType = new Benz();
        
        // 3. 외부에서 생성된 객체를 매개변수로 받아 쓰는 의존성 주입
		// Aggregation
		this.bestDriver = d;
		
		
	}
	
}

 

이렇게 우리가 조립을 할 때에 시간도 들고 불편함을 느낀다면 

조립해주는 서비스를 이용하자!

소프트웨어 중에서도 이런 역할을 하는 친구가 바로 스프링 :)

 

원하는 부품이 뭐가 있는지, 어떤 부품과 결합시키기를 원하는지만 설정해주면 

스프링이 실행해주고 우리는 조립된 결과물을 가져다 쓰게 된다. 

 

이러한 주문을 할 때 우리는 XML 또는 annotation을 통해 주문서를 작성한다.


여기서 IoC Container라는 개념도 등장을 하는데, 

우리가 주문을 하게 되면 주문서대로 부품을 구입해서 박스에 담아야 하는 것처럼 

스프링도 주문서 내용대로 객체를 생성해서 담을 수 있는 그릇이 필요하다. 

 

근데 왜 Dependency Container가 아니고 IoC Container라는 요상한 이름일까?

IoC Container에는 생성한 객체를 담을 뿐만 아니라 조립된 형태로도 담을 수 있다.

그 명칭에는 어떤 조립 관계를 가지고 있나를 한 번 살펴봐야 할 필요가 있는데


일체형으로 만들어질 때는 합쳐지는 클래스부터 순서대로 만들어서 합쳐진다고 해보자.

같은 순서에서 결합형이라고 하면 의존당하는 클래스가 먼저 만들어져야 하기 때문에 순서가 뒤집히게 된다.

이 행위를 스프링이 맡아서 제어하게 되고 제어하는 주체가 당사자에서 스프링으로,

또 순서도 역방향으로이걸 바로 Inversion of Control이라고 해서 IoC Container라고 불린다.

 

객체(VO-DTO/POJO)의 생명주기를 담당하기 때문에 메모리 확보라는 장점이 있다.


 

휴 일단은 뉴렉처 선생님의 도움을 받아 여기까지 어떻게든 이해를 조금 했는데 

사실 이렇게만 알아봐서는 그래서 어떻게 DI 처리를 해준다는거지..? 싶지만 

일단 시작하기 전이니 이 정도까지는 이해를 하고 넘어가자

 

반응형