Bean 등록 방법

양성준·2025년 3월 17일

스프링

목록 보기
13/49

1. Bean이란?

  • Spring에서 관리하는 객체로, ApplicationContext에 등록되어 의존성 주입(DI)이 가능하게 된 객체
  • Spring Boot에서는 다양한 방식으로 Bean을 등록할 수 있다.

2. Spring Boot에서 Bean을 등록하는 방법

Spring Boot에서는 자동 등록 방식(@Component 계열)이 기본이지만,
세세한 설정이 필요한 경우에 따라 수동 등록(@Bean 사용)이 필요할 수도 있다.

3. Bean 등록 방법별 상세 설명 및 비교

1) @Component 계열 어노테이션 사용 (자동 등록)

  • 설명
    • @Component와 그 하위 어노테이션(@Service, @Repository, @Controller)을 사용하면 Spring이 자동으로 Bean으로 등록.
    • Spring Boot는 기본적으로 @ComponentScan을 사용하여 특정 패키지 이하의 클래스를 자동으로 스캔하여 Bean으로 등록.
  • 등록 흐름
    • @SpringBootApplication이 포함된 클래스에서 SpringApplication.run() 실행됨
    • 내부적으로 스프링 컨테이너(ApplicationContext)가 생성됨
    • @SpringBootApplication 안에 포함된 @ComponentScan이 동작
    • 지정된 패키지(기본은 @SpringBootApplication이 위치한 패키지)와 그 하위 패키지를 탐색
    • @Component, @Service, @Repository, @Controller가 붙은 클래스들을 찾음
    • 해당 클래스들을 객체로 생성하고, Spring 컨테이너에 Bean으로 등록
      (기본적으로 클래스명에서 앞 글자를 소문자로 바꾼 이름으로 등록됨)
    • 이후 다른 클래스에서 @Autowired, 생성자 주입 등을 통해 이 Bean을 사용할 수 있게 됨

예제 코드

@Component
public class MyComponent {
    public void doSomething() {
        System.out.println("MyComponent 실행!");
    }
}
@Service
public class MyService {
    public String getMessage() {
        return "Hello from Service!";
    }
}
  • 장점
    • 자동 등록이 가능하여 설정이 간편
    • @Service, @Repository를 사용하면 계층별 역할이 명확해짐
    • Spring Boot 기본 동작 방식과 잘 맞음 (Spring Boot는 자동 설정을 지향)

=> 이러한 장점들 때문에 가장 많이 사용하는 방법!

  • 단점
    • 클래스를 직접 수정해야 Bean 등록이 가능 (외부 라이브러리는 사용 불가)
    • 세밀한 설정이 어려움 (인스턴스 생성 방식 변경이 불가능)

2) @Bean 어노테이션 사용 (수동 등록)

  • 설명
    • @Configuration 클래스에서 @Bean을 사용하면 개발자가 직접 Bean을 생성하여 관리할 수 있음.
    • 외부 라이브러리나 인터페이스 기반 객체 등을 Bean으로 등록할 때 유용.
  • 등록 흐름
    1) @SpringBootApplication이 포함된 클래스에서 SpringApplication.run() 실행됨
    2) 내부적으로 스프링 컨테이너(ApplicationContext)가 만들어짐
    3) 클래스패스를 스캔해서 @Configuration이 붙은 클래스들을 찾음 (@SpringBootApplication에 @ComponentScan이 자동 포함돼 있어서!)
    4) @Configuration 클래스 내의 @Bean 메서드들을 실행함 -> 메서드를 호출해서 객체 생성 -> 리턴된 객체를 스프링 컨테이너에 등록
    5) 이후 다른 클래스에서 @Autowired, 생성자 주입 등을 통해 이 Bean을 사용할 수 있게 됨

예제 코드

@Configuration
public class MyConfig {

    @Bean
    public MyComponent myComponent() {
        return new MyComponent();
    }
    
    @Bean
    public RestTemplate restTemplate() {  // 외부 라이브러리 Bean 등록 예제
        return new RestTemplate();
    }
}
  • 장점
    • 외부 라이브러리 및 인터페이스 객체도 등록 가능
    • 세밀한 제어 가능 (생성자 주입, 싱글톤 설정 등)
    • 리팩토링 시 유연하게 대응 가능
  • 단점
    • 클래스가 많아지면 설정 파일이 길어질 수 있음
    • 자동 등록보다 코드량이 많아질 수 있음

3) XML 기반 설정 (거의 사용 안 함)

  • 설명
    • applicationContext.xml에서 < bean> 태그를 사용하여 Bean을 수동 등록하는 방식.
    • Spring Boot에서는 거의 사용되지 않음.
      (Spring Boot는 XML 설정 없이 @Configuration과 @ComponentScan으로 자동 설정)

예제 코드

<bean id="myComponent" class="com.example.MyComponent"/>
  • 장점

    • XML 파일로 설정을 관리할 수 있어 코드와 분리됨
    • 다양한 설정을 한곳에서 관리 가능
  • 단점

    • Spring Boot에서는 비효율적이며 사용하지 않음
    • 설정이 길고 가독성이 떨어짐

4. Bean 등록 방법 비교 정리

5. 언제 어떤 방법을 사용할까?

  • @Component 기반 자동 등록을 기본으로 사용
    • 대부분의 경우 @Service, @Repository, @Controller 등을 사용하면 충분함.
  • 세부 설정 또는 외부 라이브러리 Bean 등록이 필요할 때 @Bean 사용
    • RestTemplate, ObjectMapper 같은 Spring이 관리하지 않는 객체를 등록해야 할 때
    • 팩토리 패턴을 사용할 때
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        
        // 세부 설정 커스터마이징
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
        mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
        
        return mapper;
    }

=> 세부 설정은 new로 생성한 객체에다가 필요한 설정을 직접 넣어주는 방식으로 처리

  • XML 설정은 사용하지 않음
    • Spring Boot에서는 XML 설정 없이도 충분히 관리 가능
    • XML 설정이 필요한 경우 설계 개선을 고려

6. 결론

  • Spring Boot에서는 @Component 계열을 기본으로 사용하고, 필요할 때 @Bean을 활용하면 된다!
profile
백엔드 개발자

0개의 댓글