Spring

스프링 빈 (Spring Bean)

국자집사 2025. 1. 7. 17:25

[ 목차 ]

    스프링 빈(Spring Bean)

    1. 스프링 빈이란?

    스프링 빈(Spring Bean)스프링 IoC(Inversion of Control) 컨테이너에 의해 관리되는 객체이다. 스프링 애플리케이션의 핵심 구성 요소로, 애플리케이션의 모든 객체는 빈으로 등록되어야 IoC 컨테이너가 이를 관리하고 의존성을 주입할 수 있다.

    • 정의: 스프링 IoC 컨테이너에 의해 생성되고 관리되는 객체.
    • 역할: 애플리케이션의 비즈니스 로직, 데이터 액세스 객체, 서비스 등을 빈으로 정의.
    • 특징:
      • 필요할 때 컨테이너에서 빈을 가져와 사용할 수 있음.
      • 생명주기와 의존성 관리가 자동화.

    2. 스프링 빈의 생성과 등록 방법

    2-1. 어노테이션 설정

    스프링 2.5 이후부터는 어노테이션을 사용하여 빈을 등록할 수 있다.

    아래의 어노테이션으로 등록된 클래스들은 스프링 컨테이너에 의해 자동으로 생성되어 스프링 빈으로 등록됨.

    • @Component: 일반적인 빈으로 등록.
    • @Service: 서비스 레이어를 나타냄.
    • @Repository: 데이터 액세스 객체(DAO)를 나타냄.
    • @Controller: MVC 패턴의 컨트롤러를 나타냄.
    @Component
    public class UserService {
        @Autowired
        private UserRepository userRepository;
    }

     

    2-2. Java Config 설정

    스프링 3.0부터 제공된 방법으로, 자바 클래스를 사용하여 수동으로 빈을 등록한다.

    자바 설정 클래스를 만들고  @Configuration 어노테이션을 클래스 선언부 위에 추가, 그리고 특정 타입을 리턴하는 메소드를 만들고, @Bean 어노테이션을 붙여주면 자동으로 해당 타입의 빈 객체가 생성된다.

    @Configuration
    public class AppConfig {
    
        @Bean
        public UserRepository userRepository() {
            return new UserRepository();
        }
    
        @Bean
        public UserService userService() {
            return new UserService(userRepository());
        }
    }

     

     

    @Bean 어노테이션의 주요 내용

    • @Configuration 설정된 클래스의 메소드에서 사용가능
    • 메소드의 리턴 객체가 스프링 빈 객체임을 선언함
    • 빈의 이름은 기본적으로 메소드의 이름
    • @Bean(name="name")으로 이름 변경 가능
    • @Scope를 통해 객체 생성을 조정할 수 있음
    • @Component 어노테이션을 통해 @Configuration 없이도 빈 객체를 생성할 수도 있음
    • 빈 객체에 init(), destroy() 등 라이프사이클 메소드를 추가한 다음 @Bean에서 지정할 수 있음

     


    3. 스프링 빈의 생명주기

    스프링 빈은 IoC 컨테이너에서 관리되며, 다음과 같은 생명주기를 가진다.

    1. 객체 생성: 컨테이너가 빈의 인스턴스를 생성.
    2. 의존성 주입: 빈 간의 의존성을 설정.
    3. 초기화: 초기화 메서드(@PostConstruct 또는 초기화 메서드 설정) 호출.
    4. 사용: 애플리케이션 실행 중 빈 사용.
    5. 소멸: 컨테이너 종료 시 소멸 메서드(@PreDestroy 또는 소멸 메서드 설정) 호출.

    초기화와 소멸 메서드 예제

    @Component
    public class UserService {
    
        @PostConstruct
        public void init() {
            System.out.println("UserService initialized");
        }
    
        @PreDestroy
        public void destroy() {
            System.out.println("UserService destroyed");
        }
    }

     

     

    4. 스프링 빈의 스코프(Scope)

    스프링 빈은 다양한 스코프를 가질 수 있으며, 이는 빈의 생성 및 사용 범위를 결정한다.

     

    - 스프링에서 지원하는 스코프 :

    • 싱글톤(Singleton) (기본값): 애플리케이션당 한 번 생성.
    • 프로토타입(Prototype): 요청할 때마다 새 인스턴스 생성.
    • 요청(Request): HTTP 요청당 한 번 생성 (웹 애플리케이션에서 사용).
    • 세션(Session): HTTP 세션당 한 번 생성.
    • 애플리케이션(Application): ServletContext 범위에서 한 번 생성.

    스코프 설정 예제

    @Component
    @Scope("prototype")
    public class UserService {
        // 빈 스코프가 프로토타입으로 설정됨
    }

     


    5. BeanDefinition

    스프링의 다양한 설정 형식(Java, XML 등)은 BeanDefinition이라는 추상화 덕분에 할 수 있는 것이다.

    Bean은 BeanDefinition(빈 설정 메타정보)으로 정의되고, BeanDefinition에 따라 활용하는 방법이 달라진다.

     

    BeanDefinition은 속성에 따라 컨테이너가 Bean을 어떻게 생성하고 관리할지를 결정한다.

    @Bean 어노테이션 또는 <bean> 태그당 1개씩 메타 정보가 생성된다.

     

    Spring이 설정 메타정보를 BeanDefinition 인터페이스를 통해 관리하기 때문에 컨테이너 설정을 XML, Java로 할 수 있는 것이다.

    스프링 컨테이너는 설정 형식이 XML인지 Java 코드인지 모르며, BeanDefinition만 알면 된다.

     

    BeanDefinition 정보

    • BeanClassName : 생성할 빈의 클래스 이름
    • factoryBeanName : 팩토리 역할의 빈을 사용할 경우의 이름 (appConfig, … 등)
    • factoryMethodName : 빈을 생성할 팩토리 메서드 지정 (memberService, … 등)
    • Scope : 싱글톤(기본값)
    • lazyInit: 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때까지 최대한 생성을 지연 처리하는지 여부
    • InitMethodName: 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
    • DestroyMethodName: 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명
    • Constructor arguments, Properties: 의존관계 주입에서 사용한다. (자바 설정처럼 팩토리 역할의 빈을 사용하면 없음

    6. 스프링 빈의 장점

    1. 의존성 관리 자동화 : 빈 간의 의존성을 IoC 컨테이너가 자동으로 관리.
    2. 테스트 용이성 : POJO 기반으로 설계되어 독립적인 테스트가 가능.
    3. 모듈화 : 애플리케이션의 각 구성 요소를 빈으로 관리하여 명확한 구조 제공.
    4. 확장성 : Java Config, 애노테이션, XML 등 다양한 설정 방식을 지원하여 확장 가능.

    출처

    https://study0304.tistory.com/78

     

    [Spring] 스프링빈(Spring Bean)

    목차 1. 스프링 빈(Spring Bean)이란? 2. Spring Bean을 Spring IoC Container에 등록하는 방법 - 2가지 3. 스프링 빈 스코프 4. 스프링 빈 생명주기 1. 스프링 빈(Spring Bean)이란? Spring IoC 컨테이너가 관리하는 자바

    study0304.tistory.com

    https://ittrue.tistory.com/221

     

    [Spring] 스프링 빈(Bean)이란 무엇인가?

    빈(Bean) 빈(Bean)은 스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트이다. 즉, 스프링 컨테이너가 관리하는 자바 객체를 뜻하며, 하나 이상의 빈(Bean)을 관리한다. 빈은 인스

    ittrue.tistory.com