ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Boot 고급 시리즈 2화 – Spring Bean 생성 전략: @Configuration, @Component, @Bean의 차이와 활용법
    기술과 산업/언어 및 프레임워크 2025. 6. 2. 10:07
    728x90

    Spring Boot를 일정 수준 이상으로 활용하다 보면, 애플리케이션 전체 구조를 설계할 때 Bean 정의 방식의 차이를 정확히 이해하고 선택하는 것이 매우 중요해집니다. 이번 글에서는 Spring에서 Bean을 정의하는 세 가지 주요 방식인 @Configuration, @Component, @Bean의 차이를 심도 있게 분석하고, 각 방식이 실제 아키텍처 설계에서 어떻게 적용되어야 하는지 살펴보겠습니다.

     

    Spring Boot에서 Bean을 등록할 때 사용하는 @Configuration, @Component, @Bean의 차이를 깊이 있게 분석하고, 실전 설계에서 어떤 전략으로 선택해야 하는지를 설명합니다.

    @Component 기반 자동 스캔: 간단하지만 통제가 어렵다

    @Component는 Spring에서 가장 널리 사용되는 어노테이션 중 하나입니다. 단일 클래스에 붙여 자동으로 빈으로 등록할 수 있게 해주며, 하위 어노테이션(@Service, @Repository, @Controller)들과 함께 사용됩니다.

    • 장점: 코드가 간결하고 자동 스캔으로 쉽게 빈 등록이 가능
    • 단점: 의존성 주입이나 빈 생명주기를 정교하게 조정하기 어려움

    실제 현업에서는 단순 유틸리티 클래스, 서비스 계층의 단일 책임 컴포넌트 등 규모가 작은 영역에서 적절합니다.


    @Configuration + @Bean: 명시적이고 제어 가능한 빈 구성

    @Configuration은 Java 기반의 명시적 구성 클래스를 정의할 때 사용합니다. 이 어노테이션을 붙인 클래스 안에서 @Bean 메서드를 선언하면, 해당 메서드의 반환값을 Spring Bean으로 등록할 수 있습니다.

    @Configuration
    public class AppConfig {
        
        @Bean
        public MyService myService() {
            return new MyServiceImpl();
        }
    }
    

    이 방식은 다음과 같은 특징이 있습니다:

    • 명시성: 어떤 빈이 어떻게 생성되는지 명확히 알 수 있음
    • 중복 제거: 공통 객체 생성, 조건부 빈 등록 등 고급 기능 가능
    • 테스트 친화적: 구성 클래스를 별도로 테스트할 수 있음

    이 방식은 규모가 크고 복잡한 프로젝트에서 명시적 통제가 필요한 컴포넌트를 구성할 때 선호됩니다. 특히 외부 라이브러리 구성, 커스텀 설정, 또는 조건부 빈 로딩(@Conditional 등)에서 유리합니다.


    Spring의 프록시 방식 이해: @Configuration과 @Bean이 자동 연결되는 이유

    많은 개발자가 궁금해하는 부분은 왜 @Configuration 클래스 안의 @Bean 메서드가 싱글톤을 보장하는가입니다. 이는 Spring이 @Configuration 클래스를 CGLIB 기반의 프록시 객체로 래핑하기 때문입니다. 이 프록시는 각 @Bean 메서드 호출을 감지하고, 중복 생성이 아닌 싱글톤 캐시에서 객체를 반환합니다.

    @Configuration
    public class Config {
        @Bean
        public A a() {
            return new A();
        }
    
        @Bean
        public B b() {
            return new B(a()); // 이 a()는 캐시된 빈을 반환
        }
    }
    

    위와 같은 구조에서 b()가 a()를 호출하더라도, 프록시 메커니즘 덕분에 a 빈은 하나만 생성됩니다.

    단, @Configuration이 아닌 클래스에서 @Bean 메서드를 선언하는 경우에는 이 보장이 깨질 수 있습니다. 실수로 @Component 클래스 안에서 @Bean을 선언하는 것은 지양해야 합니다.


    언제 어떤 방식을 선택해야 할까?

    사용 방식 장점 단점 추천 사용 사례

    @Component 간단, 자동 스캔 제어 부족, 재사용성 낮음 서비스/레포지토리
    @Configuration + @Bean 명시적, 재사용성, 테스트 친화적 설정이 다소 번거로움 외부 API 연동, 커스텀 설정
    Java Config + Import 설정 모듈화 가능 의존 관계 복잡해질 수 있음 다중 모듈 프로젝트

    결론: 규모가 커질수록 @Configuration을 선호하라

    Spring Boot의 초기 학습 단계에서는 대부분의 예제가 @Component 기반으로 구성되어 있어 익숙할 수 있습니다. 하지만 실제 서비스 규모가 커지고 도메인이 명확해질수록, 명시적인 빈 구성 전략이 디버깅과 테스트, 유지보수에서 큰 차이를 만들어냅니다.

    즉, 프로젝트의 성장 곡선에 따라 @Component → @Configuration + @Bean → 모듈화된 Java Config 전략으로 발전하는 것이 자연스러운 흐름입니다.


    다음 회차 예고

    Spring Boot 고급 시리즈 3화 – 프로파일 기반 설정 전략: @Profile, application.yml의 다중 설정 환경 구축

    728x90
Designed by Tistory.