본문 바로가기
야미스터디/Spring

[Spring] bean vs component 📌

by 의정부핵꿀밤 2022. 9. 8.
728x90

🖐 들어가기 전에

스프링 빈 (Spring Bean)

  • 스프링 컨테이너에 의해 관리되는 자바 객체(POJO)를 의미한다

 

💡 Spring Bean이 필요한 이유

  • Spring Container가 특정 객체의 라이프 사이클을 관리한다는 것을 나타내기 위해 필요하다

 

 

스프링 빈(싱글톤 빈)의 생명주기

  1. 스프링 컨테이너 생성
  2. 스프링 빈 생성
  3. 의존 관계 주입
  4. 초기화 콜백
  5. 사용
  6. 소멸 전 콜백
  7. 스프링 종료

스프링 컨테이너 (Spring Container)

  • Spring Container 또는 IoC Container라고도 한다
  • 설정 파일을 읽어서 Bean 정보를 읽고 저장 및 관리하는 역할을 한다
  • 스프링 컨테이너는 스프링 빈의 생명 주기를 관리하며, 생성된 스프링 빈들에게 추가적인 기능을 제공하는 역할을 한다
  • IoC(제어의 역전)와 DI(의존성 주입)의 원리가 스프링 컨테이너에 적용된다
    • DI(의존성 주입) : 객체 의존관계를 외부에서 넣어주는 것
    • 생성자에 @Autowired 가 있으면 Spring이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다
  • 개발자는 new 연산자, 인터페이스 호출, 팩토리 호출 방식으로 객체를 생성하고 소멸하지만, 스프링 컨테이너를 사용하면 해당 역할을 대신해준다
  • 즉, 제어의 흐름(IoC)을 외부(Spring)에서 관리하게 된다
  • 또한 객체들 간의 의존 관계를 스프링 컨테이너가 런타임 과정에서 알아서 생성한다

 

 

Spring 컨테이너가 Bean을 관리할 때의 장점

  • 의존성을 자동 주입하여 해당 의존성을 사용하는 로직에만 집중이 가능하다
  • 즉, 개발자가 객체 간의 의존 관계를 신경쓰지 않고 오직 로직에만 집중이 가능하다
  • 의존성을 주입할 때 사용되는 객체가 싱글 오브젝트, 즉 항상 동일한 객체임을 보장할 수 있다

 

 

🍃 Spring Bean 등록 방식

1) Component Scan

  • Component Scan은 @Component를 명시하여 빈을 추가하는 방법이다
  • 클래스 위에 @Component를 붙이면 스프링이 자동으로 스프링 컨테이너에 빈을 등록한다

 

📌 Component Scan의 대상

  • @Component 외에 @Controller, @Service, @Repository, @Configuration@Component의 상속을 받고 있어 모두 Component Scan의 대상이 된다
  • @Controller : 스프링 MVC 컨트롤러로 인식된다
  • @Service : 특별한 처리는 하지 않으나, 개발자들이 핵심 비즈니스 계층을 인식하는데 도움을 준다
  • @Repository : 스프링 데이터 접근 계층으로 인식하고 해당 계층에서 발생하는 예외는 모두 DataAccessException으로 변환한다
  • @Configuration : 스프링 설정 정보로 인식하고 스프링 빈이 싱글톤을 유지하도록 추가 처리를 한다 (만약 스프링 빈 스코프가 싱글톤이 아니라면 추가 처리를 하지 않는다)

 

 

2) Java 코드로 등록 (설정 파일 이용)

@Configuration
public class AppConfig {

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

}
  • 클래스를 생성하고 @Configuration 어노테이션을 활용한다
  • 이 때 빈을 등록하기 위해 인스턴스를 생성하는 메소드 위에 @Bean을 명시하면 된다
  • @Configuration에는 @Component가 포함되어 있기 때문에 Component Scan의 대상이 되어 자동 스캔을 통해 빈 등록이 가능하다

 

 

3) 수동 등록

public class Main {

    public static void main(String[] args) {
        final ApplicationContext beanFactory = new AnnotationConfigApplicationContext(AppConfig.class);
        final AppConfig bean = beanFactory.getBean("appConfig", AppConfig.class);
    }
}
  • 거의 사용되지 않지만, ApplicationContext를 호출하여 수동으로 설정 파일을 통해 빈을 등록할 수 있다

 

 


🤔 Bean vs Component

  • @Bean@Component 모두 스프링 빈으로 등록되게 하고 스프링에 의해 관리되도록 한다
  • 그러나 이 둘은 각자 선언할 수 있는 타입이 정해져있어 해당 용도 외에는 컴파일 에러를 발생시킨다

 

 

@Bean

  • 메소드 레벨에서 선언하며, 반환되는 객체(인스턴스)를 개발자가 수동으로 Bean으로 등록하는 어노테이션이다
    • METHOD(함수 단위), ANNOTATION_TYPE(어노테이션 단위)에 사용한다
  • 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용된다
  • 개발자가 생성한 Class에는 @Bean 선언이 불가능하다
  • 해당 클래스의 객체를 반환하는 메서드를 만들고, 메서드에 @Bean을 선언하여 등록한다
    • 즉, 메소드의 반환 값이 바로 Bean으로 등록되는 것이다
  • 외부 라이브러리 또는 이미 정의되어 있는 객체들이 서로 종속성을 갖는 경우 Bean 등록에 사용하는 어노테이션이다
  • 이미 정의된 기본 객체를 재정의하거나 내가 만든 객체의 종속성을 위해 빈을 등록할 때 사용한다
  • 즉, 메소드 단위에서 개발자가 외부 라이브러리 및 개발자가 정의하지 않은 객체를 유연하게 넘기기 위해 사용하는 어노테이션이다

 

 

 

@Component

  • Component의 정의 : 구성 요소 / 독립적인 단위 모듈로, 사용자가 사용하는 시스템에 대한 조작장치를 의미한다
  • 클래스 레벨에서 선언하며, 스프링이 런타임 시에 컴포넌트 스캔을 하여 자동으로 Bean을 찾고 등록하는 어노테이션
  • Class 타입, Interface 타입, Enum 타입 등에 선언 가능하다
  • 개발자가 직접 컨트롤이 가능한 Class들의 경우에 사용된다
  • 이 어노테이션은 선언적(Declarative)인 어노테이션으로, "클래스를 정의했으니 빈으로 등록해줘!"라는 뜻이 된다
  • @Component는 Class와 Bean이 일대일 관계를 갖는다
  • @ComponentScan 의 대상이 되는 어노테이션으로, 스프링 컨테이너의 관리 대상이 되고 Bean으로 등록된다
  • @Controller, @Service, @Repository 모두 @Component를 내장하고 있다

 

 

 

📌 정리

  • 설정 파일을 통해 Bean을 관리해야 할 때, 설정 파일에 해당하는 클래스 내 메서드에 @Bean 어노테이션을 사용할 수 있다
  • 간단하게 어노테이션 기반으로 Bean을 등록하고 싶으면 @Component 를 이용해서 스프링에게 등록을 요구할 수 있다

 

 

 

💡 [참고] @SpringBootApplication

  • @SpringBootApplication도 마찬가지로, @Configuration과 @ComponentScan을 상속받고 있다
  • 덕분에 Spring이었다면 구성하기 위해 신경써야 했던 설정 파일을 Spring Boot에서는 신경쓰지 않고 @Bean, @Component를 사용할 수 있는 것이다

 

 


참고)

https://jojoldu.tistory.com/27

 

@Bean vs @Component

Spring으로 개발을 하다보면 @Bean과 @Component를 언제 써야할지 헷갈릴때가 있다. 둘다 목적이 명확하지 않은 Bean을 생성할때 사용하는 어노테이션인데 왜 2개로 나누어져있나 궁금했었는데, 박재성

jojoldu.tistory.com

https://youngjinmo.github.io/2021/06/bean-component/

 

Bean과 Component 차이

스프링은 개발의 제어권이 스프링 컨테이너(IoC 컨테이너)에 있다고 한다. 그래서 이를 IoC(Inversion Of Control), 제어의 역전이라고 한다. 스프링이 개발자 대신 객체를 제어하기 위해서는 객체들이

youngjinmo.github.io

https://unequaled-peach-7e5.notion.site/27967c9ff2624ed2bebc298d0dcfc7a0

 

컴포넌트와 빈의 차이

🌹 정리 by 장미(https://velog.io/@newbiekim/)

unequaled-peach-7e5.notion.site

https://github.com/InJun2/TIL/blob/main/Stack/Spring/Bean-Component.md

 

GitHub - InJun2/TIL: todo-list

todo-list. Contribute to InJun2/TIL development by creating an account on GitHub.

github.com

https://steady-coding.tistory.com/594

 

[Spring] Spring Bean 총 정리

spring-study에서 스터디를 진행하고 있습니다. 스프링 빈이란? 스프링 빈은 스프링 컨테이너에 의해 관리되는 자바 객체(POJO)를 의미한다. 스프링 컨테이너 스프링 컨테이너는 스프링 빈의 생명 주

steady-coding.tistory.com

https://www.blog.ecsimsw.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88?category=879374 

 

@Component, @Bean 차이점

스프링 컨테이너 스프링 컨테이너는 설정 파일을 읽어서 빈 정보를 읽고 저장/관리한다. Configuration / Bean 빈 설정은 xml 방식과 java Config 방식이 있다. xml 방식, java Config 방식 모두 빈을 명시해야

www.blog.ecsimsw.com

 

728x90

'야미스터디 > Spring' 카테고리의 다른 글

[Spring] Dispatcher Servlet 📌  (0) 2022.09.20
[Spring] Spring vs EJB 📌  (1) 2022.09.20
[Spring] maven vs gradle 📌  (0) 2022.08.18
[Spring] Spring Servlet 📌  (0) 2022.08.13
[Spring] Spring vs Spring Boot 📌  (0) 2022.08.02

댓글