[Spring] 03-4. IoC와 DI

지찬우·2023년 1월 1일
0

Spring

목록 보기
13/27
post-thumbnail

이 시리즈는 인프런 강의(김영한 님의 ‘스프링 핵심 원리 - 기본편’)로 공부하며 혼자 기록하고, 사람들과도 공유할 수 있도록 작성하는 글이다. 최대한 추가적인 정보는 공식 홈페이지, 문서를 보며 얻을 예정이다.
(개인적인 생각과 이해가 들어가 있기 때문에 저의 ‘무식함’이 있을 수 있습니다😜 혹시라도 이 글을 보게 되시는 분이 계시다면 잘못된 부분 댓글로 많이 알려주시면 너무 감사하겠습니다!!)

GitHub Repository : https://github.com/jcw1031/spring-core-study


IoC • DI • 컨테이너

스프링 공부를 해 보면, IoC나 DI 등과 같은 용어들을 많이 접하게 된다. 나도 스프링을 처음 접했을 때 스프링에 대해 검색해 보면 이러한 용어들을 자주 볼 수 있었던 것 같다. 무슨 의미인지 정확하게 알지 못했지만 이번 강의에 이 용어들에 대해 설명해 주셔서 어느 정도 이해할 수 있었다.

📌 제어의 역전(IoC : Inversion of Control)

프로그램의 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것이 제어의 역전 IoC이다.

우리가 개발한 예제 코드를 보면, 처음에는 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고 연결하고 실행했다. 이후에 AppConfig라는 구성을 담당하는 클래스를 만들어 이 AppConfig가 구현 객체를 생성하고 주입해 주는 역할을 하게 되었다. 이처럼 ‘직접 호출하는 것이 아닌 프레임워크 등이 대신 코드를 호출해 주는 것’이 제어의 역전이다.

프레임워크 🆚 라이브러리

프레임워크와 라이브러리를 구분하는 것은 어려운 것 같다. 그래서 그런지 강의에서 잠깐 언급을 해주시는데, 프레임워크는 Spring이나 JUnit처럼 ‘내가 작성한 코드를 제어하고 대신 실행하는 것’이라고 하고, 라이브러리는 ‘내가 작성한 코드가 직접 제어의 흐름을 담당하는 것’이라고 한다.

이 말로는 이해가 잘되지 않아 따로 좀 더 알아보았는데, 어떤 분이 Velog에 설명을 잘 해주셔서 참고했다.(Reference : https://velog.io/@nemo/framework-library-gfreqbgx)

라이브러리는 도구같은 것으로, 필요할 때 자유롭게 가져와 내 코드에서 사용할 수 있는 것이고, 프레임워크는 내 코드의 흐름을 관리하는 것으로, 정해진 규칙과 틀 안에서 내가 코드를 작성하면 프레임워크가 그 코드를 흐름에 맞게 실행해 주는 것이다.

Spring 프레임워크가 우리의 코드를 흐름에 맞게 실행해 주고, 필요할 때 Jackson 라이브러리를 사용해 Json 데이터를 객체로(또는 객체를 Json 데이터로) 변환해 주는 것을 생각해 보면 될 것 같다.


📌 의존관계 주입(DI : Dependency Injection)

애플리케이션 실행 시점(런타임)에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달하여 클라이언트와 서버의 실제 의존관계가 연결되는 것이 의존관계 주입 DI이다.

의존관계는 정적인 ‘클래스 의존관계’와 실행 시점에 결정되는 동적인 ‘객체(인스턴스) 의존관계’ 이 둘을 분리하여 생각해야 한다. 회원 도메인과 주문 및 할인 정책 도메인 설계 때 언급했던 내용이다!

회원 도메인 설계

  • 정적인 클래스 의존관계 : 애플리케이션을 실행하지 않아도 분석 가능

    OrderServiceImplMemberRepository 인터페이스와 DiscountPolicy 인터페이스에 의존한다는 것은 알 수 있지만, 실제로 어떤 구현 객체가 주입될지는 알 수 없다.


  • 동적인 객체 인스턴스 의존관계 : 애플리케이션 실행 시점에 생성된 객체 인스턴스의 참조가 연결된 의존관계

    애플리케이션이 실행되면 AppConfig를 통해 MemberRepository 인터페이스와 DiscountPolicy 인터페이스에 어떤 구현 객체가 주입되었는지 알 수 있다.

컨테이너

AppConfig처럼 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것을 IoC 컨테이너 또는 DI 컨테이너라고 한다. IoC 컨테이너와 DI 컨테이너는 같은 의미이지만, 최근에는 IoC가 너무 범용적이기 때문에 의존관계 주입에 초점을 맞추어 DI 컨테이너라고 많이 부른다.


IoC와 DI, 컨테이너, 프레임워크와 라이브러리 등의 용어들에 대해 공부해 봤다. 다음 시간에는 우리가 순수 자바 코드로 개발한 예제에 드디어 스프링을 적용해 보겠다.

profile
좋은 개발자가 되자.

0개의 댓글