개발 공부 기록/02. Spring Boot

스프링 빈과 스프링 컨테이너란?

박세류 2023. 12. 10. 13:54

간단한 코드를 하나 작성해 보겠다.

@RestController
public class Controller {
    private final Service Service;

    public Controller(JdbcTemplate jdbcTemplate) {
        Service = new Service(jdbcTemplate);
    }
}

 

  1. Java에서는 static이 아닌 이상 인스턴스화 해줘야 하는데, 이 Controller 코드에는 인스턴스화가 없다.
  2. Controller를 생성하기 위해선 JdbcTemplate가 필요하다. 이를 JDBC 템플릿에 의존한다. 는 것인데, JdbcTemplate클래스를 설정해 준적이 없다. 

 

스프링에서 위와 같은 설정을 해주는 것은 스프링 빈이다.

 

@RestControll 어노테이션은, 해당 클래스를 스프링 빈으로 등록시킨다.

 

스프링 빈(Bean)이란?

서버가 시작되면, 스프링 서버 내부에 거대한 컨테이너를 만들게 된다.

 

컨테이너가 몬데?!

컨테이너에는 내부에 여러 클래스가 들어간다.

컨트롤러 클래스의 이름 및 타입과 같은 다양한 정보가 들어있고, 인스턴스 화도 이루어진다.

이렇게 컨태이너에 들어간 클래스를 스프링 빈이라고 부른다.

 

결국, 생성자를 호출해 주지 않아도 실행되는 이유는 자동으로 인스턴스화 되기 때문이다.

또한, JdbcTemplate도 스프링 빈에 이미 등록 되어 있기 때문에 설정해주지 않아도 된다.

 

누가 Jdbctemplate를 스프링 빈으로 등록해준건데?

build.gradle을 보자.

설정한 Dependency(라이브러리, 프레임워크)에 있는 spring-boot-starter-data-jpa에 JdbcTemplate를 빈으로 등록해주는 코드가 들어있기 때문에 별다른 설정 없이 사용 할 수 있는 것이다. 

 

그러므로, @RestController 어노테이션을 붙여 Bean으로 등록하거나, 의존성을 설정하여 등록해두면, 컨테이너가 필요한 클래스끼리 연결 해 주는 개념인것이다.

 

정리해보자

서버가 시작되면 다음과 같이 실행된다.

 

  1. 스프링 컨테이너(클래스 저장소)가 시작된다.
  2. 컨테이너에 의존성으로 등록한 기본적인 스프링 빈이 등록된다. (JdbcTemplate 등)
  3. 개발자가 설정한 스프링 빈이 등록된다. (Controller 코드)
  4. 의존성이 자동으로 설정된다. (컨트롤러에서 JdbcTemplate를 호출하면, 의존관계가 생김)

 

그렇기 때문에, 서비스나 리포지토리 에서도

어노테이션인 @Repository,와 @Service를 붙이면 스프링 빈으로 등록해준다.

이는 해당 어노테이션이 상 포함하는 @Component 어노테이션에 스프링 빈으로 등록하는 코드가 있기 때문이다.

반응형