일반적으로 스프링 컨테이너가 관리하는 모든 대상을 “빈”이라고 부르지만,

어노테이션 이름으로서의 @Bean과는 의미의 범위가 다름

@Bean

메서드 레벨에 붙는 어노테이션

@Configuration
public class AppConfig {
    
    @Bean
    public EmailService emailService() {
        return new GmailService();
        //return new NavermailService();
        //return new HanmailService();
    }
}

@Component

클래스 레벨에 붙는 어노테이션

@Component
public class JsonSerializer {
	// 내부 로직...
}

스프링 컨테이너에 의해 관리되는 대상으로 등록하고 싶지만 서비스나 컨트롤러와는 별개로 동작할 때 붙임

유틸리티 클래스이지만 정적 메서드로 구성하고 싶지 않거나, 내부에 추가 의존성이 있을 때 주입받기 위해 이런 방식 사용

@Controller, @Service, @Repository 등은 모두 기본적으로 @Component를 포함하고 있음