@Bean과 @Component의 차이점 이해하기

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

  • 초보 Spring Boot 개발자
  • Spring 프레임워크 기초 개념 정리 필요자
  • DI 컨테이너 작동 원리 이해 부족자

핵심 요약

  • @Component는 Spring이 자동 스캔을 통해 빈으로 등록하는 일반 컴포넌트 어노테이션
  • @Bean구체적인 빈 생성 로직 정의에 사용되며, 외부 라이브러리와의 통합 시 필수
  • @Component@Service, @Repository, @Controller와 같은 구체적 역할 어노테이션의 상위 개념

섹션별 세부 요약

  1. What are Spring Beans?
  • Spring 컨테이너가 관리하는 객체
  • 의존성 주입(DI)을 통해 다른 빈과 연결 가능
  • 라이프사이클 콜백 메서드 지원
  1. How @Component works with auto-scanning
  • @ComponentScan 어노테이션으로 지정한 패키지 내에서 자동으로 빈 등록
  • @Service, @Repository, @Controller 어노테이션은 @Component의 구체적 형태
  • 컴포넌트 스캔 범위를 명시적으로 설정 가능
  1. When to use @Bean
  • 외부 라이브러리의 객체를 Spring 컨테이너에 등록할 때 사용
  • 빈 생성 로직을 수동으로 정의해야 하는 경우 (예: 복잡한 의존성, 외부 설정 참조)
  • @Configuration 클래스 내에서 주로 사용됨
  1. Real-world examples
  • @Component: 서비스 로직, 데이터 액세스 레이어 구현
  • @Bean: 외부 API 클라이언트, 커스텀 데이터 소스 등 생성
  • 코드 예시:

```java

@Component

public class MyService { ... }

@Configuration

public class AppConfig {

@Bean

public MyExternalClient externalClient() { ... }

}

```

  1. Comparison Table

| 기준 | @Component | @Bean |

|--------------|---------------------------|--------------------------|

| 사용 목적 | 일반 컴포넌트 등록 | 빈 생성 로직 정의 |

| 스캔 방식 | 자동 스캔 | 수동 정의 |

| 사용 위치 | 서비스, 리포지토리 등 | @Configuration 클래스 |

| 외부 라이브러리 지원 | ❌ | ✅ |

결론

  • @Component는 Spring이 자동으로 관리하는 일반 컴포넌트에 사용하고, @Bean은 외부 라이브러리와의 통합 또는 복잡한 의존성 관리 시 필수적으로 사용
  • 실무에서는 @Component를 서비스/리포지토리에, @Bean@Configuration 클래스 내에서 구체적으로 정의하는 방식이 일반적
  • 비교 표를 통해 사용 시점과 목적을 명확히 구분하여 코드의 가독성과 유지보수성을 높일 수 있음