@Configuration과 @Bean의 차이 – Spring 개발자라면 반드시 짚고 가야 할 핵심 개념

Spring Framework에서 자주 등장하는 @Configuration@Bean 어노테이션은 초보 개발자뿐만 아니라 경력 개발자도 명확히 구분하지 못하고 사용하는 경우가 많습니다. 하지만 두 어노테이션은 내부적으로 Spring Bean 설정 및 생명주기 처리 방식에서 중요한 차이를 갖고 있습니다.

@Configuration과 @Bean의 의미, 역할, 내부 처리 방식, 실무에서의 올바른 사용법을 알려드리겠습니다.

 


1. @Configuration: 설정 클래스 정의

@Configuration은 해당 클래스가 Spring의 설정 클래스임을 선언하는 어노테이션입니다. 즉, Java 기반의 Bean 등록용 설정 클래스라는 의미이며, XML 설정을 대체하는 역할을 합니다.

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl();
    }
}

위 예시에서 AppConfig 클래스는 설정 클래스이며, 내부에 정의된 메서드는 모두 @Bean을 통해 Bean으로 등록됩니다.

 


2. @Bean: 개발자가 직접 등록하는 Bean

@BeanSpring Container에 등록할 객체(Bean)를 직접 생성하고 반환하는 메서드에 붙이는 어노테이션입니다. 즉, 개발자가 제어권을 가지고 명시적으로 빈을 생성할 수 있게 도와주는 도구입니다.

@Component@Service와는 달리, 자동 스캔 대상이 아니며, 직접 인스턴스를 생성하고, 원하는 파라미터를 주입하거나 초기화 과정을 제어할 수 있다는 장점이 있습니다.

@Bean
public DataSource dataSource() {
    return new HikariDataSource(); // 설정 커스터마이징 가능
}

 

 


3. 가장 중요한 차이점 – CGLIB 프록시와 싱글톤 보장

많은 개발자들이 간과하는 차이점은 바로 Spring 내부의 빈 생명주기 및 프록시 처리 방식 입니다.

@Configuration은 CGLIB 프록시로 관리

@Configuration이 붙은 클래스는 Spring이 CGLIB 기반의 프록시 객체로 생성합니다. 이를 통해 @Bean 메서드 간 호출 시 싱글톤이 보장되도록 처리합니다.

@Configuration
public class AppConfig {

    @Bean
    public A a() {
        return new A();
    }

    @Bean
    public B b() {
        return new B(a()); // 이 호출은 CGLIB을 통해 Spring Context에서 꺼냄
    }
}

이 덕분에 B가 내부적으로 A를 호출하더라도, 항상 동일한 A 인스턴스(싱글톤)가 사용됩니다.

 

@Bean만 사용하면 싱글톤이 보장되지 않음

public class AppConfig {

    @Bean
    public A a() {
        return new A();
    }

    @Bean
    public B b() {
        return new B(a()); // 직접 호출 → 매번 new A()로 인식됨
    }
}

이 경우 Spring은 AppConfig를 일반 자바 객체로 인식하여 a() 호출 시 마다 새 객체를 반환합니다. 결과적으로 A가 두 번 생성되고, 싱글톤이 깨질 수 있습니다.

결론: 항상 @Bean은 @Configuration 안에서 사용하는 것이 안전합니다.


4. 실무에서의 Best Practice

  • Bean 등록이 필요할 땐 항상 @Configuration 클래스 내부에서 @Bean으로 정의하세요.
  • 테스트 코드에서는 굳이 @Configuration을 안 써도 되지만, 실 서비스 코드는 반드시 써야 합니다.
  • 컴포넌트 스캔이 아닌, 외부 라이브러리나 동적으로 생성한 객체를 등록할 때 유용합니다.

5. 둘은 항상 세트로 기억하자

@Bean은 단독으로 쓰일 수 있지만, 싱글톤 보장이라는 Spring의 핵심 철학을 유지하기 위해서는 반드시 @Configuration과 함께 사용해야 합니다.

특히, 설정 클래스 내부에서 Bean 간 의존성이 존재할 경우 @Configuration의 CGLIB 프록시 기능이 제대로 동작하지 않으면 심각한 버그로 이어질 수 있습니다.

실무에선 항상 두 개를 세트로 이해하고 사용하세요.