스프링이해 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 이해도가 확 올라가는 부분입니다.


댓글

가장 많이 본 글