Bean에 대해서

0

개념정리

목록 보기
3/33

스프링 빈을 사용하는 이유

  • 스프링이 실행되면 스프링 컨테이너가 생성된다. 이때 Controller, Service, Repository 관계에 맞춰 스프링 컨테이너가 알맞은 java 클래스들을 객체로 생성하게되고 이를 관리한다. 하지만 스프링이 알아서 이러한 클래스들을 빈으로 가져오지는 않으며, 이는 따로 설정해줘야한다.
  • 스프링 컨테이너에 객체 즉, 빈을 등록하는 이유는 스프링이 각 객체간 의존관계를 관리하도록 하는데 큰 목적이 있다.
    객체가 의존관계를 등록할 때는 스프링 컨테이너에서 해당하는 빈을 찾고, 그 빈과 의존성을 만든다.
  • 스프링에서는 각각의 자바 클래스들이 의존관계를 가지고 있다.
    mvc구조에 따라 설계를 하면
  1. 먼저 Model 클래스를 만들고 Model 객체들을 담게되는 Repository 클래스를 구현하게 된다.
  2. 또한 생성된 Repository에 인덱싱하기 위한 Service 클래스가 있고
  3. Controller는 Service를 통해 Model이 담겨있는 Repository에 접근하게 된다.
    VIEW - CONTROLLER - SERVICE - REPOSITORY(Models)
  • 웹 프로그래밍은 multi유저에 대한 동시성제어가 중요하며 이를 위해 스프링 컨테이너에서는 싱글톤 패턴(Singleton Pattern)으로 관리한다.

Bean?

  • 빈(Bean)이란 스프링이 생명주기를 관리하는 객체이다.
  • Beans는 애플리케이션의 핵심을 이루는 객체이며, Spring IOC(Inversion of Control)컨테이너에 의해 인스턴스화, 관리, 생성된다.
  • 각 Bean들에 대해서 의존관계를 외부(컨테이너)에서 주입해주기 때문에 IoC/DI Container라고도 부른다.
  • Beans는 우리가 컨테이너에 공급하는 설정 메타데이터(XML 파일)에 의해 생성된다.
    • 컨테이너는 이 메타데이터를 통해 Bean의 생성, Bean Life Cycle, Dependency등을 알 수 있다.
  • 애플리케이션의 객체가 지정되면, 해당 객체는 getBean() 메서드를 통해 가져올 수 있다.

Spring Bean 정의

  • 일반적으로 XML파일에 정의한다.
  • 주요속성
    • class(필수) : 정규화된 자바 클래스 이름
    • id : bean의 고유 식별자
    • scope : 객체의 범위 (singleton, prototype)
    • constructor-arg : 생성시 생성자에 전달할 인수
    • property : 생성시 bean setter에 전달할 인수
    • init method와 destroy method

Bean을 등록하는 방법

  • Bean을 등록하는 첫번째 방법은, 스프링에서 제공하는 @Component 어노테이션으로 클래스를 명시하여, 컨테이너가 생성될 때 컴포넌트 스캔(ComponentScan)을 통해 자동으로 빈에 등록할 수 있다.
    • @Controller, @Service, @Repository 이 3가지 어노테이션들은 @Component로 구성돼있어서 컴포넌트 스캔에 이용할 수 있다.
  • 따라서, @Component와 연관된 어노테이션들을 이용하여 클래스를 명시해주면, 스프링 컨테이너는 컴포넌트스캔을 통해 자동으로 해당 클래스의 객체를 빈(Bean)으로 관리한다.

  • 위와 별개로 @Component를 사용하지 않고, 직접 빈으로 등록할 클래스들을 자바 코드로 정의할 수도 있다.
    Configuration을 위한 클래스를 하나 만든 후, @Configuraion으로 명시하면 된다. 그리고 빈으로 등록할 클래스를 @Bean 메서드로 생성하여 객체를 리턴하도록 한다.
  • 직접 스프링빈을 등록하여 얻을 수 있는 장점은, 인터페이스로 구현된 Repository 클래스가 다른 클래스로 변경될 때 간단하게 Configuration의 리턴 클래스 객체만을 수정해주면 된다는 장점이 있다.

의존관계 설정

  • 스프링 빈을 등록한다고 끝난 것은 아니고, 싱글톤 객체로 생성되어 관리되는 클래스들의 의존관계를 연결해줘야한다.

✔︎ 자동 의존관계

  • 컴포넌트 스캔을 이용해서 스프링 빈을 등록했을 경우, 클래스의 생성자에 @Autowired어노테이션을 명시해주면 된다. (의존관계 명시)

✔︎ 수동 의존관계

  • 컴포넌트 어노테이션을 이용하지않고 직접 빈을 등록한 경우에는, 추가할 것은 없고 실제 클래스에 구현된 생성자의 형태와 동일하게 Configuration에서도 객체를 리턴해주면 된다.
@Configuration
public class SpringConfig {
	@Bean
    public MemberService memberService() {
    	return new MemberService(memberRepository()); // Service안에 repository를 넣어줌
    }
    @Bean
    public MemberService memberRepository() {
    	return new MemoryMemberRepository();
    }

Repository 객체를 파라미터로 가지는 Service 클래스


Spring Bean Scope

  • 스프링은 기본적으로 모든 Bean을 singleton으로 생성하여 관리한다.
    • 구체적으로는 애플리케이션 구동시, JVM 안에서 스프링이 bean마다 하나의 객체를 생성하는 것을 의미한다.
    • 따라서, 스프링을 통해 bean을 제공받으면 항상 주입받은 bean은 동일한 객체라는 가정하에서 개발한다.
  • request, session, global session의 scope는 일반 spring 어플리케이션이아닌, spring mvc web application에서만 적용된다.

scope

1. Singleton : spring 컨테이너에서 한번 생성된다.

  • 컨테이너가 사라질 때, bean도 제거된다.
  • 생성된 1개의 인스턴스는 single beans cache에 저장되고, 해당 bean에 대한 요청과 참조가 있으면, cache된 객체를 반환한다.
    • 즉, 하나만 생성되기 때문에 동일한 것을 참조한다.
  • 기본적으로 모든 bean은 scope이 명시적으로 지정되지 않으면 singleton이다.
  • 설정 방법
    • xml 설정 : <bean id="..." class="..." scope="singleton"></bean>
    • annotation 설정 : 대상 클래스에 @Scope("singleton")

2. Prototype : prototype bean은 모든 요청에서 새로운 객체를 생성하는 것을 의미한다.

  • 즉, 의존성 관계의 bean에 주입될 떄 새로운 객체가 생성되어 주입된다.
  • 정상적인 방식으로 gc에 의해 bean이 제거된다.
    • xml 설정 : <bean id="..." class="..." scope="prototype"></bean>
    • annotation 설정 : 대상 클래스에 @Scope("prototype")

출처

profile
백엔드를 공부하고 있습니다.

0개의 댓글