Spring의 Bean

viroovr·2024년 10월 16일

Spring. 프레임워크란 특성상 배워야할 것들이 많다.
그만큼 익숙해지면 편리하고 다양한 기능들을 구현할 수 있지만 처음에는 역시 어렵다.
controller, service, repository 등으로 기능별로 나누어 구현하기가 매우 간편하고 이를 알아서 프레임워크에서 관리해주니 편리하다.

하지만 이론적으로 어떤 것들이 설정되는지 궁금하다.
그 중심에는 Bean이 존재한다.

Spring Bean은 무엇일까

Spring Bean은 스프링 프레임워크의 핵심개념으로, 스프링 컨테이너에 의해 관리되는 객체를 의미한다. Spring IoC 컨테이너는 애플리케이션에서 필요한 객체를 생성하고, 이 객체들의 생명 주기를 관리하며, 의존성을 주입하는 역할을 한다. 이 때 Spring Bean은 컨테이너가 관리하는 구성 요소로, 스프링 애플리케이션에서 중요한 비즈니스 로직이나 데이터 처리를 담당하는 객체가 Bean으로 등록된다.

스프링 컨테이너에 담기고 관리되는 Bean. 의존성을 주입하는 것이 Bean의 존재 의의와 제일 가깝다.

Spring Bean은 보통 애노테이션이나 XML 설정을 통해 정의되며, 컨테이너에 의해 자동으로 생성되고, 필요에 따라 의존성이 주입된다. 대표적인 애노테이션으로는 @Component, @Service, @Repository, @Controller 등이 있으며, 이들은 Bean으로 등록될 클래스들을 나타낸다.

Bean이라고 다 같은 것이 아니라 세부적인 기능에 따라 Bean을 나누어 지정할 수 있다. 지정된 이름의 역할에 대해 개발자는 잘 알고 있어야 한다.

Bean은 어떤 생성과정을 거치게 될까?
Spring Container가 생성, 초기화, 의존성 주입, 소멸까지 모든 생명주기를 관리해준다.

  1. 스프링 애플리케이션이 시작되면, 스프링 컨테이너가 초기화된다. 이때 설정파일이나 애노테이션을 바탕으로 Bean 정의가 로드된다.

  2. 스프링 컨테이너는 애플리케이션에서 정의된 Bean의 정보를 로드한다. 여기에는 어떤 클래스가 Bean으로 등록되어 있는지, 의존성 정보, Scope, 초기화 및 소멸 메서드 등이 포함된다.

  3. 스프링 컨테이너는 Bean을 실제로 인스턴스화 한다. 이때 Bean이 Singleton Scope인 경우, 컨테이너에서 단 하나의 인스턴스를 생성하고 재사용하며, Prototype Scope인 경우 매번 새로운 인스턴스를 생성한다.

  4. 인스턴스화된 Bean에 필요한 의존성을 주입한다. 스프링은 생성자 주입, 세터 주입, 필드 주입 중 하나를 통해 의존성을 주입한다. 이 과정에서 @Autowired, @Inject 같은 애노테이션을 사용하여 의존성 주입을 명시할 수 있다.

  5. Bean이 완전히 생성되고 의존성 주입이 완료되면, 스프링 컨테이너는 Bean의 초기화 메서드를 호출한다. @PostConstruct 애노테이션이나 InitializingBean 인터페이스의 afterPropertiesSet() 메서드, XML설정에서 init-method 속성으로 정의된 메서드가 이 단계에서 실행된다.

  6. Bean이 생성되고 초기화된 후, 애플리케이션이 실행되는 동안 스프링 컨테이너는 필요에 따라 Bean을 제공하여 비즈니스 로직을 수행하게 된다.

  7. 애플리케이션이 종료되거나 Bean의 수명이 끝나면 스프링 컨테이너는 Bean의 소멸 메서드를 호출하며 리소스를 정리한다. @PreDestroy 애노테이션이나 DisposableBean 인터페이스의 destroy() 메서드, 또는 XML 설정에서 destroy-method 속성으로 정의된 메서드가 호출된다.

요약하면 스프링 컨테이너 초기화가 이뤄진 후, 정의된 Bean의 정보를 컨테이너에 로드한다. 그리고 Bean의 정의나 애노테이션에 맞게 Bean을 생성한다. 이 때 Scope에 맞게 새로운 인스턴스를 생성한다. 이후, Bean에 필요한 의존성들을 주입해주고 Bean의 초기화 메서드를 실행한다.
Bean의 생성과 초기화가 완료되면 필요한 인스턴스에 사용되어 비즈니스 로직을 수행한다. 애플리케이션이 종료되면 소멸 메서드를 호출하고 리소스를 회수한다.

객체 지향 프로그래밍에 부합하면서 리소스를 효율적으로 사용하는 스프링의 장점을 엿볼 수 있다.

profile
성장하는 개발자

0개의 댓글