Spring Bean을 등록하기 위한 방법들

Kevin·2024년 2월 28일
0

Spring

목록 보기
13/27
post-thumbnail

서론

Spring에서는 Bean이라는 JAVA POJODI Container를 통해서 관리한다.


Bean이란 아래와 같은 구성 요소를 가지고 있는 POJO이다.

  • class : Bean으로 등록할 JAVA 클래스
  • id : Bean의 고유 식별자
  • scope : Bean을 생성하기 위한 방법 (ex: Singleton)
  • constructor-arg : Bean 생성 시 생성자에 전달할 파라미터
  • property : Bean 생성 시 setter에 전달할 인수

Spring에서는 Bean의 구성 요소를 통해서 DI Container에 등록된 Bean을 Singleton 객체로 생성해서 등록하고, 관리한다.

본문에서 다룰 @Configuration@Bean은 여기서 Bean을 DI Container에 등록하는 데 사용된다.


@Configuration

@Configuration은 xml 설정을 대체하는 스프링 설정 클래스를 만들어주는 어노테이션이다.

해당 어노테이션은 Bean 객체를 생성하는데 쓰이는데, 아래의 예시를 통해서 자세히 알아보자.

public class Test {

}

만약 위 Test 클래스를 빈으로 등록하고 싶다면, 아래와 같이 설정 클래스를 통해서 Bean으로 등록하는 방법이 있다.

@Configuration
public class TestConfig {

    @Bean
    public Test test() {
        return new Test();
    }

}

위 코드의 흐름은 아래와 같다.

Spring Container가 @Configuration이 붙어있는 클래스를 자동으로 빈으로 등록하고, 해당 클래스를 리플렉션해서 @Bean 어노테이션이 붙어있는 메서드를 찾아서 Bean을 생성해준다.

이 때 메서드의 이름으로 Bean 이름이 결정되기에 중복된 Bean 이름이 존재하지 않도록 주의


public class TestConfig {

    @Bean
    public Test test() {
        return new Test();
    }

}

만약 위와 같이 @Configuration이 붙은 클래스가 아니라 Bean으로 등록된 다른 클래스에서 @Bean을 사용하여 클래스를 Bean으로 등록하고자 한다면 어떻게 될까?

이 때도 마찬가지로 동작은 한다.

그러나 이 때는 싱글톤을 보장 받지 못함으로 @Bean을 사용한 클래스는 @Configuration을 붙여야 한다.


@Configuration은 클래스 내에 @Bean어노테이션이 붙은 메서드가 사용될 때(@Bean을 통해서 Bean을 등록하고자 할 때) 싱글톤을 보장하기 위해서 사용하는구나


싱글톤을 보장하는 장점 이외에도, @Configuration@Bean 을 사용했을 때 구현체를 등록하는 코드를 찾고자 한다면 @Configuration이 붙어있는 클래스만 보면 되기에 유지보수하기에도 좋다.

추가적으로 bean을 등록하기 위한 방법으로 @Component 어노테이션도 존재한다.


@Component

위와 같이 매번 수동으로(@Bean)으로 Bean 등록하기에는 많은 노력과 시간이 투자된다.

그래서 Spring에서는 특정 어노테이션이 있는 클래스를 찾아서 빈으로 등록해주는 Component Scan을 제공한다.

위랑 같은 예시를 통해서 자세히 알아보자.


public class Test {

}

만약 위 Test 클래스를 빈으로 등록하고 싶다면, 단순히 해당 클래스에 아래처럼 @Component만 적으면 된다.

@Component
public class Test {

}

이러한 @Component를 갖는 어노테이션으로는 @Controller, @Service, @Repository 그리고 위에서 다뤘던 @Configuration이 있다.

그 덕분에 Component Scan이 되어서 @Bean이 있는 메서드를 bean으로 등록할 수 있던 것이다.



레퍼런스

[Spring] 빈 등록을 위한 어노테이션 @Bean, @Configuration, @Component 차이 및 비교 - (1/2)

[Spring Boot] Configuration Component (@Configuration, @Bean)

profile
Hello, World! \n

0개의 댓글