IoC (제어역전)
- 제어권을 프레임워크가 갖는것 == 개발자는 제어권이 없다 == 제어(Control)가 역전(Inversion) 되었다.
- IoC : Inversion of Control
- 제어
- 프로그램의 흐름
- 객체의 생성
- IoC 관점에서 각자의 역할
- 개발자는 코드의 흐름이나 객체생성에 관련된 코드를 직접 작성하지 않는다.
- 개발자는 프레임워크가 제공하는 정의 방법을 사용하여 코드를 정의만 한다.
- 프레임워크는 이 정의을 보고 객체를 생성하고 코드가 동작하는 순서를 결정하여 실행한다.
Spring은 IoC라는 디자인 패턴을 지원해주는 프레임워크 중 하나이다.
Bean이라는 개념으로 이 디자인패턴을 따르고 있는데 그럼 누가 생성하며 빈의 생명주기는 어떻게 될까?
그전에 알아둬야할 용어가 몇가지있다.
1. Bean Factory
- Spring 프레임워크의 핵심 컨테이너 중 하나이며 스프링의 스펙이다.
- BeanFactory는 스프링 IoC(Inversion of Control) 컨테이너의 가장 기본적인 인터페이스로, 빈(Bean)의 생성 및 관리를 담당한다.
- 이를 통해 의존성 주입(Dependency Injection)을 구현하며, 스프링 애플리케이션에서 객체의 생명주기와 구성을 관리하는 중요한 역할을 한다.
2. Application Context
- Spring 프레임워크에서 중앙 인터페이스로, 애플리케이션의 설정 정보를 관리한다.
- 이 인터페이스는 빈 팩토리 기능을 확장하여, 애플리케이션 이벤트 처리, 리소스 로딩, 메시지 지원 등의 기능을 제공한다.
ApplicationContext는 BeanFactory의 기능을 확장 시킨 것이다. (그림1 참조)
BeanFactory, ApplicationContext, Ioc Container, Spring Container 여러 명칭으로 불려지지만 비슷한 개념이라고 생각하면된다.
3. Spring Bean
- Spring Bean은 Spring IoC(Inversion of Control) 컨테이너에서 관리되는 객체를 말한다.
- Spring 프레임워크에서는 애플리케이션의 객체들을 Bean으로 등록하고, 이들의 생성, 생명 주기, 의존성 관리 등을 컨테이너가 담당한다.
- 일반적으로 어노테이션 등으로 의존성 주입이 이루워지고, 이를 통해 느슨한 결합과 코드 재사용성, 테스트 용이성 등의 이점을 얻을 수 있다.
- Spring 에서 중요하게 관리하는 객체로 이해하면 된다.
Java Beans와는 전혀 다른 개념이다.
4. Application Runner
- Spring 애플리케이션이 시작될 때 같이 실행되는 코드
- 테스트를 위해서 자주 사용될 예정
- 앞선 예제의 Steps 처럼 구현해주면 Spring Boot 에서 자동으로 실행해준다.
5. Bean Scope
- 생명주기 종류
- singleton: ApplicationContext가 시작될 때 초기화되고, ApplicationContext가 종료될 때 소멸됨. 이는 애플리케이션 전체에서 단 하나의 인스턴스만을 유지함을 의미
- prototype: 요청될 때마다 새로운 인스턴스가 생성. 생성된 각 인스턴스는 호출자에 의해 관리되며, Spring 컨테이너는 생성 이후에 이 인스턴스를 관리하지 않음
- request(web): HTTP 요청 하나가 들어오고 나갈 때 까지 유지되는 스코프, 각각의 HTTP 요청마다 별도의 빈 인스턴스가 생성되고, 관리된다.
- session(web): HTTP Session과 동일한 생명주기를 가지는 스코프
- application(web): 서블릿 컨텍스트( ServletContext )와 동일한 생명주기를 가지는 스코프
- websocket(web): 웹 소켓과 동일한 생명주기를 가지는 스코프
요약하자면
Spring에서는 IoC라는 디자인패턴을 지원하기 위해 Bean을 사용하며 이것을 Bean Factory에서 생성하며 ApplicationContext에서 관리하고 의존성주입(DI)가 이루어진다.
'Spring > Spring Boot' 카테고리의 다른 글
Spring Boot 자동 구성과 조건(@EnableAutoConfiguration) (0) | 2024.07.30 |
---|---|
Spring Boot Main 실행흐름 (0) | 2024.07.30 |
Spring DI(의존성 주입) (0) | 2024.07.29 |
Spring Boot 소개 (0) | 2024.07.27 |
Spring Framework 소개 (0) | 2024.07.27 |