[JAVA] - 생성자 주입, 의존성 주입?

김주형·2022년 11월 3일
0

Java

목록 보기
8/8

Reference

이 글은 다음을 참고하여 작성되었습니다. 감사드립니다. 🙇🏻‍♂️


Dependency Injection, 객체지향 프로그래밍을 하다보면 한번 쯤 듣게 되는 용어중 하나이다.

의존성 주입이 무엇이고 어떤 배경으로 생겨난 개념인지, 왜 필요한지에 대해 간단히 정리해보려고 한다.


문제

개발을 하다보면 코드에 의존성이 생겨 결합도가 높아지기 마련이다.
그럼 의존성은 무엇이고, 왜 생겨나는 걸까?


class Programmer {
    private External external;

    public Programmer() {
    	this.external = new External();
    }
    
    public startProgramming() {
    	this.external.method(); // 일단 호출하고 시작하자
        ...
    }
}
  • Programmer 클래스에서 startProgramming 함수가 호출되기 위해서는 External 클래스를 필요로 한다.
  • Programmer 클래스는 External 클래스의 의존성을 가진다 라고 한다.

이와 같이 코드를 설계하였을 때 문제점은 무엇일까?
1. 코드의 재활용성이 떨어
2. 의존하던 External 클래스가 수정 될 때,
Programmer 클래스도 함께 수정해줘야하는 문제가 발생한다.

-> 즉, 결합도(coupling)가 높아지게 된다.


DI(의존성 주입)를 사용해야 하는 이유

반면 DI로 프로그램을 설계 했을 때, 다음과 같은 이점을 얻을 수 있다.

  • 단위 테스트가 용이해진다.
  • 코드의 재활용성을 높여준다.
  • 객체 간의 의존성(종속성)을 줄이거나 없엘 수 있다.
  • 객체 간의 결합도를 낮추면서 유연한 코드를 작성할 수 있다.

만약 DI를 사용하지 않고 External 클래스의 상속을 받은 클래스들..
예를 들어
Exception이나 Constant 클래스를 사용해야 한다면 다음과 같이 직접 수정해 줘야 한다.

class External {...} 

// External 클래스를 상속
class Constant extends External {...}
class Exception extends External {...}

// Programmer.java
class Programmer {
    private External external;

    public Programmer() {
    	this.external = new Constant(); // 직접 수정
        // 또는 
        this.external = new Exception(); // 직접 수정
    }
    
    
}

극단적으로, 만약 External 클래스를 사용하는 클래스가 100개이고,
그 중 Constant가 필요한 클래스가 있다면?

굉~~~장히 비효율적이라고 할 수 있다.

의존성 주입(DI)을 이용한다면 아래와 같이 개선할 수 있다.

// Programmer.java
class Programmer {
    private External external;

    // 사용할 객체를 자유롭게 고를 수 있게된 개발자
    public Programmer(External external) {
    	this.external = external;
    }
    
    public startProgramming() {
    	this.external.method();
        ...
    }
}
=

위와 같이 필요한(의존하는) 클래스를 직접 생성하는 것이 아닌, 주입해줌으로써
객체 간의 결합도를 줄이고 좀 더 유연한 코드를 작성할 수 있게 된다.

즉, 한 클래스를 수정하였을 때, 다른 클래스도 수정해야 하는 상황을 막아줄 수 있다!!


정리

  • DI, 의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로 부터 필요한 객체를 받아서 사용하는 것이다.
  • 이를 통해 객체간의 결합도를 줄이고 코드의 재활용성을 높여준다.
profile
도광양회

0개의 댓글