스프링이해 1 -궁금한게 빈 어노테이션은 클래스에 붙히지 않고 함수에만 붙혀야하는데 그렇게 설계한 이유가 있나? 어차피 컴포넌트나 커트롤러도 빈등록해주는데 그건 클래스단위고 왜 빈만 함수단위?
좋은 질문이에요. 이건 Spring Framework의 설계 철학(Bean 등록 방식 차이) 때문입니다. 핵심은 **“자동 스캔 기반 vs 수동 정의 기반”**이에요.
---
1️⃣ @Bean은 메서드 기반 설정용
@Bean은 보통 Spring Framework의 @Configuration 클래스 안의 메서드에 붙습니다.
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
여기서 의미는:
> 이 메서드가 반환하는 객체를 Spring 컨테이너에 Bean으로 등록해라
즉 Bean을 생성하는 “팩토리 메서드” 역할이에요.
그래서 자연스럽게 메서드 단위가 됩니다.
---
2️⃣ @Component, @Controller는 클래스 스캔 기반
반면에 이런 것들은:
@Component
@Service
@Repository
@Controller
@RestController
모두 Spring Framework의 Component Scan으로 동작합니다.
@Service
public class UserService {
}
여기 의미는:
> 이 클래스를 자동으로 스캔해서 Bean으로 등록해라
그래서 클래스 단위입니다.
---
3️⃣ 왜 @Bean을 클래스에 붙이지 않게 했을까?
이유는 역할이 완전히 다르기 때문입니다.
① 직접 생성 로직을 제어해야 할 때
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
return mapper;
}
여기서는:
생성자 호출
옵션 설정
조건 처리
같은 생성 로직을 직접 제어합니다.
---
② 외부 라이브러리 클래스 등록
예:
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper();
}
ObjectMapper는 우리가 만든 클래스가 아니라
**software 같은 외부 라이브러리 클래스입니다.
외부 클래스에는 @Component 붙일 수 없죠.
그래서 메서드로 Bean 생성합니다.
---
4️⃣ 만약 @Bean이 클래스에 붙는다면 생기는 문제
가정:
@Bean
public class MyService {}
그러면 Spring이 알아야 하는 것:
생성자 어떤걸 쓸지?
생성 전에 설정할 로직?
조건?
여러 객체 생성?
결국 메서드가 더 유연한 팩토리 역할을 합니다.
---
✅ 정리
방식 어노테이션 대상 방식
자동 등록 @Component @Service @Controller 클래스 Component Scan
수동 등록 @Bean 메서드 팩토리 메서드
즉
> @Bean은 "객체 생성 로직을 직접 정의하는 팩토리 메서드"라서 메서드 단위로 설계된 것
---
💡 참고로 Spring 내부 설계를 이해하려면 꼭 알아야 하는 포인트 하나가 있습니다.
@Configuration + @Bean 조합이 왜 CGLIB 프록시를 쓰는지 이해하면
Spring DI 구조가 거의 다 보이는데, 이 부분도 면접에서 많이 물어봅니다.
원하시면 **“왜 @Configuration은 프록시(CGLIB)를 쓰는지”**도 이어서 설명해 드릴게요. (Spring 이해도 확 올라갑니다)
컴포넌트와 빈의 처이 결국 컴포넌트토 빈인데 스프링이 자동 등록된 빈을 컴포넌트라 하는거임?
결론부터 말하면 “컴포넌트와 빈은 같은 개념이 아니다” 입니다. 하지만 컴포넌트는 결국 빈으로 등록된다는 관계가 있어요. 그래서 헷갈리기 쉽습니다.
---
1️⃣ Bean의 정확한 의미
Spring Framework에서 Bean은
> Spring IoC 컨테이너가 관리하는 객체
입니다.
즉 조건은 하나입니다.
✔ Spring 컨테이너에 등록되어 있고 관리된다
방법은 여러 개입니다.
@Component
@Service
@Controller
@Repository
@Bean
XML 설정
➡️ 등록 방법은 달라도 결국 다 Bean입니다.
---
2️⃣ Component의 정확한 의미
@Component는 Bean을 등록하기 위한 방법 중 하나입니다.
@Component
public class UserService {}
의미
> "이 클래스를 스캔해서 Bean으로 등록해라"
이것은 Component Scan 기능입니다.
---
3️⃣ 관계 정리
관계는 이렇게 됩니다.
Bean (스프링이 관리하는 객체)
├─ @Component
│ ├─ @Service
│ ├─ @Repository
│ └─ @Controller
└─ @Bean
즉
Component → Bean이 되는 방법
Bean → 최종 결과 개념
입니다.
---
4️⃣ 그래서 질문의 답
질문:
> 스프링이 자동 등록된 빈을 컴포넌트라 하는거임?
정확히는 ❌ 아닙니다.
정확한 표현은:
@Component가 붙은 클래스 → Component
Component Scan으로 등록된 객체 → Bean
즉
Component ⊂ Bean
입니다.
---
5️⃣ 예시
Component 방식
@Service
public class UserService {}
등록 과정
@ComponentScan
↓
@Service 발견
↓
Bean 등록
---
Bean 방식
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService();
}
}
등록 과정
@Bean 메서드 실행
↓
반환 객체
↓
Bean 등록
---
6️⃣ 실무에서 말하는 방식
실무에서는 보통 이렇게 말합니다.
"이거 컴포넌트로 등록했어"
"이거 빈으로 등록했어"
하지만 의미는 사실 조금 다릅니다.
표현 실제 의미
컴포넌트 @Component 기반 등록
빈 스프링이 관리하는 객체
---
💡 Spring 이해도가 올라가는 핵심 포인트 하나
많은 사람들이 모르는 사실:
> @Service, @Controller, @Repository는 전부
Spring Framework의 @Component의 확장(메타 어노테이션) 입니다.
그래서 실제로는 내부가 이렇게 되어 있습니다.
@Component
public @interface Service {}
---
원하시면 Spring에서 진짜 헷갈리는 개념 TOP 5
1️⃣ Bean vs Component
2️⃣ @Configuration vs @Component
3️⃣ @Bean vs @Component
4️⃣ @Autowired vs 생성자 주입
5️⃣ CGLIB 프록시
이거 아키텍처 관점에서 한번에 정리해 드릴게요.
Spring 이해도가 확 올라가는 부분입니다.
댓글
댓글 쓰기