본문 바로가기

BackEnd/Spring

DI의 장점

반응형

1. 요구사항이 변화하더라도 의존 객체만 한번 수정해 줄뿐, 주입하는 코드는 그대로 이기 때문에 효율적이다.  아래글을 참고하자

 

https://cg-developer.tistory.com/396

 

 

다시보고 2번 내용 수정이 필요하다

 

2. 테스트 코드 작성시 주입하는 코드의 수정없이 가짜 구현 객체 사용가능.

 

주입해주고자 하는 클래스가 아직 미완성단계일때, 오버라이딩을 통해 가짜 구현 객체를 사용 

 

하여 테스트 해볼수 있다. 즉, 의존하는 클래스의 구현이 완성되어 있지 않더라도 테스트를 할 

 

수 있다는 점이다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package org.zerock.sample;
    import org.springframework.stereotype.Service;
    import lombok.Data;
 
@Data
@Service
public class ItalianChef implements Cook {
    
    @Override
    public String cook(){
        throw new UnsupportedOperationException();
        //return "Italian cook";
    }
}
cs

 

ItalianChef 클래스의 cook() 메서드의 구현이 아직 완성되지 않은 상황으로 돌아가 보자. 

 

ItalianChef 클래스의 개발자는 cook() 메서드가 구현되지 않았다는 점을 명확히 하기 위해 

 

cook() 메서드가 UnsupportedOperationException을 발생시키도록 코드를 작성하고 코드 관

 

리 시스템에 커밋 (commit) 했다고 가정해보자.

 

이 상태에서 ItalianChef클래스를 사용하는 hotel 클래스를 테스트하고 싶다.

 

만약 hotel 클래스가 ItalianChef객체를 직접 생성한다면, ItalianChef 클래스의

 

코드가 완성될 때까지 hotel 클래스를 테스트할 수 없을 것이다. 

 

하지만, DI 방식을 사용하고 있다면 얘기가 달라진다.

 

DI는 의존하는 객체를 외부에서 넣어주는 방식이다. 이는 hotel 객체를 생성할

 

때 hotel클래스의 코드 변경 없이 진짜 ItalianChef대신에 가짜 fakeItalianChef 객체를 넣어줄 수 

 

있다는 의미이다. 

 

예를 들면 다음과 같이 가짜 fakeItalianChef 객체를 이용해서 hotel 클래스를 실행해 볼 수

 

있는 것이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
package org.zerock.sample;
    import org.springframework.stereotype.Service;
    import lombok.Data;
 
@Data
@Service
public class fakeItalian implements Cook {//가짜 구현 객체
    
    @Override
    public String cook(){
        return "fakeItalian cook";
    }
}
cs

 

hotel클래스에 직접 new방식으로 객체를 가짜로 생성하려면 아래와 같이 코드의 수정이 필요하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
package org.zerock.sample;
    import org.springframework.stereotype.Component;
    import lombok.Data;
    
@Component 
@Data
public class SampleHotel {//직접 생성방식의 단점
    
    //private Cook chef = new ItalianChef();
    private Cook chef = new fakeItalian();
//가짜 구현 객체를 생성하기 위해 코드 수정이필요
//즉, 필요하다면 수십개 클래스에 코드 수정필요
    
cs

 

하지만 setter 메소드 방식 또는 생성자 방식으로 가짜 의존객체를 주입해준다면

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package org.zerock.sample;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    import lombok.Data;
    import lombok.Setter;
    
@Component 
@Data
public class SampleHotel {
    
    @Setter(onMethod_ = @Autowired)
    private Cook chef;
    
cs

 

hotel클래스의 코드는 수정이 필요없다.

 

정리하자면 다른 두 명의 개발자가 ItalianChef 클래스와 hotel 클래스를 동

 

 

시에 구현하고 싶은데 이때, 의존성 주입을 하게되면 주입하는 코드의 수정없이 가짜 구현 객체를 

 

사용가능하다는것이다.

 

 

반응형