[Spring] IoC

Jinny Kim·2021년 7월 28일
0

Spring

목록 보기
2/6

제어 반전 (Ioc : Inversion of Control)


프로그래머가 작성한 프로그램이 외부 라이브러리의 코드를 호출해 이용하는 것이 일반적이다. 하지만 제어 반전이 적용된 구조에서는 외부 라이브러리의 코드가 프로그래머가 작성한 코드를 호출한다. 즉, "제어의 역전"이라는 의미로, 메소드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라 외부에서 결정되는 것을 의미한다.


기존에 객체가 만들어지고 실행되는 순서는 다음과 같다.

  1. 객체 생성
  2. 의존성 객체 생성
    클래스 내부에서 생성
  3. 의존성 객체 메소드 호출

반면, 스프링에서 객체가 만들어지고 실행되는 순서는 다음과 같다.

  1. 객체 생성
  2. 의존성 객체 주입
    스스로가 만드는 것이 아니라 제어권을 스프링에게 위임하여 스프링이 만들어놓은 객체를 주입한다.
  3. 의존성 객체 메소드 호출

즉, 모든 의존성 객체를 스프링이 실행될 때 다 만들어주고 필요한 곳에 주입시켜 줌으로써 Bean들은 싱글턴 패턴의 특징을 가지며, 제어의 흐름을 사용자가 컨트롤 하는 것이 아니라 스프링에게 맡겨 작업을 처리하게 된다.

스프링 컨테이너는 보통 인스턴스의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것이라고 할 수 있다.
즉, 컨테이너란 개발자가 작성한 코드의 처리 과정을 위임받은 독립적인 존재로, 적절한 설정만 되어 있다면 프로그래머가 작성한 코드를 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 컨트롤해준다.
스프링 컨테이너는 스프링 프레임워크 핵심부에 위치하며, 종속 객체 주입을 이용하여 애플리케이션을 구성하는 컴포넌트들을 관리한다. 이때 스프링 컨테이너에서 생성되는 객체를 Bean 이라고 한다.




Bean 생성 과정

스프링에서 Bean은 개발자가 공급하는 설정 메타 데이터 (XML파일) 혹은 어노테이션 (@) 에 의해 생성된다. 클래스를 생성한 뒤, 어노테이션 (@Controller, @Service ... )를 선언하거나, xml (servlet-context.xml, root-context.mxl ...)에 선언해 준다면 해당 클래스가 bean으로 생성된다.



목적


IoC의 목적은 객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 하여 가독성 및 코드 중복, 유지 보수를 편하게 하고자 함에 있다.


결론


일반적으로 자바 프로그램은 main() 메소드에서 시작해서 개발자가 미리 정한 순서를 따라 객체가 생성되고 실행된다. 하지만 서블릿을 개발하여 서버에 배포하고 난 후에는 개발자가 직접 제어할 수 있는 방법이 없다. 개발자를 대신하여 서블릿에 대한 제어 권한을 가진 컨테이너가 적절한 시점에 서블릿 클래스의 객체를 만들고 그 안의 메소드를 호출한다.

스프링 컨테이너가, 개발자가 공급한 xml 혹은 어노테이션 @ 등의 정보를 바탕으로 스스로 객체를 생성하고 실행시키며 Bean 객체를 관리하는 것을 IoC라고 한다.






참조 사이트


https://jobc.tistory.com/30
https://leveloper.tistory.com/33
https://cofived.tistory.com/39

profile
공부한 것들을 기록합니다.

0개의 댓글