developer-ellen
인간 디버거의 로그 찍기
developer-ellen
전체 방문자
오늘
어제
  • 분류 전체보기 (217)
    • 회고록 (0)
    • 취뽀 및 커리어 여정의 Stack (2)
      • SSAFY 7기 (2)
    • 프로그래밍공부 (24)
      • c++ (0)
      • JAVA (3)
      • Spring (5)
      • design pattern (3)
      • BackDB (1)
      • Servlet&JSP (3)
      • Vue (4)
      • JPA (4)
      • Infra (1)
      • Linux (0)
    • AI (3)
      • papers (3)
      • trend (0)
    • 프로젝트진행 (0)
      • 데이터베이스 (0)
      • 서버개발 (0)
      • 인공지능 (0)
      • 하루정리 (0)
    • 포트폴리오 (0)
    • 알고리즘 (158)
      • 알고리즘문풀 (155)
      • 알고리즘공부 (3)
    • 통계공부 (15)
      • 시계열분석 (15)
      • 회귀분석 (0)
    • CS (14)
      • 컴퓨터네트워크 (4)
      • 운영체제 (8)
      • 데이터베이스 (2)
    • 주저리주저리 (0)
      • 필사 (0)
    • 취업관련정보 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Arima
  • MA모형
  • 운영체제인터럽트
  • 데이터분석
  • SW역량테스트파이썬
  • 통계학
  • ARIMA모형
  • 코테파이썬
  • 삼성코테파이썬풀이
  • c++ 빌더 패턴
  • 삼성코테구현풀이
  • 삼성코테자바준비
  • 카카오코테
  • 통계분석
  • 시계열분석
  • SW역량테스트파이썬풀이
  • BOJ파이썬풀이
  • 삼성코테자바풀이
  • 삼성코테기출자바풀이
  • 카카오코테java풀이
  • AR모형
  • 삼성코테준비
  • 삼성코테파이썬
  • c++디자인패턴
  • 시계열
  • 삼성코테파이썬준비
  • 삼성코테자바꿀팁
  • 백준파이썬풀이
  • 삼성코테구현문제추천
  • 삼성코테기출

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
developer-ellen

인간 디버거의 로그 찍기

프로그래밍공부/Spring

Spring Bean의 개념과 생성원리 및 과정

2022. 9. 4. 18:38

1. Spring Bean이란 ?

  • Spring Bean은 Spring IoC 컨테이너가 관리하는 자바 객체로서 컨테이너에 의해 생명주기가 관리되는 객체를 의미한다. 
  • IoC 컨테이너 안에 들어있는 객체로 필요할 때마다 IoC 컨테이너에서 가져와서 사용한다.
  • 어노테이션인 @Bean을 사용하거나 xml 설정을 통해 일반 객체를 Bean으로 등록이 가능하다.
  •  즉, Spring 에서는 Bean은 ApplicationContext가 알고 있는 객체이며 ApplicationContext가 생성하고 직접 관리해주는 객체를 의미한다.

 

XML 기반의 Bean 정의 방법들
<!-- 간단한 빈 정의 -->
<bean id="..." class="..."></bean>

<!-- scope와 함께 빈 정의 -->
<bean id="..." class="..." scope="singleton"></bean>

<!-- property와 함께 빈 정의 -->
<bean id="..." class="...">
	<property name="beaninit" value="Hello World!"/>
</bean>

<!-- 초기와 메소드와 함께 빈 정의 -->
<bean id="..." class="..." init-method="..."></bean>

 

2. Spring Bean의 생명 주기

  • 객체 생성 -> 의존 설정 -> 초기화 -> 사용 -> 소멸 과정의 생명 주기를 가지고 있다.
  • Bean은 스프링 컨테이너에 의해 생명주기를 관리한다. 
  •  스프링 컨테이너가 초기화될 때 먼저 빈 객체를 설정에 맞춰 생성하며 의존 관계를 설정한 뒤 해당 프로세스가 완료되면 빈 객체가 지정한 메소드를 호출해서 초기화를 진행한다.
  • 객체를 사용해 컨테이너가 종료될 때 빈이 지정한 메서드를 호출해 소멸 단계를 거친다.
  • 스프링은 InitializingBean 인터페이스와 DisposableBean을 제공하며 빈 객체의 클래스가 InitializingBean Interface 또는 DisposableBean을 구현하고 있으며 해당 인터페이스에서 정의된 메소드를 호출해 빈 객체의 초기화 또는 종료를 수행한다.
  • 또한 어노테이션을 이용한 빈 초기화 방법에는 @PostConstruct와 빈 소멸에서는 @PreDestory를 사용한다.
// 생성 관련한 인터페이스
public interface InitializingBean { 
	void afterPropertiesSet() throws Exception;
}

// 소멸 관련한 인터페이스
public interface DispoasableBean { 
	void destroy() throws Exception;
}

public class Test implements InitializingBean, DisposableBean {

    @Override
    public void afterPropertiesSet() throws Exception {
    	//빈 생성후 메소드 호출
        System.out.println("afterPropertiesSet() 실행");
    }
    
    @Override
    public void destroy() throws Exception {
    	// 소멸을 진행하는 메소드
        System.out.println("destroy() 실행");
    }
   
    
}

 

 

3. Spring Bean의 Scope

  • Bean Scope는 기본적으로 빈이 존재하는 범위를 뜻한다.
  • Bean의 객체는 기본적으로 singleton의 범위를 가지며 singleton는 스프링 컨테이너의 시작과 종료까지 단 하나의 객체만을 사용하는 방식이다.
  • request, session, global session의 scope는 일반 spring 어플리케이션이 아니라 Spring MVC Web Application에서만 사용된다.
 Scope 설명
singleton 하나의 Bean 정의에 대해 Spring IoC Container에서 단 하나의 객체만 존재한다.
prototype 하나의 Bean 정의에 대해 다수의 객체가 존재할 수 있다.
request 하나의 Bean 정의에 대해 하나의 HTTP request의 생명주기 안에 단 하나의 객체만 존재한다. 각각의 HTTP request는 자신만의 객체를 가지며 Web-aware Spring ApplicationContext 안에서만 유효한 특징이 있다.
session 하나의 Bean 정의에 대해 하나의 HTTP Session의 생명주기 안에서 단 하나의 객체만 존재한다.  Web-aware Spring ApplicationContext 안에서만 유효한 특징이 있다.
global session 하나의 Bean 정의에 대해 하나의 global HTTP Session의 생명주기 안에서 단 하나의 객체만 존재한다. 일반적으로는 portlet context안에서만 유효하며,  Web-aware Spring ApplicationContext 안에서만 유효한 특징이 있다.

 

  • Bean의 객체 범위를 prototype으로 설정하면 객체를 매번 새롭게 생성한다는 특징이 있으며, prototype으로 설정하면 @Scope 어노테이션을 @Bean 어노테이션과 함께 사용해야 한다.

1) Singleton

  • singleton bean은 Spring 컨테이너 안에서 딱 한 번 생성되며, 컨테이너가 사라질 때는 bean고 같이 사라진다.
  • 생성된 하나의 인스턴스는 single bean cache에 저장되며 해당 bean에 대한 요청과 참조가 있을 때마다 캐시된 객체를 반환한다.
  • 기본적으로 모든 bean은 scope이 명시적이지 않으면 singleton scope을 가진다.
// xml 설정
<bean id="..." class="..." scope="singleton"></bean>

// annotaion 설정 (대상 클래스에 적용)
@Scope("singleton")

 

2) Prototype

  • prototype bean은 모든 요청에서 새로운 객체로 생성하는 것이며, 의존성 관계의 bean이 주입될 때마다 새로운 객체가 생성되어 주입된다.
  • GC에 의해 bean이 자동으로 제거된다.
// xml 설정
<bean id="..." class="..." scope="prototype"></bean>

// annotaion 설정 (대상 클래스에 적용)
@Scope("prototype")

 

'프로그래밍공부 > Spring' 카테고리의 다른 글

스프링 컨테이너  (0) 2022.06.15
IoC, DI 그리고 Container  (0) 2022.06.15
스프링이란 - 2  (0) 2022.04.11
스프링이란 - 1  (0) 2022.04.10
    '프로그래밍공부/Spring' 카테고리의 다른 글
    • 스프링 컨테이너
    • IoC, DI 그리고 Container
    • 스프링이란 - 2
    • 스프링이란 - 1
    developer-ellen
    developer-ellen

    티스토리툴바