[Spring] 스프링 빈(Bean)

쓰옹·2022년 12월 7일
0
  • 스프링컨테이너에 의해 관리되는 자바 객체
  • 어플리케이션 클래스의 패키지를 포함한 그 하위 클래스만 빈에 포함됨

스프링 빈 등록 방법

  1. 컴포넌트스캔과 자동 의존관계 설정

    컴포넌트스캔

    • 주로 정형화된 컨트롤러, 서비스, 레파지토리 같은 코드는 컴포넌트 스캔 사용
    • @Component 어노테이션이 있으면 스프링 IoC의 빈에 자동 등록됨
    • @Controller, @Service , @Repository 어노테이션에 컴포넌트 포함되어있음
    • 적용조건
      • @ComponentScan에 설정한 packages 위치와 하위 packages가 일치해야함

    참고
    스프링은 스프링 컨테이너에 스프링 빈을 등록할 때,
    기본으로 싱글톤으로 등록한다(유일하게 하나만 등록해서 공유한다)
    따라서 같은 스프링 빈이면 모두 같은 인스턴스다. 설정으로 싱글톤이 아니게 설정할 수
    있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다.

  2. 자바 코드로 직접 등록

    • 정형화 되지 않은, 상황에 따라 구현 클래스를 변경해야 하는 경우 스프링빈으로 등록
    • @Bean 어노테이션 사용
    @Configuration
    public class SpringConfig {
    	@Bean
    	public MemberService memberService() {
    		return new MemberService(memberRepository());
    	}
    	
    	@Bean
    	public MemberRepository memberRepository() {
    		return new MemoryMemberRepository();
    	}
    }

스프링 빈 사용 방법

  • @Autowired
    • 생성자에 사용
    • 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아 주입
    • 생성자가 한 개만 있으면 생략 가능
    • 스프링 IoC 컨테이너에 의해 관리되는 클래스에서만 사용 가능
@Service
public class MemberService {
	 private final MemberRepository memberRepository;

	 @Autowired
	 public MemberService(MemberRepository memberRepository) {
			 this.memberRepository = memberRepository;
	 }
}
  • Lombok의 @RequiredArgsConstructor
    • final로 선언된 멤버 변수 자동 생성

      @RestController
      @RequiredArgsConstructor // final로 선언된 멤버 변수를 자동으로 생성합니다.
      public class ProductController {
      
          private final ProductService productService;
          
          // 생략 가능
      		// @Autowired
      		// public ProductController(ProductService productService) {
      		//     this.productService = productService;
      		// }
      }
profile
기록하자기록해!

0개의 댓글