Spring
Spring Bean 등록 방법 4가지에 대해서 설명해주세요
@Component, @Bean, XML, 함수형 등록 — 4가지 방법의 차이점과 실무 선택 기준을 인터랙티브 시각화로 완전 정복합니다.
2026년 3월 21일 · 약 10분 읽기
Q. "Spring에서 Bean을 등록하는 방법에는 어떤 것들이 있나요? 각 방법의 차이점과 실무에서 어떤 기준으로 선택하는지 설명해주세요."
예상 꼬리질문
답변 가이드
"Spring에서 Bean을 등록하는 방법은 크게 4가지입니다. @Component 계열 어노테이션(컴포넌트 스캔), @Bean 메서드(@Configuration 클래스), XML 설정, 함수형 등록 순으로 등장했으며, 각각 도입 시기와 목적이 다릅니다."
"가장 많이 사용하는 두 방법은 @Component와 @Bean입니다. 핵심 차이는 ‘어떤 클래스에 적용하느냐’입니다.@Component는 내가 직접 작성한 클래스에 붙이는 방식이고,@Bean은 Jackson ObjectMapper나 HikariCP DataSource처럼 소스 코드를 수정할 수 없는 외부 라이브러리 클래스를 Bean으로 등록할 때 사용합니다."
"실무에서 @Configuration과 @Component를 혼동하는 경우가 있는데, 설정 클래스는 반드시 @Configuration을 사용해야 합니다. @Configuration은 CGLIB 프록시로 감싸져 @Bean 메서드 간 호출 시 싱글톤이 보장되지만, @Component로 대체하면 매번 새 인스턴스가 생성되는 문제가 발생합니다."
"이 서비스 클래스는 @Service를 붙이면 되는데, DataSource는 어떻게 Bean으로 등록하지?" Spring을 처음 배울 때 한 번쯤 겪는 혼란입니다.
Bean 등록 방법이 4가지나 있고, 상황마다 선택 기준이 다릅니다. 이 아티클에서 4가지 방법을 인터랙티브 시각화로 비교하고 실무 선택 기준까지 확인해보세요.
1. 4가지 방법 한눈에 비교
꼬리질문: "@Component와 @Bean의 가장 큰 차이점이 무엇인가요?"
Bean 등록 방법은 Spring 버전이 올라가면서 하나씩 추가됐습니다. XML(1.x) → @Component(2.5) → @Bean(3.0) → 함수형(5.0) 순서입니다. 각 방법은 서로 경쟁 관계가 아니라 용도가 다른 도구입니다.
가장 중요한 구분 기준은 "내가 소스 코드를 수정할 수 있는 클래스인가"입니다. 내 클래스라면 @Component, 외부 라이브러리라면 @Bean이 원칙입니다.
필터를 선택하거나 카드를 클릭해 코드 예시와 장단점을 확인하세요.
4가지 방법 한눈에 비교
필터를 선택하거나 카드를 클릭해 코드 예시를 확인하세요.
@Component 계열
@Bean
XML 설정
함수형 등록
2. @Component 계열 — 컴포넌트 스캔의 동작 원리
꼬리질문: "@ComponentScan은 어떻게 동작하나요?"
@SpringBootApplication 안에는 @ComponentScan이 포함돼 있어, 메인 클래스가 있는 패키지 이하를 자동으로 스캔합니다. @Component, @Service, @Repository, @Controller 어노테이션이 붙은 클래스를 찾아 Bean으로 등록합니다.
@Service, @Repository, @Controller는 모두 @Component를 포함하는 메타 어노테이션입니다. 단순히 이름표가 아니라, @Repository는 데이터 접근 예외를 Spring의 DataAccessException으로 자동 변환하는 부가 기능이 있습니다.
스캔을 시작하면 @SpringBootApplication이 패키지를 탐색하며 Bean을 발견하는 과정을 확인하세요.
컴포넌트 스캔 동작 원리
스캔을 시작하면 @SpringBootApplication이 패키지를 탐색하며 Bean을 발견합니다.
패키지 구조
IoC 컨테이너
스캔 시작 후 Bean이 등록됩니다
클래스가 스캔 범위 밖에 있으면 NoSuchBeanDefinitionException이 발생합니다. 패키지 구조를 벗어난 클래스가 있다면@SpringBootApplication(scanBasePackages = ...)으로 스캔 범위를 명시적으로 지정해야 합니다.
3. @Bean — 외부 라이브러리와 CGLIB 프록시
꼬리질문: "@Configuration과 @Component를 설정 클래스에 사용할 때 어떤 차이가 있나요?"
@Configuration 클래스 안에서 @Bean 어노테이션이 붙은 메서드를 정의하면, 메서드 반환값이 Bean으로 등록됩니다. Jackson ObjectMapper, HikariCP DataSource, RestTemplate처럼 소스 코드를 수정할 수 없는 외부 클래스에 적합합니다.
@Configuration의 핵심은 CGLIB 프록시입니다. 덕분에 @Bean 메서드를 다른 @Bean 메서드에서 직접 호출해도 항상 같은 싱글톤 인스턴스가 반환됩니다. @Configuration 대신 @Component를 쓰면 이 보장이 사라져 매번 새 인스턴스가 생성됩니다.
시뮬레이션을 실행해 @Configuration과 @Component의 차이를 직접 확인하세요.
@Configuration vs @Component — 싱글톤 보장 차이
@Bean 메서드 간 호출 시 @Configuration은 CGLIB 프록시로 싱글톤을 보장하지만, @Component는 매번 새 인스턴스를 생성합니다.
@Configuration // CGLIB 프록시 O
public class AppConfig {
@Bean
public A beanA() {
return new A(beanB()); // ①
}
@Bean
public B beanB() {
return new B();
}
@Bean
public C beanC() {
return new C(beanB()); // ②
}
}@Component // CGLIB 프록시 X
public class AppConfig {
@Bean
public A beanA() {
return new A(beanB()); // ①
}
@Bean
public B beanB() {
return new B();
}
@Bean
public C beanC() {
return new C(beanB()); // ②
}
}4. 실무 선택 기준 — 언제 무엇을 쓸까?
꼬리질문: "외부 라이브러리(예: Jackson ObjectMapper)를 Bean으로 등록할 때 어떤 방법을 쓰나요?"
4가지 방법 중 어느 것을 써야 할지 헷갈린다면 단 두 가지 질문으로 결정할 수 있습니다. "내가 소스 코드를 수정할 수 있는 클래스인가?" 그리고 "GraalVM 네이티브 이미지가 필요한 환경인가?"입니다.
대부분의 Spring Boot 프로젝트에서는 @Component 계열과 @Bean 두 가지만으로 충분합니다. XML은 레거시 프로젝트 유지보수에만 사용하고, 함수형 등록은 서버리스·네이티브 이미지 환경이 아니면 오버엔지니어링입니다.
질문에 답하면서 상황에 맞는 Bean 등록 방법을 찾아보세요.
실무 선택 기준 — 의사결정 트리
질문에 답하면서 상황에 맞는 Bean 등록 방법을 찾아보세요.
질문
레거시 XML 기반 Spring 프로젝트를 유지보수 중인가?
자주 발생하는 문제
퀴즈로 확인하기
개념을 제대로 이해했는지 확인해 보세요.
Jackson ObjectMapper Bean 등록
// 팀에서 Jackson ObjectMapper를 공유 Bean으로 등록하려 한다. // 다음 중 올바른 방법은? // A: ObjectMapper 클래스에 @Component를 붙인다 // B: @Configuration 클래스 안에 @Bean 메서드로 등록한다 // C: ObjectMapper 클래스에 @Service를 붙인다 // D: XML에 <bean class="...ObjectMapper"/>로 등록한다
설정 클래스의 싱글톤 보장
@Component // ← 이 부분에 주목
public class AppConfig {
@Bean
public ServiceA serviceA() {
return new ServiceA(serviceB());
}
@Bean
public ServiceB serviceB() {
return new ServiceB();
}
@Bean
public ServiceC serviceC() {
return new ServiceC(serviceB());
}
}
// serviceA와 serviceC가 주입받는 ServiceB가 같은 인스턴스일까?Bean을 못 찾는 이유
// 패키지 구조: // com.example.app.MainApplication (@SpringBootApplication) // com.example.app.controller.UserController // com.payment.service.PaymentService (@Service) ← 다른 최상위 패키지 // UserController가 PaymentService를 주입받으려 할 때 // NoSuchBeanDefinitionException이 발생했다. // 원인은?
@Repository vs @Component 차이
// 데이터 접근 계층 클래스를 만들 때
// @Component 대신 @Repository를 사용하면
// 추가로 얻는 기능은?
@Repository // vs @Component
public class UserRepository {
public User findById(Long id) {
// JPA or JDBC 사용
}
}면접 체크리스트
이 항목들을 자신 있게 설명할 수 있다면 Spring Bean 등록 질문은 준비 완료입니다.
- - 내가 작성한 클래스: @Component / @Service / @Repository / @Controller
- - 외부 라이브러리 / 복잡한 초기화: @Bean (반드시 @Configuration 클래스 안에)
- - @Repository 부가기능: JPA/JDBC 예외 → DataAccessException 자동 변환
- - @Configuration vs @Component: @Configuration만 CGLIB 프록시 적용 → 싱글톤 보장
- - XML: 레거시 유지보수 전용, 신규 프로젝트에서는 사용 안 함
- - 함수형 등록: GraalVM 네이티브 이미지 / 서버리스 환경에서 검토
추가 학습 자료를 공유합니다.
- Baeldung — Difference Between @Bean and @Component — @Component와 @Bean의 차이를 코드 예시와 함께 명확하게 설명하는 영문 튜토리얼
- Baeldung — @Component, @Repository, @Service Annotations — @Component 계열 어노테이션의 차이와 @Repository 예외 변환 기능을 상세히 다룬 영문 자료
의견을 들려주세요
서비스 개선에 큰 도움이 됩니다. 익명으로 자유롭게 남겨주세요.