본문 바로가기
웹 개발/Java Spring

Spring IOC(역전의 제어)/DI(의존관계 주입)

by 동배_ 2021. 8. 6.

IOC / DI

먼저 토비의 스프링의 책을 인용하자면 

스프링 프레임워크의 근간, 오브젝트의 생명주기와 의존관계에 대한 프로그래밍 모델,

유연하고 확장성이 뛰어난 코트를 만들 수 있게 해주는 프로그래밍 모델이다.

이 뜻이 무슨 말일까? 조금 더 자세히 알아보자

 

먼저 IoC는 Spring에서만 사용 되는 개념은 아니다. 프로그래밍 패턴이기 때문에 범용적으로 쓰인다. 그로 인해 Spring에서는 프로그래밍의 흐름을 핸들링 해주는 프레임워크이고 그것에 적합한 모델, 패턴들을 적용해야했고 이는 객체지향을 좀 더 강조할 수 있는 IoC/ Di 모델이 들어가게 된 것이다.

 

자바는 객체지향프로그래밍 언어이다. 그래서 객체 지향에 맞게 설계해야하고 좋은 객체 지향을 설계하는 5가지 설계원칙이 있다.

SRP: 단일 책임 원칙 (한 클래스는 하나의 책임만을 가져야 한다.)

OCP: 개방 폐쇄 원칙 ( 확장에는 열려있으나 변경에는 닫혀있어야한다.)

LSP: 리스코프 치환 원칙 (프로그램의 객체는 프로그램의 정확성을 깨트리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야한다)

ISP: 인터페이스 분리 원칙 (특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나 보다 낫다.)

DIP: 의존관계 역전 원칙 (프로그래머는 추상화에 의존해야지 구체화에 의존하면 안된다.)

 

여기서 객체 지향 프로그래밍을 하면서 난항에 격게되는 것이 바로 OCP, DIP 원칙이다. 예시를 들어보자.

DiscountPolicy 라는 인터페이스를 통해 FixDiscountPolicy(정액차감) , RateDiscountPolicy(정률차감)이라는 두가지 형태의 구현체가 있다고 가정해보자. 

 

그리고 주문서비스에서 정액차감 방식을 이용하고 있다고 가정해보자 그러면 코드는 

정액차감방식 코드

이러한 형태를 하고 있다. 그리고 이것을 정률 차감이라는것으로 변경하려고 하면 

new FixDiscountPolicy(); 를 new RateDiscountPolicy();로 변경해야한다. 여기서 OCP와 DIP를 위반하게 된다 

OCP(개방폐쇠원칙)은 확장에는 열려있고 변경에는 닫혀있어야하는데 정률차감으로 변경하면서 클레스내의 코드를 변경 하게 됐다.

그리고 DIP(의존관계 역전 법칙)은 현재 코드가 선언은 인터페이스, 객체생성은 구현체를 선언하여 추상화(인터페이스)에만 의존하지 않고 구현체까지 의존하고 있다. 

 

이런 문제점들을 해결하기 위해 IoC/ DI가 있는 것이다.

 

IoC

IOC란 Inversion of Control의 줄임말로 제어의 역전이라는 뜻을 지닌다.

즉 메소드나, 객체 이러한 것들의 호출을 개발자가 내부에서 코드를 변경하며 바꾸는 것이 아닌 외부에서 결정되는 것을 말한다.

 

그리고 여기서 IoC를 좀더 직관적으로 편한 게 만든 것이 DI(Dependency Injection)이라 한다.

DI는 의존관계 주입이라고 하고. 특정 객체에 필요한 객체를 외부에서 결정해서 연결 시키는 것을 말한다. 

코드를 통해 알아보자 

AppConfig

이러한 외부 클래스를 만들어 외부에서 구현체들의 의존관계를 정해준다. 앞서 말한 문제점이 있는 코드들을 외부에서 객체를 생성해주고 반환을 해준다.

그리고 클래스의 생성자를 통해 밖에서 값을 가져와 등록을 해주면 내부에서 코드를 변경하는 일이 없어져 OCP(개방 폐쇄 원칙)을 위배하지 않게 된다.

또 내부에서는 인터페이스(추상화)만을 선언하므로 구현체에 의존하지 않아 DIP(의존관계 역전 법칙)도 위배하지 않게 된다.

 

이를 통해 DIP, OCP원칙의 위배를 막을 수 있게 되고 모듈 간의 결합도가 낮아지고 확장, 유연성이 높아진다. 

즉,

1. 변경이 있을 때 수정이 쉬워진다.(외부에 설정한 코드만 변경하면됨)

2. 수정할 부분만 수정할 수 있게 됐다. 

3. 관심사의 분리가 잘 이루어진다.

 

 

그리고 이것을 편리하게 이용할 수 있게 한 프레임워크가 Spring이다. 

 

참고자료:

https://ko.wikipedia.org/wiki/%EC%9D%98%EC%A1%B4%EC%84%B1_%EC%A3%BC%EC%9E%85 //위키피디아

https://www.youtube.com/watch?v=_OI9mKuFb7c&t=193s // 우아한테크

 

 

댓글