Spring been lifecycle
                                            
                                                
                                                
                                                
                                                
                                                
                                                 9588 단어  Spring FrameworkSpring Framework
                    
개요
- Spring Bean 라이프 사이클에 대해 알아본다.
 
개념
IoC (Injection of Control)
- Spring에서는 Spring Container, IoC Container라는 개념을 사용한다.
- Container는 인스턴스의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것
 - Spring Container는 Spring Framework의 핵심부에 위치하며, 객체 주입을 이용하여 Application을 구성하는 Component들을 관리한다.
 
 - 이때 Spring Container에서 생성되는 객체를 Bean이라고 한다.
- 어플리케이션 전반에서 Spring IoC 컨테이너를 받아서 사용한다면 그 인스턴스들은 항상 같은 객체일 것이며, 메모리 면에서도 효율적이고 런타임시에 성능 최적화에도 좋다.
 
 
빈(Bean)
- Spring IoC 컨테이너가 관리하는 Java 객체를 빈(Bean) 이라는 용어로 부른다. 
- Spring Bean Container에 존재하는 객체
 
 
빈(Bean) 의 생성방식
- Component Scanning
- Spring IoC Container가 IoC Container를 만들고 그 안에 Bean을 등록할때 사용하는 Interface들을 Life Cycle Callback이라고 부른다.
 - 이때, @ComonentScan Annotation이 붙어있는 Class가 이에 해당한다.
 - @ComponentScan은 어느 지점부터 Component를 찾으라고 알려주는 역할을 하고,
 - @Component는 실제로 찾아서 Bean으로 등록할 Class를 의미한다.
 
 

- 
일반적으로 컴포넌트 클래스들에 @Component를 붙일 수 있지만, @Repository, @Service, @Controller를 붙인다면
도구들이 클래스들을 처리하는데 더 적합하도록 할 수 있고 관점(aspects)에 더 연관성을 부여할 수 있다 - 
빈(Bean) 설정 파일에 직접 빈을 등록
- 빈 설정 파일은 XML 과 자바 설정파일로 작성할 수 있는데, 추세는 자바 설정파일이 많이 사용되고 있다고 함
 
 
빈 라이플 사이클과 빈 범위 (Scope)
- 스프링 컨테이너는 빈 객체를 생성하고, 프로퍼티를 할당하고 초기화를 수행, 사용이 끝나면 소멸시키는 일련의 과정을 관리한다. 
- 객체 생성 - 초기화 - 사용 - 소멸 순으로 유지
 - 스프링에서는 init 이벤트와 destroy 이벤트가 주로 사용됨
- 해당 시점에 이벤트를 캐치하는 방법은 세가지가 존재함 
- Interface 구현
 - 커스텀 init 메소드 (Bean 정의)
 - Annotation 지정
 
 
 - 해당 시점에 이벤트를 캐치하는 방법은 세가지가 존재함 
 
 
인터페이스 구현
public class ViewrainService implements InitializingBean, DisposableBean{
 
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("bean 생성 및 초기화 : afterPropertiesSet() 호출됨");
    }
 
    @Override
    public void destroy() throws Exception {
        System.out.println("bean 생성 소멸 : destroy 호출됨");
    }
 
    // 중략...
}
Bean 정의시 메소드 지정
<bean id="BBean" class="com.example.viewraintoy.service.ViewrainService"
                      init-method="init" destroy-method="destroy"/>
어노테이션 지정
@PostConstruct
public void init() {
    System.out.println("======================================");
    System.out.println("bean 생성 및 초기화 : init() 호출됨");
    System.out.println("======================================");
}
@PreDestroy
public void destroy() {
    System.out.println("======================================");
    System.out.println("bean 생성 소멸 : destroy 호출됨");
    System.out.println("======================================");
}
Bean Scope
- 스프링에서 Bean으로 지정된 객체는 기본적으로 singleton(싱글톤) 객체로 관리된다.
 - scope(범위) 키워드
 
| 스코프 종류 | 설명 | 
|---|---|
| singleton | 기본 싱클톤 스코프 | 
| prototype | 어플리케이션에서 요청시(getBean()) 마다 스프링이 새 인스턴스를 생성 | 
| requset | HTTP 요청별로 인스턴스화 되면 요청이 끝나면 소멸(spring mvc webapplication 용도) | 
| session | HTTP 세션별로 인스턴스화 되면 세션잉 끝나며 소멸(spring mvc webapplication 용도) | 
| global session | 포틀릿 기반의 웹 어플리케이션용도, 전역 세션 스코프의 빈은 같은 스프링 MVC를 사용한 포탈어플리케이션 내의 모든 포틀릿 사이에서 공유 할 수 있다. | 
| thread | 새 스레드에서 요청하면 새로운 bean 인스턴스를 생성, 같은 스레드에 대해서는 항상같은 bean 인스턴스가 반환 | 
| custom | org.pringframework.beans.factory.config.Scope를 구현하고 커스텀 스코프를 스프링의 설정에 등록하여 사용 | 
Scope의 종류
- 싱글톤
- Spring 프레임워크에서 기본이 되는 스코프
 - 스프링 컨테이너의 시작과 종료까지 1개의 객체로 유지됨
 
 - 프로토타입
- 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 스코프
 - 요청이 오면 항상 새로운 인스턴스를 생성하여 반환하고 이후에 관리하지 않음
 - 프로토타입을 받은 클라이언트가 객체를 관리해야 함
 
 - 웹
- request : 각 요청이 들어오고 나갈때까지 유지되는 스코프
 - session : 세션이 생성되고 종료될 때까지 유지되는 스코프
 - application : 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프
 
 
참고
- 싱글톤으로 적합한 객체 
- 상태가 없는 공유 객체
 - 읽기용으로만 상태를 가진 공유 객체
 
 - 비 싱글톤으로 적합한 객체
- 쓰기가 가능한 상태를 지닌 객체
 - 상태가 노출되지 않은 객체
 
 
Author And Source
이 문제에 관하여(Spring been lifecycle), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@viewrain/Spring-been-lifecycle저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)