본문 바로가기

BackEnd/Spring

의존 객체 주입(DI)은 무엇인가?

의존 객체 주입(Dipendency injection)

 

- 배터리 일체형의 자동차 장난감

- 배터리 분리형의 로봇 장난감

 

두 가지의 장난감이 있습니다.

 

배터리가 일체형인 자동차 장난감은 배터리가 다 떨어지면 장난감 자체를 버리거나 새로 구매해야합니다.

배터리가 분리형인 로봇 장난감은 배터리가 다 떨어지면 배터리만 교체해주면 됩니다.

 

public class CarToy {
    private Battery battery;

    public CarToy() {
        battery = new NormalBattery();
    }
}

 

배터리 일체형의 자동차 장난감 코드.

생산해내는 공정에서 부터 배터리가 주입되어 있고 교체할 수 없습니다.

 

 

public class RobotToy {
    private Battery battery;

    public RobotToy() {
    }

    public void setBattery(Battery battery) {
        this.battery = battery;
    }
}

 

배터리 분리형의 로봇 장난감 코드.

처음부터 배터리는 없지만 이용자가 배터리를 꼽아주거나 새롭게 교체하여 충전해주면 계속 쓸 수 있습니다.

 

두 가지 모두 공통점은 배터리에 의존한다는 것입니다.

이렇게 주입된 배터리를 스프링 프레임워크에서는 의존 객체 주입(DI)이라고 합니다.

 

주입한 의존 객체가 모인 곳은 스프링 컨테이너입니다.

주로 리소스 폴더의 context.xml에서 빈을 생성하고, 그 빈을 자바 클래스에서 호출하여 사용합니다.

 

리소스의 xml 파일에서 memberDAO 객체를 여러 Service 객체에 주입하는 것을 예로 들어 코드로 작성하면 아래와 같습니다.

 

<beans ...>

    <!-- DAO 객체 -->
    <bean id="memberDAO" class="패키지.MemberDAO"><bean>
    
    <!-- Service 객체들 -->
    <bean id="registerService" class="패키지.MemberRegisterService">
    	<constructor-arg ref="memberDAO"></constructor-arg>
    </bean>
    
    <bean id="modifyService" class="패키지.MemberModifyService">
    	<constructor-arg ref="memberDAO"></constructor-arg>
    </bean>
    
    <bean id="selectService" class="패키지.MemberSelectService">
    	<constructor-arg ref="memberDAO"></constructor-arg>
    </bean>
    
    <bean id="deleteService" class="패키지.MemberDeleteService">
    	<constructor-arg ref="memberDAO"></constructor-arg>
    </bean>

</beans>

 

DAO 객체를 하나 만들어주고 나머지 Service 객체들 안에 위에서 생성한 memberDAO 객체를 주입해주고 있습니다.

 

실제로 Service 객체에서 DAO를 사용하니 위와 같은 코드로 DAO 객체를 주입하여 해당 객체 클래스에서는 싱글톤 범위에서 작동하는 이미 컨테이너에 올려진 객체만 getBean 메서드로 가져와 사용할 수 있는 것입니다.

 

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:context.xml")

RegisterService rs = ctx.getBean("registerService", RegisterService.class);
rs.register("홍길동");

 

컨텍스트 XML 파일을 먼저 불러오고 해당 컨텍스트 파일에서 getBean으로 bean id를 찾아 사용할 수 있습니다.