본문 바로가기

개발/Spring

의존성 + ( IoC / DI 란 )

의존성이란?

Spring IoC, DI를 알아보기 전에 의존성이라는 개념에 대해 먼저 알아야 한다.

자바에서 의존성은 A 객체 생성자에서 다른 B 객체 생성자를 생성해야 한다면, .A가 B에 의존한다고 한다.

 

+의존한다는 것은 의존 관계를 가지게 되는데, 이 관계는 집합관계와 구성관계로 나뉜다.
집합관계: 부분이 전체와 다른 생명 주기를 가질 수 있다. ( 집 - 냉장고 )
구성관계 부분은 전체와 같은 생명 주기를 갖는다. ( 사람 - 심장 )

 

 

말보다 코드로 보는게 더 이해가 빠르겠다.(+ 이걸 말로만 설명하려면 어떻게 해야할지 모르겠다)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public interface Tire {
    String getBrand();
}
 
public class KoreaTire implements Tire {
    @Override
    public String getBrand() {
        return "한국 타이어";
    }
}
 
public class AmericaTire implements Tire {
    @Override
    public String getBrand() {
        return "미국 타이어";
    }
}
 
public class Car {
    Tire tire;
 
    public Car() {
        tire = new KoreaTire();
    }
 
    public String getTireBrand() {
        return "장착된 타이어: " + tire.getBrand();
    }
}
 
public class Diver {
    public static void main(String[] args) {
        Car car = new Car();
        System.out.println(car.getTireBrand());
    }
}
 
cs
위 코드와 같은 상황을 Car가 KoreaTire에 의존하고 있다고 한다. 
하지만 이러한 상태는 KoreaTire가 수정될 경우, 함께 수정해야 하는 문제가 발생한다.
이러한 상황을 객체 간의 의존성 때문에 결합도가 높아졌다고 하며, 이를 해결하기 위해 외부에서 객체 생성자를 사용하여 주입받는 것을 IoC라고 한다.

 

 

의존성 주입이란?

 

주입이란 말은 외부에서라는 뜻을 내포하고 있는 단어이다.

위 코드와 같이, 자동차 내부에서 타이어를 생산하는 것이 아니라, 아래와 코드와 같이 외부에서 생산된 타이어를 자동차에 주입하는 방식이다. (이러한 방식은 생성자를 통해서 의존성을 주입하는 방식이다.)

이러한 구현 방식은 Car에서 KoreaTire를 생산할지, AmericaTire를 생산할지 결정하는 것 보다 더 유연하다고 할 수 있다. 

하지만 이 경우에는 자동차를 한번 생산하면 다시 타이어를 교체할 방법이 없다. 

이것을 아래와 같은 방식으로 해결할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
public class Car {
    Tire tire;
 
    public Tire getTire(){
        return tire;
    }
    public void setTire(Tire tire){
        this.tire = tire;
    }
    public String getTireBrand(){
        return "장착된 타이어: " + tire.getBrand();
    }
}
 
public class Diver {
    public static void main(String[] args) {
        Tire tire = new KoreaTire();
        Car car = new Car();
        car.setTire(tire);
        System.out.println(car.getTireBrand());
    }
}
 
cs

 

 

IoC / DI란?

즉, 의존성 주입이란 자신(클래스)이 다른 객체를 생성하는 것이 아니라 외부에서 의존성을 주입 받는 것을 말한다.

이렇게 외부에서 의존성 주입을 받는 것을 IoC(제어권 역전)이라고 한다.

 

 

 

 

 

'개발 > Spring' 카테고리의 다른 글

[Spring] 빈의 스코프  (0) 2021.05.03
스프링 컨테이너와 스프링 빈  (0) 2021.04.29
[Spring] Spring 구조와 특징  (0) 2021.04.28
Servlet이란  (0) 2021.04.27
[Spring] Spring 터미널에서 백그라운드 실행하는 방법  (0) 2021.04.23