본문 바로가기

프로그래밍/Spring

[Spring, 디자인 패턴] DI(Dependency Injection) 의존관계 주입, 의존성 주입

DI(Dependency Injection) 의존관계 주입이란

하나의 객체가 다른 객체의 의존성을 제공하는 테크닉입니다.

 

의존관계(Dependency)는 의존대상 B가 변하면 의존대상 A에 영향을 미치는것입니다.

 

A객체에서 B객체의 기능을 필요로하는 경우 의존관계라고 표현할 수 있습니다.

 

김영한 님의 스프링 핵심 원리 강의를 보면

 

애플리케이션을 하나의 공연, 각각의 인터페이스를 배우라고 비유를 들고있습니다.

 

배우가 바뀌면 공연에 영향을 미치므로 의존관계라고 볼 수 있습니다.

의존관계 주입(Dependency Injection)은 의존관계를 외부에서 결정하고 주입하는 것 입니다.

 

의존관계 주입이 필요한 이유

아래와 같이 공연은 배우를 의존하고 배우의 구현클래스인 원빈과 장동건이 있다고 생각해봅시다.

공연의 배우를 장동건으로 섭외해보겠습니다.

class Show{
	private Actor 배우;
    	배우 = new 장동건();
}

다음 공연에는 원빈을 섭외하려면 어떻게 해야할까요?

class Show{
	private Actor 배우;
	배우 = new 원빈();
}

원빈을 섭외하기위해 공연 class를 수정해야합니다.

 

고로 공연은 배우(인터페이스) 뿐만아니라 장동건,원빈(구현클래스)에도 의존하게 되는겁니다. 

 

객체지향 설계원칙중 DIP와 OCP 를 위반하게 되는것이죠

 

의존관계 주입의 조건 ( 이일민, 토비의 스프링 3.1)

1. 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스만 의존하고 있어야 한다.

2. 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.

3. 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.

의존관계 주입 방법

의존관계 주입 방법은 여러가지가 있지만

 

Spring에서는 생성자 주입 방법을 권장하고 있습니다.

 

생성자 주입 방법

 

생성자를 통해 공연내의 배우를 주입 받도록 합니다 .

class Show{
	private Actor 배우;
    
        public Show(Actor 배우){
            this.배우 = 배우;
        }
}

외부클래스에서 객체 인스턴스의 참조를 생성자를 통해서 주입해줍니다.

class Director{
	private Show 공연 = new Actor(new 장동건);
}

의존관계 주입의 장점

의존관계 주입의 장점으로는

 

1. 클래스간 결합도가 낮아진다. 

 

2. 가독성이 좋아진다.

 

3. 재사용성이 높아진다.

 

4. 테스트의 편의성이 높아진다.

 

5. 코드의 재사용성이 높아진다.

 

등이 있습니다.