@Bean vs @Component

zwon·2023년 8월 25일
0

Spring

목록 보기
2/12
post-thumbnail

사이드 프로젝트를 하다가 궁금한게 생겨 정리를 해보겠다.
그전에 먼저 알아야 할 사전지식들에 정리를 한 후 알아보자.

먼저 IoC, DI, 스프링 컨테이너에 대해 알아보자.

IoC Inversion of Controll

  • 말 그대로 제어의 역전, 제어가 역전된다는 뜻이다.
  • 뭔가 와닿지 않는다.
  • 예를 들어 개발을 할 때 repository 인터페이스를 만들고,, repository 인터페이스 구현 객체를 만들고,,어떤 구현 객체(InMemoryRepositoryImpl, DbRepositoryImpl)를 사용할지는 보통 내가 정한다.
  • 즉 프로그램의 개발 흐름에에 있어 내가 주도하고있다.
  • 하지만 이러한 주도권을 다른 무엇인가(바로 Framework)에 넘겨준다는 것이다.
  • 그러면 나는 InMemoryRepositoryImpl를 사용하는지 DbRepositoryImpl를 사용하는지 알고싶지도 않고 그냥 모른 상태로 repository인터페이스의 어떤 구현 객체를 사용하고 있구나~ 만 알고있다.
  • 이를 바로 "제어의 역전"이라고 한다.
  • 즉 Spring이 나 대신에 프로그램의 주도권을 가져가 repository 인터페이스의 구현객체를 결정해주는 것이다.

DI Dependency Injection

  • Spring이 repository인터페이스의 구현 객체를 관리해준다고했다. 어떻게 관리를 해주는 것일까?
  • DI 의존성 주입을 통해 해준다.
  • Spring은 컨테이너를 가지고 있다. 이를 IoC 컨테이너 또는 스프링 컨테이너라고한다.
  • 이런 스프링 컨테이너안에 여러 객체들을 저장하고있는데 이를 "빈(Bean)"이라고 한다.
  • 스프링 컨테이너는 자신이 관리하고 있는 빈들을 "의존관계에 따라 필요한 곳에 주입"시켜준다해서 이를 의존관계 주입 DI라고 한다.

스프링 컨테이너

  • 그럼 도대체 IoC 컨테이너,스프링 컨테이너가 무엇인지 궁금할 것이다.
  • 컨테이너는 그냥 객체 생성 및 관리를 통해 의존관계를 연결해주는 메커니즘이다.

정리

자 배운 언어를 가지고 정리를 해보자면,
개발자는 스프링 컨테이너에 IoC를 위임함으로써 스프링 컨테이너가 애플리케이션의 제어 흐름을 관리한다. 이로 인해 스프링 컨테이너는 객체의 생성과 의존관계 설정을 담당하며, 이를 통해 DI(의존성 주입)을 한다. 따라서 개발자는 주로 객체의 정의와 의존성 관리에 집중하고, 객체의 생성과 의존성 설정을 스프링 컨테이너에게 위임할 수 있다.


자 그럼 스프링 컨테이너에 객체를 등록해줘야 스프링 컨테이너가 관리를 해줄 수 있는데 이 방법들에 대해서 알아보자.

@Bean

  • 보통 @Bean은 @Configuration과 세트로 사용된다. (사진 참고)
  • @Bean은 메서드단에 사용된다.
  • 그리고 반환되는 객체를 스프링 컨테이너에 저장한다.
  • 즉 수동으로 스프링 컨테이너에 객체를 등록하는 방법이다.

@Component

  • @Bean은 수동으로 객체를 등록하는 방법이라했다. 만약 등록해야하는 빈의 개수가 1억개라면,,@Bean을 얼마나 많이 써야하는걸까...
  • 그래서 스프링에서는 특정 어노테이션이 있는 클래스를 찾아서 자동으로 빈으로 등록해주는 방식이 나왔다. 이러한 방식을 컴포넌트 스캔 방식이라고 한다.
  • 맞다. 특정 어노테이션은 바로 @Component이다.
  • 즉 @Component이 붙은 클래스를 찾아 스프링이 자동으로 스캔해서 빈으로 등록해주는 방식인 컴포넌트 스캔 방식을 사용해서 편하게 빈으로 등록할 수 있게 되었다.
  • 아! @Component는 클래스단에 붙는다.
  • @Repository 어노테이션을 확인해보면 @Component가 붙어있다. 그래서 @Repository 어노테이션만 사용해서 자동으로 컴포넌트 스캔이 되어서 빈으로 등록되는 것이다.
profile
Backend 관련 지식을 정리하는 Back과사전

0개의 댓글