Spring Bean

스프링 Bean 이란

  • 스프링 프레임워크가 관리하는 독립적인 단위로서의 오브젝트
  • 일반 자바 오브젝트와 다를 것이 없고, 단지 스프링 프레임워크가 관리하고 있음
  • 쉽게 말하면 어떤 작업을 할 수 있는 오브젝트이고, 해당 오브젝트는 스프링이 관리하면서 언제든 DI에 사용될 수 있다.

스프링 컨테이너 - IoC/Bean/DI 컨테이너 등 이름으로 불린다.

컨테이너란?

  • 일반적으로 컨테이너란 인스턴스의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하도록하 는 것이라 할 수 있다.
    • 다시말해, 컨테이너란 프로그래머가 작성한 코드를 스스로 참조하고 알아서 객체의 생성과 소멸을 컨트롤해준다.

스프링 컨테이너

  • 스프링 Bean 오브젝트들을 관리한다.
  • 개발자가 정의한 Bean 클래스를 기반으로 Bean 오브젝트를 스스로 생성/사용 한다.
    • 오브젝트 생성(new 키워드)을 개발자가 호출하지 않고 컨테이너가 호출하기 때문에 DI가 되고, DI 되기 때문에 스프링 컨테이너가 스스로 제어할 수 있다.

IoC(Inversion of Control)란?

  • 개발자가 제어하던 프로그램의 흐름을 컨테이너가 제어하기 때문에 제어의 역전(IoC) 이라고 부르기 시작하였다.
  • Spring IoC의 역할
    • 객체의 생성부터 Life Cycle을 관리하고 제어해주는 것을 말한다. 즉, 제어권이 스프링 프레임워크로 넘어오게 되면서 DI(의존성 주입), AOP(관점 지향 프로그래밍) 등을 가능하게 하다.

스프링 Bean의 scope 5가지

  • singleton
    • 하나의 Bean 정의에 대해서 Spring IoC Container 내에 단 하나의 객체만 존재한다.
    • 기본적으로 모든 bean은 scope이 명시적으로 지정되지 않으면 singleton이다.
  • prototype
    • 하나의 Bean 정의에 대해서 다수 객체가 존재할 수 있다.
    • 모든 요청에서 새로운 객체를 생성한다는 것을 의마한다.
      • 즉, prototype  bean은 의존성 관계의 bean에 주입될 때 새로운 객체가 생성되어 주입된다.
      • 정상적인 방식으로 GC에 의해서 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 생성 문법 - Java annotation 방식

@Bean

  • 외부 라이브러리에서 정의한 클래스를 스프링 Bean으로 등록하고자 하는 경우에 사용한다.
    • @Bean은 개발자 직접 제어가 불가능한 외부 라이브러리를 사용할 때 사용한다.
    • @Configuration을 선언한 클래스 내부에서 사용한다.
    • 즉, 개발자가 작성한 메소드를 통해서 반환되는 객체를 Bean으로 만든다.

@Component

  • 개발자가 직접 작성한 class를 스프링 Bean으로 등록할 경우에 사용한다.
    • @Component는 개발가 직접 작성한 Class를 Bean으로 등록할 수 있게 만들어 준다.
    • 즉, 개발자가 작성한 class를 Bean으로 만든다.

아래 세가지 중에 정확히 어디에 속했는지 모르는 경우에 사용한다.

  • @Controller
    • 기본적으로 @Component와 같다
    • Presentation Layer의 Component라는 것을 부각하기 위함
  • @Service
    • 기본적으로 @Component와 같다.
    • Business Layer의 Component라는 것을 부각하기 위함이다. 즉, 비즈니스 로직을 구현하는 컴포넌트이다.
  • @Repository
    • 기본적으로 @Component와 같다.
    • Persistence Layer의 Component라는 것을 부각하기 위함이다. 즉, 영속성을 가지는 계층의(예: DB 엑세스) 컴포넌트이다.
    • @Repository는 플랫폼의 특정 Exception을 잡아 Spring의 Unchecked Exception을 던진다.



최종 수정 : 2024-01-18