본문 바로가기

Java/Spring

[Spring] 의존성 주입(Dependency Injection)

의존성 주입은 객체지향 프로그래밍을 하다보면 자주 듣게 되는 용어이다.

 

이번엔 의존성, 의존성 주입 이 무엇인지 그리고 왜 필요한지를 간단하게 알아보자

 

[의존성]

<예제 1>

class Test {

    private Work work;

 

    public Test() {

        this.work = new Work();

    }

 

    public runTest() {

        this.work.~~~();

        ...

    }

}

 

위 예제 1을 보면 Test 클래스에서 runTest 메서드가 호출 되기 위해서는 Work 라는 클래스를 필요로 한다.

이것을 Test 클래스는 Work 클래스의 의존성을 가진다 라고 한다.

※ Work 라는 클래스 없이 runTest메서드가 작동을 할 수 없는 상태이다.

 

예제 1 처럼 코드를 작성하면 재활용하기 힘들고 Work클래스가 수정이 되면 Test클래스도 수정을 해야한다.

상당히 귀찮고 작은 실수라도 있다면 정상적으로 작동을 하지 못한다.

※ 이런 상황을 결합도(coupling)가 높은 상태 라고 말한다.

 

[의존성 주입(Dependency Injection)을 해야 하는 이유]

의존성 주입을 통해 아래와 같은 이점을 얻을 수 있다.

1. 유닛 테스트가 용이하다.

2. 코드 재사용성을 높여준다.

3. 객체 - 객체 간의 의존성을 낮추거나 없엘 수 있다.

4. 객체 - 객체 간의 결합도가 낮아지면서 유연하게 코드를 작성 할 수 있다.

 

의존성 주입을 통하지 않고 Work 클래스의 상속을 받은 Read 나 Write클래스를 사용하려면 직접 수정을 해야한다.

아래 예제 2 를 통해 알아보자

 

<예제 2>

class Read extends Work { ... }

class Write extends Work { ... }

 

class Test {

    private Work work;

 

    public Test() {

         this.work = new Read();  // 직접 수정

         this.work = new Write();  // 직접 수정

    }

    ...

}

 

위 예제 2에서 Work 클래스를 사용하는 클래스가 10개라면 그 중 Read가 필요한 클래스가 있으면

직접 수정을 해주어야 한다. 이렇게 귀찮음을 의존성 주입(Dependency Injection)을 통해 아래 예제 3처럼 할 수 있다.

 

<예제 3>

class Test {

    private Work work;

 

    public Test( Work work ) {

         this.work = work;

    }

 

    public runTest() {

        this.work.~~~();

        ...

    }

}

 

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

 

 

<요약>

- 의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로 부터 필요한 객체를 받아서 사용하는 것이다.

- 의존성 주입을 통해 객체간의 결합도를 줄이고 코드의 재사용성을 높여준다.