Spring - 스프링 빈(Bean)의 생성 방법

2 분 소요

해당 글은 김영한님의 인프런 강의 “코드로 배우는 스프링 부트”의 내용을 학습 후 정리하기 위해 작성하는 글입니다.

스프링이 실행되면 스프링 컨테이너가 생성된다. 이때 Controller, Service, Repository 관계에 맞추어 스프링 컨테이너가 알맞은 자바 클래스들을 객체로 생성하게 되고 이를 관리한다. 하지만 스프링이 알아서 이러한 클래스들을 빈으로 가져오지는 않으며 이를 설정해주어야 한다.


스프링 빈(Bean)을 사용하는 이유

스프링에서는 각각의 자바 클래스들이 의존 관계를 가지고 있다. MVC 구조에 따라 설계를 하면 먼저 Model 클래스를 만들고, Model 객체들을 담게되는 Repository 클래스를 구현하게 된다. 또한 생성된 Repository에 인덱싱하기위한 Service 클래스가 있고 Controller는 Service를 통해 Model이 담겨있는 Repository에 접근하게된다.

VIEW - CONTROLLER - SERVICE - REPOSITORY(models)

웹 프로그래밍은 멀티유저에 대한 동시성 제어가 중요하며 이를 위해 스프링 컨테이너에서는 싱글톤 패턴(Singleton Pattern)으로 관리한다.

Singleton Pattern - 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이며 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.

스프링 빈 등록 방법

컴포넌트 스캔

빈(Bean)을 등록하는 첫번째 방법은 스프링에서 제공하는 @Component 어노테이션으로 클래스를 명시하여 컨테이너가 생성될 때 컴포넌트 스캔을 통해 자동으로 빈에 등록할 수 있다.

@Component

  • @Controller
  • @Service
  • @Repository

위 3가지 어노테이션들은 @Component로 구성되어 있어서 컴포넌트 스캔에 이용할 수 있다. 이들 중 @Repository에 접근해보면 아래와 같이 컴포넌트의 특별한 형태로 제공됨을 알 수 있다.

As of Spring 2.5, this annotation also serves as a specialization of @Component, allowing for implementation classes to be autodetected through classpath scanning.

  • @Repository

img1

따라서 @Component와 연관된 어노테이션들을 이용하여 클래스를 명시해주면 스프링 컨테이너는 컴포넌트 스캔을 통해 자동으로 해당 클래스의 객체를 빈(Bean)으로 관리한다.

  • Repository 클래스에 @Repository 정의

img2

이때 빈으로 등록된 모든 클래스의 객체들은 싱글톤(Singleton)으로 생성된다.

직접 스프링 빈 등록하기

이와 별개로 컴포넌트 어노테이션을 사용하지 않고 직접 빈으로 등록할 클래스들을 자바 코드로 정의하는것도 가능하다.

img3

위 처럼 Configuration을 위한 클래스를 하나 만든 후, @Configuration으로 명시를 하면 된다. 그리고 빈으로 등록할 클래스를 @Bean 메소드로 생성하여 객체를 리턴하도록 한다.

직접 스프링 빈을 등록하여 얻을 수 있는 장점은 인터페이스로 구현된 Repository 클래스가 다른 클래스로 변경될 때 간단하게 Configuration의 리턴 클래스 객체만을 수정해주면 된다는 점이 있다.

의존 관계 설정

[스프링 컨테이너] 아직 의존관계가 없는 빈(Bean)

Controller Service Repository

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

자동 의존관계

컴포넌트 스캔을 이용하여 스프링 빈을 등록했을 경우 클래스의 생성자에 @Autowired 어노테이션을 명시해주면 된다.

  • @Autowired 어노테이션을 통한 의존관계 명시

img4

수동 의존관계

컴포넌트 어노테이션을 이용하지 않고 Configuration 을 통해 직접 빈을 등록한 경우, 새롭게 추가할 것은 없고 실제 클래스의 구현된 생성자의 형태와 동일하게 Configuration에서도 객체를 리턴해주면 된다.

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

img5

의존 관계 설정이 끝난 [스프링 컨테이너]

ControllerServiceRepository

이처럼 간단하게 스프링 빈을 등록하고, 그에 따른 의존관계를 설정해줄수 있다.

댓글남기기