Home IoC 와 DI
Post
Cancel

IoC 와 DI

사진으로 절벽에 매달린 나의 심정을 나타내봤다 ㅠㅠ…
스프링 프레임워크를 공부하기로 마음 먹자마자 위기에 빠졌다.

도대체 IoC 랑 DI 가 뭔데?

블로그 변역글 에서 길게 얘기 했지만 무림식으로 요약해보겠다.
너무나도 방대해지고 무거워지는 Java EE 어플리케이션 을 탈피하고자 태초에 무림에는 여러 프레임워크들이 자웅을 겨루고 있었다.
그들에게 가장 기본적이고 중요한 해결과제가 있었으니… 바로 의존성을 어떻게 주입할 것인가 !
여기서 나온 방법이 Inversion of Control (프레임워크가 정한 일정 규칙만 따르면 알아서 넣어줄게) 이고 이 IoC 의 작은 범위가 DI 라는 것이다.

Inversion of Control

    요약은 좋은데 너무 추상적인 말들이라고 해야하나? 궁금한 점을 차근차근 풀어보자.
의존성을 주입하는 제어를 프레임워크에게 넘긴다라는 의미의 IoC 에서는 두 가지 중요한 단어가 있다.

의존성 그리고 제어

도대체 의존성이 뭐길래 넘기는지, 또 제어를 넘긴다는데 제어가 도대체 어디까지를 의미하는지 를 명확히 해야한다.

의존성

간단히 말하면 A 에서 B를 new 하여 객체 생성하여 사용한다면 A는 B에 의존하고 있는 것이다. 두 모듈간의 연결성을 가지고 있다면 의존성이 있다고 한다.
모든 고민의 시작은 어떻게 하면 new 하여 객체 인스턴스 생성 방법이나 뭐 싱글톤 같은 디자인 패턴 구현 없이 간단하게 의존성있는 객체를 연결할 수 있을까 인 것 !!!

    그러면 여기서 또 질문은 왜 간단히 new 하면 안될까? new 해서 객체를 생성한다면 의존성있는 한 모듈을 수정할 때 다른 모듈까지 수정해야한다. 늘상 예로 들어지만, 자동차 타이어 어쩌고를 한다면 한국타이어를 new 해서 사용했다면 금호 타이어로 바꾸기 위해선 타이어 호출 클래스도 수정해야한느데, DI 사용하면 주입 설정(bean 정의) 만 바꿔주면 다른 코드 수정없이 변경 가능하다. 이건 Dependency Injection 기능 뿐아니라 Reduce Dependency 의 역할도 한다. 상호간의 의존성을 낮추는 것이다.

제어

    여기서 프레임워크가 대신 해주겠다는 제어는 어디까지를 말하는걸까? IoC 에서 말하는 제어는 사용자는 코어한 로직만 제어하고 나머지는 다 프레임워크에서 한다. (구현 내용 대입 - 의존성 주입 같은 것들이나 프로그램 플로우를 제어해준다.) 그래서 DI 는 IoC의 부분집합이 되는 것이다. 프레임워크가 가져가는 제어중에 하나가 의존성 주입을 위한 객체 생성 및 라이프 사이클 제어이니까 그 제어하는 방법인 DI 가 따라 나온다. stackoverflow 에서 정리된 글이 도움이 됐다.
언제 어디서 제어 메소드가 호출되어 객체가 주입되고 흘러가는지는 다 프레임워크 단에 맡긴다. 그래서 간지나는 hollywood principle 이라는 말이 나왔다. 헐리우드 오디션처럼 “Don’t call us, we’ll call you” . 프레임워크에서 알아서 너의 코어 로직을 호출할게 ^^

Dependency Injection

신나게 얘기한 의존성 띄는 객체를 주입해주는 방법이 바로 Dependency Injection 이다.
사용자가 할 일은 두 가지 이다.
-주입하고자하는 정의를 담은 bean 설정파일 만들기. (xml)
-주입되어야하는 위치에 어노테이션 하기

컨테이너가 사용자가 작성한 bean 설정 파일을 보고 알아서 생성하고 알맞은 때에 알아서 넣어준다.

spring 에서의 전달 방식은 아래 두 가지 있다.

  1. 생성자를 통한 전달
  2. setter 통한 전달

상세한 전달방식은 나중에 적겠다.

This post is licensed under CC BY 4.0 by the author.