ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] DI 개념
    Developer/Spring 2013. 3. 13. 09:38
    스프링 프레임워크의 가장 큰 특징 중 하나가 DI를 지원한다는 것입니다.

    DI(Dependency Injection), 한글로 하면 ‘의존성 주입’ 이라는데.. 이름만 봐서는 뭘 해주는 녀석인지 이해가 가지 않습니다.

    DI(Dependency Injection) ?

    제가 생각할 때 DI를 사용하는 가장 큰 목적은 다음 한 줄로 나타낼 수 있을 것 같습니다.

    코드 의존성 제거 - 수정 사항이 있을 때 손이 덜 가게 하고 싶다.
    예를 들어 프로그램 시작 시, 동작하는 곳의 IP address를 알아야 한다고 가정합시다.

    IP address를 코드상에 기록한다면 설치할 때마다 매번 코드를 수정해야 하지요. 하드코딩된 IP address를 찾는 것도 일입니다.

    파일에 IP address를 적어두고 프로그램이 실행될 때 이걸 보고 시작하게 하면 어떨까요?

    코드 수정을 안해도 되고, 관리도 한 곳에서만 하면 되니까 좀 편해졌지요? 이런 편의성을 제공해준다는 것입니다.
     
    이런 예는 어떨까요?






    그림에서 ‘전사’는 만들어지기 전에 ‘무기’를 받아야 합니다. 무기에는 여러 종류가 있는데, 이 중 하나를 가지고 탄생하는 거죠.

    바꿔 말해서 ‘전사’가 만들어지려면, ‘무기’를 줘야 한다라고 할 수 있고, 이 말은 ‘전사’는 만들어지기 위해 ‘무기’에 의존하고 있다고 할 수 있습니다. (말장난처럼 보이지만 ‘의존성’이라는 단어를 끄집어 내려다 보니..)

    그리고 선택한 ‘무기’를 전사에게 ‘주입’시킵니다. 그냥 ‘준다’라고 보면 되겠네요.

    우리가 해줘야 할 부분

    오, 이제 우리가 귀찮아질 시간이군요. 위 그림을 구현한다고 생각해봅시다. 우리가 할 일은?

    1) 무기는 ‘창’을 준다는 것을 어딘가(?)에 명시해야 한다.
    2) 무기를 줘야 하는데, 전사가 받을 수 있는 방법(?)을 제공해야 한다.
    이렇게 정리해볼 수 있습니다. 빨간 글씨부분에 해당하는 정답은 무엇일까요?

    - 어딘가? 가 어디에요? -> XML 파일
    - 받을 수 있는 방법은? -> 생성자, setter ...
    네 그렇습니다. 이것만 해주면 됩니다.

    실제 XML 파일에는 아래와 같이 기술 해줘야겠군요. (생성자를 통해 주입받는 경우)

    [XML 파일]

    <bean id="warrior" class="test.game.Warrior">

    <constructor-arg ref="spear" />

    </bean>

    <bean id="spear" class="test.game.weapon.Spear">

    <bean>

    [전사 클래스]

    public class Warrior {

    private Weapon weapon;

    publiic Warrior(Weapon weapon) {

    this.weapon = weapon;

    }

    ...

    }
    아니 그럼 뭐가 좋아졌지?

    바로 코드상에서 무기를 쥐어줄 필요가 없어졌습니다.

    XML 파일에 칼을 줄지, 활을 줄지, 창을 줄지만 적어주면 알아서 쥐어주니까요.

    이 말은 무기를 생성하고, 쥐어주는 코드까지 제거 되었다는 의미입니다.


    'Developer > Spring' 카테고리의 다른 글

    [Spring] 의존성 주입 방법  (0) 2018.08.10
    [Spring] 주요 모듈 구성  (0) 2013.02.28
    [Spring] AOP  (0) 2013.02.28
    [ibatis] Transaction txAdvice 옵션  (0) 2012.11.02
© 2018 T-Story. All right reserved.