Spring/스프링 이론

[Spring] 스프링 빈(Spring Bean)

블로그 주인장 2023. 10. 9.

스프링 빈(Spring Bean)

스프링 컨테이너에서 관리하는 스프링 빈(Spring Bean) 에 관하여 알아보겠습니다.


스프링 빈(Spring Bean)이란?

- 스프링 컨테이너에 의해 관리되는 재사용이 가능한 소프트웨어 컴포넌트이다.

- 즉, 스프링 컨테이너가 관리하는 자바 객체를 뜻하며, 하나 이상의 빈(Bean)을 관리한다.

- @Bean 어노테이션을 통해 메서드로부터 반환된 객체를 스프링 컨테이너 등록한다.

- 클래스 등록 정보, Getter/Setter 메서드를 포함하며, 컨테이너 사용되는 설정 메타데이터로 생성된다.

 

[참고]  설정 메타데이터

XML 또는 자바 어노테이션, 자바 코드로 표현하며, 컨테이너의 명령과 인스턴스화, 설정, 조립할 객체 등을 정의

 

스프링 빈(Bean)을 통한 스프링 컨테이너에 등록하는 방법


1. 컴포넌트 스캔

  • @Component 어노테이션만 있으면 스프링 빈으로 자동 등록된다.
  • @Component는 ElementType.TYPE 설정이 있으므로, Class 혹은 Interface에만 붙일 수 있다.
  • @Component를 포함한 @Controller, @Service, @Repository 어노테이션도 스프링 빈으로 자동 등록된다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {

	/**
	 * The value may indicate a suggestion for a logical component name,
	 * to be turned into a Spring bean in case of an autodetected component.
	 * @return the suggested component name, if any (or empty String otherwise)
	 */
	String value() default "";

}

 

1-1. 컴포넌트 스캔 대상

  • @Controller
    • 스프링 MVC 컨트롤러
  • @Repository
    • 스프링 데이터 접근 계층으로 인식하고 해당 계층에서 발생하는 예외를 모두 DataAccessException으로 반환
  • @Service
    • 특별한 처리는 하지 않으나, 개발자들이 핵심 비즈니스 계층을 인식하는데 도움을 준다.
  • @Configuration
    • 스프링의 설정 정보로 인식하고 스프링 빈이 싱글톤을 유지하도록 추가로 처리한다.
    • 스프링의 빈 스코프(Bean Scope)가 싱글톤이 아니라면 추가로 처리하지는 않는다.
  • @AutoWired
    • 스프링이 연관된 객체를 스프링 컨테이너에 찾아서 넣어준다.
    • 객체 의존 관계를 외부에서 넣어주는 방식이다. "SOLID 원칙 : DIP(의존성 역전 원칙)"
    • [주의] 스프링이 관리하는 객체에서만 동작하기 때문에 직접 생성한 객체에서는 동작하지 않는다.
@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}

2. 자바 코드로 등록

  • @Configuration 어노테이션을 이용
@Configuration
public class MemberConfig() {

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

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

3. @Bean vs @Component

  1. @Bean
    • 개발자가 컨트롤이 불가능한 외부라이브러리들을 Bean으로 등록하고 싶은 경우 사용
    • 메소드 또는 어노테이션 단위에 붙일 수 있다.
  2. @Component
    • 개발자가 직접 컨트롤이 가능한 클래스들의 경우에 사용된다.
    • 클래스 또는 인터페이스 단위에 붙일 수 있다.
반응형

댓글