ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Boot에서 사용되는 다양한 Bean 등록 방법
    Spring&SpringBoot 2025. 2. 10. 09:23
    Spring Boot에서 사용되는 다양한 Bean 등록 방법들과 각각의 장단점을 표로 정리하고, 가장 많이 이용되는 두 가지의 예시를 작성해둔 문서입니다.

     

    Spring Boot에서 Bean을 등록하는 방법 자동 등록 수동 등록 활용 상황
    @Component 계열 어노테이션으로 Bean 등록 일반적인 Spring Boot 프로젝트
    Java 설정을 통한 Bean 등록 외부 라이브러리 또는 복잡한 의존성 관리 필요
    XML 설정을 통한 Bean 등록 레거시 프로젝트 유지보수
    @Import를 사용한 Bean 등록 설정 클래스를 묶어서 관리
    FactoryBean을 사용한 동적 Bean 등록 특정 조건에 따른 동적 객체 생성
    ApplicationContext.registerBean를 통한 동적 Bean 등록 런타임에 Bean 추가 필요
    @Conditional을 사용한 조건부 Bean 등록 설정값에 따라 Bean을 동적으로 주입

    ChatGPT에게 부탁한 표 정리입니다! 깔끔하게 나와서 첨부합니다.

     

    이 중 이용도가 높은 건 @Component 계열 어노테이션으로 Bean 등록@Bean을 사용한 수동 등록이고, Java 설정을 통한 Bean 등록 이 가장 많이 이용됩니다.   

    XML 설정을 통한 Bean 등록은 레거시 프로젝트 유지보수라고 작성되어 있는데, 이제는 거의 사장된 방식이라고 생각하면 됩니다.

     


     

    1. @Component 계열 어노테이션으로 Bean 등록

     

    스트레오 타입 어노테이션 종류

    @Component : 일반적인 Bean 등록

    @Service : 서비스 계층에서 사용

    @Repository : DAO 또는 Repository 계층에서 사용 (예외 변환 기능 포함)

    @Controller / @RestController : 웹 컨트롤러

     

    예시

    package com.example.demo.component;
    
    @Component
    public class MyComponent {
        public void doSomething() {
            System.out.println("Hello from MyComponent");
        }
    }

     

    package com.example.demo.controller;
    
    @Controller
    public class AppController {
        private final Service service;
        
        ... (구현) ...
    
    }
    
    ---
    package com.example.demo.service;
    
    @Service
    public class Service {
        private final repository Repository;
    
    	... (구현) ...
        
    }
    
    ---
    package com.example.demo.repository;
    
    @Repository
    public class Repository {
    	
        ... (구현) ...
    }

     

    자동 등록 메커니즘

    package com.example.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication // @EnableAutoConfiguration + @ComponentScan + @Configuration
    public class MyApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class, args);
        }
    }

     

     

    @SpringBootApplication 어노테이션이 적용된 클래스의 현재 패키지하위 패키지에 있는 @Component 계열 어노테이션이 붙은 클래스를 모두 Bean으로 등록합니다.

     

    // 폴더 구조
    src
     └── main
          └── java
               └── com
                    └── example
                         └── demo
                              ├── MyApplication.java       ← @SpringBootApplication 어노테이션이 있는 클래스 (기본 패키지)
                              ├── controller
                              │    └── AppController.java   ← @Controller 어노테이션 (com.example.demo.controller)
                              ├── service
                              │    └── MyService.java      ← @Service 어노테이션 (com.example.demo.service)
                              └── repository
                                   └── UserRepository.java  ← @Repository 어노테이션 (com.example.demo.repository)
                              └── component
                                   └── MyComponent.java   ← @Component 어노테이션 (com.example.demo.component)

     

     

     

    2. Java 설정을 통한 Bean 등록

     

    Java 설정을 통한 Bean 등록에서 쓰이는 어노테이션과 스프링 컨테이너

    @Configuration : 이 어노테이션이 붙은 클래스는 스프링 IoC 컨테이너에 의해 설정(Configuration) 클래스로 인식됩니다.

    @Bean : @Configuration 클래스 내에서 Bean을 정의하고자 할 때 사용하는 메서드 레벨 어노테이션입니다.

    AnnotationConfigApplicationContext : 자바 설정을 로드하기 위한 스프링 컨테이너 구현체(=스프링 컨텍스트라고 부른다)입니다.

     

    @Configuration // 스프링이 관리하는 설정 클래스
    public class AppConfig {
        // @Bean 메서드가 두 번 이상 호출되어도
        // 실제 생성되는 Bean은 싱글톤으로 하나만 유지됨
        @Bean
        public Service Service() {
            return new ServiceImpl();
        }
    }
    public class Main {
        public static void main(String[] args) {
            // AnnotationConfigApplicationContext를 사용해 자바 설정 파일을 로드
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    
            // 빈 가져오기
            Service service = context.getBean(Service.class);
            System.out.println(service.getServiceName());
    
            // 컨텍스트 닫기
            context.close();
        }
    }

     

    AnnotationConfigApplicationContext는 폴더 구조와 관계없이 사용할 수 있습니다.

    AnnotationConfigApplicationContext를 통해 AppConfig.class 설정 클래스를 로드하여 스프링 컨텍스트 (스프링 IoC 컨테이너와 같은 개념) 를 생성하고 빈을 관리합니다.

    context.getBean(Service.class) 컨테이너에서 Service 타입의 빈을 가져오는 AnnotationConfigApplicationContext의 메서드입니다.

Designed by Tistory.