java study preview 1-1/ DI

서동희·2023년 10월 13일
0
post-thumbnail

DI (Dependency Injection) 의존 관계 주입

의존 관계 주입에 앞서 "의존관계(Dependency)"에 대해 알아야 합니다
의존관계는 의존대상 B가 변하면 그것이 A에 미치는 관계를 말합니다

자바는에서 의존관계(Dependency)는 한 클래스가 다른 클래스를 사용하는 관계를 나타냅니다. 예를 들어, 클래스 A가 클래스 B를 사용한다면, 클래스 A는 클래스 B에 의존하고 있습니다. 이는 클래스 A가 클래스 B의 객체를 생성하거나 클래스 B의 메서드를 호출하는 등의 형태로 나타날 수 있습니다.

반면에 의존관계(Dependency)를 관리하는 방법 중 하나로 DI(의존성 주입, Dependency Injection)를 사용할 수 있습니다. DI는 객체 간의 의존 관계를 외부에서 설정하고 주입하는 디자인 패턴으로, 의존 객체를 직접 생성하지 않고 외부에서 주입받아 사용하는 것을 의미합니다.

간단히 비교해보면:

  • A 의존관계 (Dependency) in Java:

클래스 A가 클래스 B를 직접 생성하고 사용하는 것을 의미합니다. 예를 들어, 클래스 A에서 B b = new B()와 같이 직접 객체를 생성하여 사용합니다.

class A {
    private B b;
    
    public A() {
        this.b = new B();
    }
}
  • B 의존성 주입 (Dependency Injection):

클래스 A는 외부에서 클래스 B의 객체를 주입받아 사용합니다. 클래스 A는 직접 객체를 생성하지 않고 외부에서 주입받은 객체를 사용합니다.

class A {
    private B b;
    
    public A(B b) {
        this.b = b;
    }
}

DI를 사용하면 의존 관계를 외부에서 설정하고 주입하기 때문에 코드의 유연성, 테스트 용이성, 재사용성 등을 높일 수 있습니다. DI를 통해 객체 간의 결합도를 낮추고 유지보수성을 향상시킬 수 있습니다.

  • 의존관계의 한계점

결합도 증가 (Increased Coupling):
의존 관계가 강하면, 한 클래스의 변경이 다른 클래스에 큰 영향을 미칠 수 있습니다. 이는 코드의 유연성을 낮추고 유지보수를 어렵게 만들 수 있습니다.

유연성 감소 (Reduced Flexibility):
강력한 의존 관계로 인해 클래스를 변경할 때 다른 클래스에 영향을 미칠 수 있으므로, 시스템의 유연성이 감소할 수 있습니다. 변경이 어렵고 위험할 수 있습니다.

테스트의 어려움 (Testing Difficulty):
의존 관계가 강하면 유닛 테스트 작성이 어려워집니다. 특히 의존하는 클래스가 외부 리소스나 라이브러리에 의존하는 경우 테스트가 어려워집니다.

가독성 감소 (Reduced Readability):
의존 관계가 복잡하고 강력하면 코드의 가독성이 저하될 수 있습니다. 어떤 클래스가 다른 클래스에 의존하는지를 이해하는 것이 어려울 수 있습니다.

리팩토링 어려움 (Difficulty in Refactoring):
의존 관계가 복잡하면 리팩토링 과정에서 문제가 발생할 가능성이 높아집니다. 의존 관계를 변경할 때 예기치 않은 부작용이 발생할 수 있습니다.

  • 의존성 주입의 장점

유연성과 확장성: 의존 객체를 외부에서 주입받기 때문에, 객체 간의 의존 관계가 느슨해지고 변경에 대해 유연하게 대처할 수 있습니다. 새로운 기능을 추가하거나 수정할 때, 기존 코드를 변경하지 않고 의존 객체만 교체하면 됩니다.

테스트 용이성: 의존 객체를 외부에서 주입받기 때문에, 테스트 시에 모의 객체(mock object) 또는 가짜 객체(fake object)를 주입하여 테스트하기가 편리해집니다. 실제 의존 객체 대신 모의 객체를 주입하여 의도한 대로 동작하는지 검증할 수 있습니다.

간단한 예시로, 자동차 객체가 엔진 객체에 의존한다고 가정해봅시다. 의존성 주입을 사용하면 자동차 객체가 직접 엔진 객체를 생성하는 것이 아니라, 외부에서 엔진 객체를 주입받아 사용하게 됩니다. 이렇게 하면 자동차의 엔진을 변경하더라도 자동차 클래스를 수정할 필요 없이 외부에서 새로운 엔진을 주입할 수 있습니다.

profile
백엔드개발자

0개의 댓글