1. 스프링 빈 등록이란?

스프링 프레임워크의 핵심은 스프링 컨테이너가 애플리케이션을 구성하는 객체, 즉 스프링 빈(Bean) 을 생성하고 관리하는 것입니다.
스프링 빈으로 등록된 객체들은 컨테이너에 의해 생명주기를 관리받고, 의존 관계가 설정되어 애플리케이션의 기능을 수행하게 됩니다.
빈 등록은 이러한 객체들을 스프링 컨테이너가 알 수 있도록 설정하는 과정을 의미합니다.

2. 자동 빈 등록

✅ 개념

자동 빈 등록별도의 설정 파일 없이, 스프링이 특정 어노테이션이 붙은 클래스를 자동으로 스캔하여 빈으로 등록하는 방식입니다.

✅ 작동 방식

  • @ComponentScan

    • @ComponentScan 어노테이션을 사용하여 특정 패키지를 기준으로 컴포넌트를 스캔합니다.
    • 보통 스프링 부트의 @SpringBootApplication 안에 내장되어 있어 하위 패키지를 자동으로 스캔합니다.
  • @Component와 스테레오타입 어노테이션들

    • @Component가 붙은 클래스 → 자동 빈 등록 대상
    • 아래 어노테이션들도 내부적으로 @Component 포함
      • @Controller : MVC 컨트롤러
      • @Service : 비즈니스 로직
      • @Repository : 데이터 접근 및 예외 변환
      • @Configuration : 설정 및 @Bean 등록용 클래스
  • 빈 이름 규칙

    • 클래스명에서 첫 글자만 소문자로 바뀐 형태
      • 예: MemberServicememberService

✅ 장점

  • 편의성: 설정을 간소화하여 생산성 향상
  • 유지보수 용이: 설정 파일 변경 없이 클래스만 추가
  • 현대적인 스프링 개발 흐름과 잘 맞음

⚠️ 주의사항

  • 빈 이름 충돌 시 에러 발생
  • 스캔 범위 관리가 중요함

3. 수동 빈 등록

✅ 개념

수동 빈 등록은 개발자가 직접 설정 클래스에 @Bean 어노테이션을 사용하여 빈을 등록하는 방식입니다.

✅ 작동 방식

  • @Configuration 클래스

    • 설정 클래스로 인식됨
  • @Bean 메서드

    • 반환된 객체가 빈으로 등록됨
    • 메서드 이름이 기본 빈 이름
    • @Bean(name = "...")으로 이름 지정 가능
  • 의존 관계 설정

    • 메서드 내에서 다른 @Bean 호출
    • 파라미터로 다른 빈을 선언하면 자동 주입됨

✅ 권장되는 경우

  • 기술 지원 빈 (DataSource, TransactionManager 등)
  • 외부 라이브러리 객체 등록
  • 다형성을 활용한 로직 구현
  • 자동 등록으로 충돌 방지 필요 시

✅ 장점

  • 명시적인 설정 가능
  • 제어 용이성
  • 충돌 방지를 위한 이름 지정 가능

⚠️ 주의사항

  • 빈이 많아지면 설정 파일 관리가 복잡
  • 자동 등록보다 설정이 번거로움

4. 자동 vs 수동 빈 등록 - 언제 사용해야 할까?

구분 사용 권장 상황
자동 등록 컨트롤러, 서비스, 레포지토리 등 일반적인 애플리케이션 로직에 적합
⚙️ 수동 등록 기술 지원 빈 / 외부 라이브러리 / 다형성 활용 / 빈 이름 충돌 방지 등 명확한 제어 필요 시

5. 수동 등록 시 @Component 사용?

  • @Configuration 클래스 내부에서 @Bean으로 등록하면 원래 클래스에 @Component를 붙이지 않는 것이 일반적입니다.
  • @Component를 붙이면 자동 스캔되어 중복 등록 오류가 발생할 수 있습니다.
  • 스프링 부트는 기본적으로 중복 등록 시 오류를 발생시키도록 설정되어 있습니다.

✅ 결론

  • 자동 등록을 기본으로 사용
  • 명확성이 필요한 경우 수동 등록을 병행
  • 프로젝트 구조와 목적에 맞게 유연하게 선택하여 사용해야 합니다.