프로그래밍/객체지향

[객체지향] 의존성 주입(DI) 및 의존성 역전(DIP)

코드몬스터 2024. 6. 25. 00:23
728x90

 

Dependecy Injection - 디자인 패턴
Dependecy Inversion Principle - 객체지향 원칙

 

 

 

수다수다

처음 자바를 공부할 때, 의존성 주입과 제어의 역전 등등 여러 개념을 공부했지만 사실 이해가 제대로 안 되었다.

이론으로 공부를 하니까.. 머리에서는 도대체 무슨 말인데 라는 생각 밖에 없었다...^^;;;

 

시간이 흘러 개발 경험 1년을 넘어 2년차를 바라보면서 우연히 의존성 주입 내용을 읽었는데

무슨 이야기인지.. 이해가 되었다.

그랬구나,, 그래서 그랬구나..

 

완벽하게 이해한 것은 아니지만 내가 이해한 것을 최대한 남겨보려고 한다.

 

 

의존하다.

먼저 의존성 주입을 하기 전에, 의존한다는 것이 무엇인지 알아야 한다.

 

의존한다를 아래 코드와 같이 보여줄 수 있다.

// SpiderMan2 클래스는 Spider 클래스에 의존을 하고 있다고 볼 수 있다.
public class Spider {
    void jump() {
        System.out.println("Jump 한다");
    }
}

public class SpiderMan2 {
    private Spider spider;
    
    public SpiderMan2() {
    	this.spider = new Spider();
    }
}

 

당연하겠지만 SpiderMan2는 클래스이고 Spider도 하나의 클래스이다.

 

SpiderMan2 클래스는 Spider 클래스 인스턴스를 직접 생성하여

SpiderMan2 클래스(Hight Level) 는 Spider 클래스(Low Level Model)에 의존하고 있는 것이다.

(SpiderMan2는 Spider의 메서드를 사용할 것이기 때문)

 

두 클래스 간의 관계를 UML로 표현하면 아래 이미지와 같다.

 

SpiderMan2는 Spider에 의존한다.

 

 

해당 코드가 좋다 나쁘다를 떠나서 우리는 클래스 간의 의존성을 구현한 것이다.

 

 

의존성 주입

의존성을 주입하는 방법은 다음 목차에서 얘기를 하겠지만 그 중 생성자 주입 방법으로 의존성 주입에 대해 얘기하자.

 

 "의존하다"에 대해 객체가 내부적으로 다른 객체를 직접 생성했지만, → 강한 결합

"의존성을 주입" 한다는 것은 외부에서 객체를 주입받아 사용하는 것을 얘기한다. → 약한 결합

 

클래스의 생성자를 작성할 때 매개변수로 특정 객체를 받도록 작성하는 것을, 외부에서 객체를 주입받는 것이다.

 

아래 예시에서 보면 SpiderMan2 클래스 생성자에서 Spider 클래스를 매개변수로 작성되었다.

public class SpiderMan2 {

    private Spider spider;
    
    public SpiderMan2(Spider spider) {
        this.spider = spider;
    }

}

 

 

의존성 주입 3가지 방법

  1. 생성자 주입
    public class SpiderMan2 {
    
        private Spider spider;
        
        public SpiderMan2(Spider spider) {
            this.spider = spider;
        }
    
    }
  2. setter 주입
    public class SpiderMan2 {
    
        private Spider spider;
        
        public void setSpider(Spider spider) {
            this.spider = spider;
        }
    
    }
  3. 필드 주입
    public class SpiderMan2 {
    
        @Autowired 
        private Spider spider;
        
    }

 

 

의존성 역전(DIP)

이 때까지 의존성 주입하는 객체의 타입은 클래스인데,

의존성 역전은 해당 객체의 타입이 Interface 이다

 

아래 코드의 예시를 살펴보자.

 

기존에 SpiderMan2가 Spider를 의존했다면,

 

이제부터 SpiderMan2가 Person 인터페이스 클래스를 바라보고

이제부터 Spider 또한 Person 인터페이스 클래스를 바라본다.

 

인터페이스를 바라보게 하면 Person 인터페이스를 구현하고 있는 다른 클래스로 변경해서 사용할 수 있다.

 

(기존) SpiderMan2  Spider 

(변경) SpiderMan2 → PersonSpider

(변경) SpiderMan2 → Person  Spider2

 

의존성 방향이 역전 되었기 때문에 이를 의존성 역전이라고 부른다.

 

public interface Person {
	public abstract void speak();
}

public class Spider implements Person {
	
    @Override
    public void speak(){
    	System.out.println("말하기");
    }

}

public class SpiderMan2 {

    private Person person;
    
    public void SpiderMan2(Person person){
    	this.Person = person;
    }
}

 

참고 사이트

'프로그래밍 > 객체지향' 카테고리의 다른 글

객체(Object)와 클래스(Class)란?  (0) 2025.02.05
[객체지향] 다섯 가지 원칙  (0) 2024.07.19
[객체지향] 4가지 특징  (0) 2023.09.09