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