DI와 IOC를 알아보자.
개념
제어의 역전 (IoC)
제어의 역전이라는 개념은 프레임 워크같은 것이 대신 호출해주는 것입니다.
프로그램의 흐름을 직접 제어하는 것이 아니라 외부에서 관리해주는 것을 제어의 역전(IoC)라고 합니다.
의존관계 주입 (DI)
애플리케이션 '실행 시점(런타임)'에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결되는 것을 '의존관계 주입'이라 한다.
코드를 통해 개념을 확인해보자
DI를 적용하기 전, 일반적인 Controller와 Service, Repository의 코드 구성을 살펴보도록 하겠습니다.
Controller는 생성자에서 Service를 생성합니다.
public class Controller1 {
private final Service1 service1;
public Controller1() {
this.service1 = new Service1();
}
}
Service는 생성자에서 Repository를 생성합니다.
public class Service1 {
private final Repository1 repository1;
public Service1() {
this.repository1 = new Repository1();
}
}
Repository에는 db와 관련된 내용이 있겠죠?
public class Repository1 { ... }
이런 구성을 가진 Controller, Service, Repository를 '강한 결합'을 가진 코드라고 합니다.
서로 서로에게 의존도가 높아, 한개의 클래스를 변경했을 때 연쇄적으로 변경을 해야 되는 경우를 말합니다.
예를 들어 Repository의 생성자에서 특정 id와 password가 필요한 일이 생겼다고 하면
Service와 Controller 모두 변경을 해야 되는 일이 발생합니다.
아래와 같이 말이죠
너무 비극적이지 않나요?
이런 강한 결합을 해결하기 위해서 2가지 방법을 제시하였습니다.
1. 각 객체에 대한 객체 생성은 딱 1번만 합니다.
2. 생성된 객체를 모든 곳에서 재사용합니다.
코드로 한번 살펴보도록 하겠습니다.
우선 Repository를 생성합니다.
public class Repository1 { ... }
Service 생성자는 이미 만들어진 Repository를 매개변수로 받습니다.
Class Service1 {
private final Repository1 repitory1;
// repository1 객체 사용
public Service1(Repository1 repository1) {
this.repository1 = repository1;
}
}
Controller 생성자는 이미 만들어진 Service를 매개변수로 받습니다.
Class Controller1 {
private final Service1 service1;
// service1 객체 사용
public Controller1(Service1 service1) {
this.service1 = service1;
}
}
매개변수로 객체를 주입함으로서 객체간 의존성을 줄이는 것을 DI라고 합니다.
DI에 대해 설명을 하다 보니 뭔가 또 다른 것을 느낄 수 있었습니다.
바로 Controller -> Service -> Repository로 진행되던 흐름이, Repository -> Service -> Controller 로 변경된 것을 알 수 있습니다
이렇게 제어의 흐름이 변경되는 것을 IOC (Inversion Of Control)라고 부릅니다.
https://mangkyu.tistory.com/150
[Spring] 의존성 주입(Dependency Injection, DI)이란? 및 Spring이 의존성 주입을 지원하는 이유
1. 의존성 주입(Dependency Injection)의 개념과 필요성 [ 의존성 주입(Dependency Injection) 이란? ] Spring 프레임워크는 3가지 핵심 프로그래밍 모델을 지원하고 있는데, 그 중 하나가 의존성 주입(Depende..
mangkyu.tistory.com