스프링의 가장 큰 특징 중 하나인 제어의 역행에 대해 정리해본다. (물론 IoC 개념을 채용한 프레임워크는 스프링만 있는 것이 아니다.)

 

일단 스프링 프레임워크뿐 아니라 모든 프로그램이 결국 일련의 작업을 컴퓨터가 처리하도록 과정화 하는 것인데, 다시 말하자면 이는 작업을 제어해 과정화하는 것이 프로그래밍 이라고 볼 수 있다. 프로그램을 작성하는 코딩에서 기존의 제어 과정을 보면, 일련의 코드 묶음을 패키지, 패키지를 트리화한 것이 라이브러리라 할 때 개발자는 자신의 코드에 필요한 기능을 라이브러리에서 호출해서 사용하게 된다. 

 

 스프링의 특징인 제어의 역전은 이와 반대로 제어가 된다는 것이다. 다시 말하자면 라이브러리(여기선 개발자가 필요에따라 플러그인 하는 라이브러리가 아닌 프레임워크를 말한다.)가 개발자가 작성한 코드를 호출하는 것이다. 제어의역전이 무슨 의미가 있을지 본다면 개발자는 자기가 구현하고자 하는 비즈니스 로직에만 신경쓰고 요청에 따라 적절한 코드를 호출하고 동작시키는 것이 프레임워크가 알아서 하도록 하는 것이 제어의역전이 꽤하고자하는 장점인 것이다.

 

 스프링 프레임워크가 어떻게 내가 작성한 코드를 호출하고 동작시키는지를 보려면 DI(Dependency Injection) 의존성주입 이라는 개념을 마주하게 된다. 의존성 주입은 별도의 포스팅 참조.

 개발자는 구현하고자 하는 기능을 코드(java에선 클래스)로 작성하면 프레임워크의 컨테이너가 자동으로 객체의 라이프사이클을 관리하게 되는 것이다.

 결과적으로 이러한 제어의 역행은 프레임워크가 프로그램의 뼈대가 되도록 하고 여러 개발자가 함께 프로젝트를 진행함에 있어서 프레임워크를 따라 공통된 방식으로 코드를 작성하게 한다. 이는 개발비용의 감소와 프로그램의 완성도를 높일 수 있게 해주는 것이다.

 

IoC 컨테이너, 여기서는 스프링 컨테이너의 역할을 보면 먼저 가장 큰 역할이 의존성주입에서 주입할 객체인 bean을 관리하는 빈 팩토리(org.springframework.beans.factory.BeanFactory)의 역할이다. 빈 팩토리는 의존성주입을 위한 빈 객체를 생성하고 관리하면서 메모리를 효율적으로 사용하도록 하고 빈 객체의 라이플사이클에서 부가적인 작업을 지원하기도 한다. (라이플사이클 인터페이스 제공)

 

  실제로 개발에 많이 사용되는 컨테이너는 빈 팩토리를 상속받아 추가적인 기능을 제공하는 어플리케이션 컨텍스트(org.springframework.context.factory.BeanFactory). 어플리에키션 컨텍스트는 인터페이스이므로 필요에 따라 이를 구현한 WebApplicationContext나 GenenralApplicationContext 등의 객체를 서블릿에서 생성해서 사용하게 된다.

 

 아래는 WAS에서 IoC 컨테이너와 의존성주입 일련의 과정을 보여주는 그림.

 

'스프링' 카테고리의 다른 글

Spring Encoding 설정  (0) 2021.01.07
Spring ComponentScan 역할과 설정  (0) 2020.12.24
DI(Dependency Injection) 의존성 주입  (0) 2020.11.26

+ Recent posts