규턴의 개발블로그

Dependency

DI를 알기전 Dependency에 대해서 먼저 알아봅시다.

1
2
3
4
5
6
7
8
public class Case {
    private Pencil pencil;
 
    public Case(){
        this.pencil=new Pencil();
    }
}
 
cs

 

위와 같이 Case(필통)은 Pencil이라는 class에 의존하고 있습니다.

즉 Case class는 Pencil에 영향을 받는것입니다.

이것을 '의존관계'를 가진다고 부릅니다.

 

 

 

 

의존관계 인터페이스

위와 같은 코드는 문제가 있습니다.

Case class는 Pencil class만을 의존할 수 있습니다.

하지만 Case(필통)은 연필뿐만 아니라 지우개 등등 다른 여러가지를 가질 수 있습니다.

1
2
3
4
5
6
7
public class Case {
    private Product product;
 
    public Case(){
        this.product=new Pencil();
//this.product=new Eraser();
//this.product=new Note();
    }
}
cs
1
2
public class Pencil  implements Product{
}
cs

 

1
2
public class Eraser implements Product{
}
cs

 

위와같이 Case는 Pencil class를 의존하지 않고 Product(Interface)를 의존하면서 Pencil.class 뿐만아니라

Product를 implements하는 Eraser.class 와 같은 여러가지를 의존할 수 있습니다.

 

이러한 인터페이스 작업을 통해 의존관계를 다양하게 맺을 수 있고 관계와 결합도가 느슨해 질 수 있습니다.

 

 

 

 

DI(Dependency Injection)

DI는 말 그대로 의존성을 주입하는 것입니다.

이전의 예시에서는 클래스 내부에서 객체를 넣어주고 있지만, 의존성 주입은 외부에서 객체를 생성해서 넣어주는 것입니다.

1
2
3
4
5
6
7
8
9
public class Case {
    private Product product;
 
    public Case(Product product){
        this.product=product();
    }
}
 
Case case =new Case(new Pencil());// 직접 주입
cs

위와 같이 생성자를 통해 Case.class의 product객체에 Pencil.class(implements product) 를 외부에서 주입한것을 알 수 있습니다.

생성자를 통한 주입뿐만 아니라 Setter(메소드)를 이용하여 주입하는 방법 또한 있습니다.(생성자 주입을 주로 사용하기에 따로 다루지는 않겠습니다.)

 

 

 

 

DI를 왜 쓸까?

 

그렇다면 DI를 쓰는 이유는 무엇일까요?

 

1.의존성이 줄어들게 됩니다. 

위에서 언급했듯이, 의존성이 강하게 연결되어 있다면 의존관계가 변경되었을 경우 해당 class 코드전체를 수정해야  하는 경우가 생깁니다.

하지만 의존관계 주입을 이용한다면 해당(class)되는 코드를 수정할 필요 없이 원하는 객체를 주입할 수 있습니다.

 

2.가독성이 높아집니다.

 

Product(Interface)를 이용한다면 어떤 객체가 주입되었는지 한눈에 이해 할 수 있습니다.

ex)Case case =new Case(new Pencil());

 

3.테스트를 독립적으로 실행 할 수 있습니다.

 

Case.class 와 Product.class의 테스트를 별개로 분리하여 진행 할 수 있습니다.

 

4.재사용성이 높아집니다.

 

Case.class 안에서 사용된 Product.Interface를 다른 class에도 이용하기위해 구현한다면

Product.Interface를 다른 클래스에서도 재사용 할 수 있습니다.

 

 

 

마지막으로

 

저도 이 글을 적으면서 토이프로젝트를 진행할때 DI를 신경쓰지 않고 구현한것 같습니다.

이번기회를 통해 DI를 신경써서 각 객체들이 유기적은 결합을 갖는 코드를 짜도록 노력해봐야 겠습니다.

 

 

 

 

 

 

 

profile

규턴의 개발블로그

@규턴이

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!