스프링 Bean의 정의와 라이프사이클 이해하기

스프링 Bean의 정의와 라이프사이클 이해하기
스프링(Spring)은 자바 언어 기반의 오픈 소스 프레임워크로, 엔터프라이즈급 애플리케이션을 개발하기 위한 다양한 기능을 제공합니다. 스프링은 DI(Dependency Injection, 의존성 주입)와 IoC(Inversion of Control, 제어의 역전) 컨테이너를 통해 객체 간의 의존성을 관리하고, 애플리케이션의 제어 흐름을 역전시켜 개발자가 더 효율적으로 코드를 작성할 수 있도록 도와줍니다. 스프링은 다양한 모듈과 기능을 제공하며, 그 중에서도 스프링 Bean은 스프링 애플리케이션의 핵심 요소 중 하나로, 스프링 컨테이너에 의해 관리되는 객체를 말합니다. ### 스프링 Bean이란 무엇인가? 스프링 애플리케이션은 다양한 객체로 구성되어 있으며, 이 객체들은 스프링 컨테이너에 의해 생성, 관리, 조립되어야 합니다. 이때 스프링이 관리하는 객체를 스프링 Bean이라고 합니다. 스프링 Bean은 일반적으로 POJO(Plain Old Java Object)로 정의되며, 스프링 설정 파일(XML 또는 Java Config)에 등록되어 스프링 컨테이너가 해당 Bean을 인식하고 관리할 수 있도록 합니다. ### 스프링 Bean의 라이프사이클 스프링 Bean은 라이프사이클이라는 단계를 거쳐 생성되고 소멸됩니다. 스프링은 다음과 같은 라이프사이클 단계를 가지고 있습니다. 1. Bean Definition: 스프링 설정 파일에 Bean이 정의됩니다. 2. Bean Instantiation: 스프링 컨테이너가 Bean을 생성합니다. 3. Set Bean Properties: Bean의 속성(의존성)이 설정됩니다. 4. Bean의 초기화: Bean이 초기화됩니다. 이 단계에서 `init()` 메서드가 호출됩니다. 5. Bean 사용: Bean이 애플리케이션에서 사용됩니다. 6. Bean 소멸: Bean이 소멸됩니다. 이 단계에서 `destroy()` 메서드가 호출됩니다. ### Bean 라이프사이클 메서드 스프링은 Bean의 라이프사이클을 관리하기 위해 초기화와 소멸 단계에서 특정 메서드를 호출할 수 있는 방법을 제공합니다. 1. InitializingBean과 DisposableBean 인터페이스 구현: Bean 클래스가 `InitializingBean`과 `DisposableBean` 인터페이스를 구현하면 `afterPropertiesSet()`과 `destroy()` 메서드를 오버라이딩하여 초기화와 소멸 단계에서 필요한 작업을 수행할 수 있습니다.

public class MyBean implements InitializingBean, DisposableBean {
    @Override
    public void afterPropertiesSet() {
        // Bean 초기화 작업 수행
    }

    @Override
    public void destroy() {
        // Bean 소멸 작업 수행
    }
}

2. @PostConstruct와 @PreDestroy 애노테이션 사용: Bean 메서드에 `@PostConstruct`와 `@PreDestroy` 애노테이션을 사용하여 초기화와 소멸 단계에서 실행될 메서드를 지정할 수 있습니다.

public class MyBean {
    @PostConstruct
    public void init() {
        // Bean 초기화 작업 수행
    }

    @PreDestroy
    public void cleanup() {
        // Bean 소멸 작업 수행
    }
}

### Bean Scope 또 다른 중요한 개념은 Bean의 Scope(범위)입니다. Bean의 Scope는 Bean이 생성되고 관리되는 범위를 나타내며, 스프링은 다음과 같은 Scope를 제공합니다. 1. Singleton: 기본적으로 스프링은 Bean을 Singleton으로 생성합니다. 따라서 애플리케이션 전체에서 하나의 인스턴스를 공유합니다. 2. Prototype: Bean을 요청할 때마다 새로운 인스턴스를 생성합니다. 3. Request: HTTP 요청마다 하나의 인스턴스를 생성합니다. 4. Session: HTTP 세션마다 하나의 인스턴스를 생성합니다. 5. Global Session: Portlet 애플리케이션의 전역 세션과 동일한 범위로 Bean을 생성합니다. ### 결론 스프링 Bean은 스프링 애플리케이션의 핵심 요소로, 스프링 컨테이너에 의해 생성되고 관리되는 객체를 말합니다. Bean은 라이프사이클을 거쳐 초기화되고 소멸되며, Bean의 Scope는 Bean이 생성되고 관리되는 범위를 결정합니다. Bean의 라이프사이클과 Scope를 이해하면 스프링 애플리케이션을 효율적으로 개발하고 유지보수할 수 있습니다. 스프링을 사용하면서 Bean의 정의와 라이프사이클을 잘 이