Dev.끄적끈적

Bean과 스프링 IoC 컨테이너 본문

Spring

Bean과 스프링 IoC 컨테이너

YeouidoSexyDeveloper 2022. 3. 27. 22:45
  • 빈 (Bean): 스프링이 관리하는 객체
  • 스프링 IoC 컨테이너: 'Bean' 을 모아둔 통

스프링 IoC 컨테이너가 관리하는 객체들을 Bean 이라고 부릅니다. 스프링은 이러한 Bean들의 의존성을 관리하고, 객체를 만들어 주며, Bean으로 등록을 해 주고, 이렇게 만들어진 것들을 관리합니다. 개발자가 이 부분까지 신경쓰지 않아도, 프레임워크가 알아서 해 주는 것입니다.

그리고 스프링 IoC 컨테이너가 위와 같은 관리를 해 줍니다. 이러한 Bean들을 담고 있는 스프링 IoC 컨테이너는 두 가지 중 하나를 사용합니다.

  • ApplicationContext 혹은 BeanFactory
    • ApplicationContext는 BeanFactory를 상속받으므로 둘 다 같은 일을 하는 것임

이러한 스프링에서의 의존성 주입은 반드시 Bean으로 등록된 객체들 끼리만 가능합니다. 스프링 IoC 컨테이너는 Bean으로 등록되지 않은 객체에는 의존성 주입을 해 주지 않습니다.

  • IntelliJ 에서는 Bean 인 경우 아래 사진처럼 왼쪽에 아이콘으로 표시해 줍니다.
  • 위에서 예시를 들었듯, OwnerController 생성자에서 의존성 주입이 일어나고 있습니다.
  • 그러면 OwnerController, OwnerRepository 모두 Bean이어야 할 것입니다.

Bean으로 등록하는 방법은?

Component Scanning

  • @Component Annotation을 활용합니다.
  • 개발자가 직접 작성한 Class를 Bean으로 등록해줄 때 사용합니다.
  • 여러 인터페이스들을 라이프사이클 콜백이라고 부르는데, @Component 어노테이션이 붙어 있는 모든 클래스들을 찾아, 그 클래스의 인스턴스를 만들고, Bean으로 등록해 주는 복잡한 작업을 하는 어노테이션 처리기가 스프링에 있습니다.

Bean 사용방법;

  1. @Autowired
    • 멤버변수 선언 위에 @Autowired → 스프링에 의해 DI (의존성 주입) 됨
@Component
public class ProductService {

    @Autowired
    private ProductRepository productRepository;

    // ...
}
  • @Autowired 적용 조건
    • 스프링 IoC 컨테이너에 의해 관리되는 클래스에서만 가능
    • Lombok 의 @RequiredArgsConstructor 를 사용하면 다음과 같이 코딩 가능
@RequiredArgsConstructor // final로 선언된 멤버 변수를 자동으로 생성합니다.
@RestController // JSON으로 데이터를 주고받음을 선언합니다.
public class ProductController {

    private final ProductService productService;

    // 생략 가능
    // @Autowired
    // public ProductController(ProductService productService) {
    //     this.productService = productService;
    // }
}

2. ApplicationContext

  • 스프링 IoC 컨테이너에서 빈을 수동으로 가져오는 방법
@Component
public class ProductService {
    private final ProductRepository productRepository;

    @Autowired
    public ProductService(ApplicationContext context) {
        // 1.'빈' 이름으로 가져오기
        ProductRepository productRepository = (ProductRepository) context.getBean("productRepository");
        // 2.'빈' 클래스 형식으로 가져오기
        // ProductRepository productRepository = context.getBean(ProductRepository.class);
        this.productRepository = productRepository;
    }

    // ...    
}

'Spring' 카테고리의 다른 글

AOP 란?  (0) 2022.06.16
JPA의 이해  (0) 2022.05.17
DI (의존성 주입) 의 이해  (0) 2022.03.27
Controller, Service, Repository 역할, 분리  (0) 2022.03.27
리팩토링이란?  (0) 2022.03.27