[Spring] : Spring Bean (개념, Scope, 생명 주기)

dohyoungK·2024년 5월 14일
0

면접 스크립트

목록 보기
28/30
post-thumbnail

[Spring] : Spring Bean

빈(Bean)은 스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트이다.

스프링 컨테이너가 관리하는 자바 객체를 의미하고, 컨테이너는 하나 이상의 빈을 관리한다.

빈은 인스턴스화된 객체이고, 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.


Spring Bean 등록 방법

스프링은 약속된 어노테이션이 붙어있는 클래스를 자동으로 인지한다.

또는 Bean Configuration File에 직접 빈을 등록해 사용할 수 있다.

@Component

스프링에서 관리하는 요소라는 의미의 일반적인 어노테이션이다.

@Controller

Spring MVC의 컨트롤러 역할을 하는 클래스를 의미하는 어노테이션이다.

@RestController

@Controller와 @ResponseBody를 함께 사용한 조합의 어노테이션이다.

@Service

서비스 역할을 하는 클래스를 의미하는 어노테이션이다.

Controller는 들어온 요청을 처리하기 위해 Service를 호출하고, Service는 Controller로부터 받은 정보를 가지고 로직을 처리하는 방식으로 가공해 Controller에 다시 넘겨준다.

@Repository

DAO 혹은 레포지토리 역할을 하는 클래스를 표시하는 어노테이션이다.

DB나 파일같은 외부 I/O에 접근하는 메소드를 사용하기 위한 인터페이스임을 의미할 수 있다.

Bean Configuration File에 직접 등록

@Configuration
public class HelloConfiguration {
	@Bean
    public HelloController sampleController() {
    	return new SampleController;
    }
}

Spring Bean의 Scope

Bean Scope는 빈이 존재하는 범위를 뜻한다.

Bean 객체는 기본적으로 singleton의 범위를 가지며 singleton은 스프링 컨테이너의 시작과 종료까지 단 하나의 객체만을 사용하는 방식이다.

request, session, global session의 범위는 일반 Spring 어플리케이션이 아니라 Spring MVC Web 어플리케이션에서만 사용된다.

범위설명
singleton하나의 Bean은 단 하나의 객체만 존재한다.
prototype하나의 Bean은 다수의 객체가 존재할 수 있다.(의존성 관계의 Bean이 주입될 때마다 새로운 객체가 생성되어 주입된다.)
request하나의 Bean은 하나의 HTTP request의 생명주기 안에 단 하나의 객체만 존재한다.
session하나의 Bean은 하나의 HTTP Session의 생명주기 안에서 단 하나의 객체만 존재한다.
global session하나의 Bean은 하나의 global HTTP Session의 생명주기 안에서 단 하나의 객체만 존재한다.

Spring Bean 생명 주기

  1. 스프링 IoC 컨테이너 생성
  2. 스프링 빈 생성
  3. 의존관계 주입
  4. 초기화
  5. 사용
  6. 소멸
  7. 스프링 종료

스프링 컨테이너가 초기화 될 때 빈 객체를 생성하고,

의존관계 주입 완료 후 빈 객체가 지정한 메소드를 호출해 초기화한다.

그리고 스프링 컨테이너가 종료되기 직전에도 빈이 지정한 메소드를 호출해 소멸 과정을 진행한다.

Bean 생명주기 콜백 방법

1. 인터페이스 (InitializingBean, DisposableBean)

public class ExBean implements InitializingBean, DisposableBean {
 
    @Override
    public void afterPropertiesSet() throws Exception {
        // 초기화 콜백 (의존관계 주입이 끝나면 호출)
    }
 
    @Override
    public void destroy() throws Exception {
        // 소멸 전 콜백 (Bean 종료 전 메모리 반납, 연결 종료와 같은 과정)
    }
}

빈 객체의 클래스가 InitializingBean, DisposableBean을 구현하며 해당 인터페이스에서 정의된 메소드를 호출해 빈 객체의 초기화 또는 종료를 수행한다.

2. 설정 정보에서 초기화 메소드, 종료 메소드 지정

public class ExBean {
 
    public void initialize() throws Exception {
        // 초기화 콜백 (의존관계 주입이 끝나면 호출)
    }
 
    public void close() throws Exception {
        // 소멸 전 콜백 (메모리 반납, 연결 종료와 같은 과정)
    }
}
 
@Configuration
class LifeCycleConfig {
 
    @Bean(initMethod = "initialize", destroyMethod = "close")
    public ExBean exBean() {
        ...
    }
}

3. 어노테이션을 이용한 빈 초기화(@PostConstruct), 종료(@PreDestroy)

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
 
public class ExampleBean {
 
    @PostConstruct
    public void initialize() throws Exception {
        // 초기화 콜백 (의존관계 주입이 끝나면 호출)
    }
 
    @PreDestroy
    public void close() throws Exception {
        // 소멸 전 콜백 (메모리 반납, 연결 종료와 같은 과정)
    }
}

0개의 댓글