DI ( Dependency Injection )은 객체 간의 결합을 느슨하게 만들어주는 개념이다.



1. 객체간의 강한 결합 vs 느슨한 결합

2. 왜 느슨한 결합이 좋은 것 인가?

3. Spring에서 DI를 어떻게 사용하면 되는 것 인가?

 

1. 객체간의 강한 결합 vs 느슨한 결합

public interface BookDAO{}
public class MagazineDAO implements BookDAO{ String monthly = ""; }
public class NovelDAO implements BookDAO{}


public interface Book{}
public class MagazineServiceImpl implements Book{
    private BookDAO bookDAO;
    public MagazineServiceImpl() {
        //강한 결합
        //MagazineService 객체가 생성되는 시점에 
        //MagazineDAO를 생성하여 사용하게 된다.
        bookDAO = new MagazineDAO();
    }
    
}

public class NovelServiceImpl implements Book{
    private BookDAO bookDAO;
    public NovelServiceImpl(BookDAO bookDAO) {
        //느슨한 결합
        //NovelService 객체가 생성되는 시점에
        //BookDAO가 자동으로 주입되어 사용하게 된다.
        this.bookDAO = bookDAO;
    }
}

 

2. 왜 강한 결합을 사용하면 안 좋은 것인가?

강한 결합을 사용하는 것이 반드시 나쁜 것이 아니다.

작은 프로젝트에서 강한 결합을 사용하도 무방하다.

그러나, 대형 프로젝트에서는 많은 클래스 객체들이 생성되고, 관리되어야 하기 때문에 느슨한 결합을 사용하는 게 유리하다.

 

추가적으로, 코드의 재사용성이나 단위테스트에도 느슨한 결합이 강한 결합보다 유리하다. 

 

3. Spring에서 DI를 어떻게 사용하면 되는 것인가?

Spring에서는 대표적으로 XML을 사용하여 객체 간의 의존성을 정의하여 사용한다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- NovelService 객체 정의 -->
    <bean id="NovelService" class="com.example.cls.NovelServiceImpl">  
        <!-- bookDAO라는 이름으로 NovelService Injection을 정의 -->
		<property name="bookDAO" ref="bookDAO"/>
    </bean>

    <!-- bookDAO 객체 정의 -->
    <bean id="bookDAO" class="com.example.cls.NovelDAO">
    </bean>
</beans>