티스토리 뷰

spring

IoC (Spring에 국한된 것 아님!)

kirinman 2022. 12. 30. 14:33

이전까지 내가 프로그래밍을 하던 방식은 코드를 짜다가 필요한 객체가 있으면 생성해서 쓰고, 또 생성해서 쓰고 이런식으로 진행하였다.즉 구현 객체가 프로그램의 제어 흐름을 스스로 통제하고 제어하는 것이었다.

 

이렇게 내가 제어하고 컨트롤하는 스타일로 개발을 하였는데

IoC, 즉 제어의 역전은 내가 뭔가를 호출하는 것이 아니라 프레임워크 같은 것이 대신 호출해 주는 것이다.

 

 

아래와 같은 코드들이 있다고 해 보자.

 

일단 OrderServiceImpl이라는 코드만 보았을 때 알 수 있는 것은 

"이건 일단 orderService라는 인터페이스 구현체이네?"

"그리고 memberRepository랑 discountPolicy를 뭐 가져오는갑다"

"이거 생성하려면 memberRepository랑 discountPolicy 써야되네"

"인터페이스때문에 구현해야 되는 메소드가 createOrder구나"

정도의 내용이고, 머릿속에서

"이건 createOrder라는 일을 하는 애구나" 정도로 요약할 수 있을 것이다.

 

하지만 나는 discountPolicy가 무엇인지, memberRepository의 내부가 어떻게 되어있는지는 이것만 봐서는 알 수가 없다.

discountPolicy나 memberRepository에 대해서 어떤 게 호출되는 지 지금 이 orderServiceImpl에서는 모르는 것이다.

 

orderServiceImpl은 자기 로직을 실행하는 역할만 한다.

어떤 것이 실행될 지를 결정하는 프로그램에 대한 제어는 Appconfig가 가지고 있는 것이다.

 

심지어 OrderService라는 인터페이스의 구현체가 OrderServiceImpl이 아닐 수도 있다.

내가 코드를 짜다가 필요에 의해 OrderServiceImpl2를 만들어서 Appconfig에서 갈아끼울 수도 있으니까.

 

하지만 orderServiceImpl 그런 사실을 모른다.

내가 실행되는지 아닌지도 모르고 그저 자기 로직을 실행하기만 하는 것이다.

 

이렇게 프로그램의 제어 흐름을 개발자가 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전, Ioc라고 한다.

 

이 개념을 통해 생각할 수 있는 것이 프레임워크이다.

프레임워크는 제어의 역전 개념이 적용된 대표적인 기술이라고 할 수 있다.

우리의 코드가 프레임워크의 일부분이 되어 프레임워크에 의해 제어되기 때문이다.

반면에 라이브러리는 내 프로젝트의 일부분으로써 라이브러리를 가져와 내가 직접 제어하는 방식이다.

'spring' 카테고리의 다른 글

테스트코드 작성시, assertThat().isEqualTo 와 isSameAs  (0) 2022.12.30
DI  (0) 2022.12.30
싱글톤 패턴  (0) 2022.12.30
@Entity / @Table  (0) 2022.12.30
@Enumerated  (0) 2022.12.30
댓글