Spring

[ Spring ] spring ioc 컨테이너와 Bean

따갓 2022. 8. 1. 01:40

빈(Bean)

스프링(Spring) 컨테이너가 관리하는 자바 객체를 빈(Bean)이라 한다.

스프링의 특징에는 제어의 역전(IoC)이 있다.

  • 사용자의 제어권을 다른 주체에게 넘기는 것을 IOC(제어의 역전) 라고 한다. IOC가 적용된 경우, 객체의 생성을 특별한 관리 위임 주체에게 맡기게 된다. 이 경우 사용자는 객체를 직접 생성하지 않고, 객체의 생명주기를 컨트롤하는 주체는 다른 주체가 된다.

지금까지는 사용자가 new연산을 통해 객체를 생성하고 메소드를 호출했다. IoC가 적용된 경우에는 이러한 객체의 생성과 사용자의 제어권을 스프링에게 넘긴다. 사용자는 직접 new를 이용해 생성한 객체를 사용하지 않고, 스프링에 의하여 관리당하는 자바 객체를 사용한다. 이 객체를 '빈(bean)'이라 한다. 개발자가 이 부분까지 신경쓰지 않아도, 프레임워크가 알아서 해 주는 것이다.

 

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

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

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

  • IntelliJ 에서는 Spring IoC 컨테이너에서 관리할 Bean 인 경우 위 사진처럼 왼쪽에 아이콘으로 표시해 준다.
  • 위에서 예시를 들었듯, FolderService 생성자에서 의존성 주입이 일어나고 있다.
  • 그러면 FolderService , FolderRepository 모두 Bean이어야 한다.

 

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

1. 자바 어노테이션(Java Annotation)을 사용하는 방법

@Component 어노테이션이 있으면 스프링 빈으로 자동 등록된다. 또한, @Component를 포함하는@Controller, @Service, @Repository 어노테이션도 스프링 빈으로 자동 등록된다. ( @SpringBootApplication 에 의해 default 설정이 되어 있음 )

 

 

2. 자바 코드로 직접 스프링 빈 등록하기(Configuration)

@Configuration과 @Bean 어노테이션을 이용해 스프링 빈을 등록한다. @Configuration을 이용하면 스프링 프로젝터에서 Configuration 역할을 하는 Class를 지정할 수 있다.

 

스프링 빈(Bean) 사용 방법

@Autowired

  • 멤버변수 선언 위에 @Autowired → 스프링에 의해 DI (의존성 주입) 됨
@Component
public class ProductService {
		
    @Autowired
    private ProductRepository productRepository;
		
		// ...
}
  • '빈' 을 사용할 함수 위에 @Autowired → 스프링에 의해 DI 됨
@Component
public class ProductService {

    private final ProductRepository productRepository;

    @Autowired
    public ProductService(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }
		
		// ...
}
  • @Autowired 적용 조건
    • 스프링 IoC 컨테이너에 의해 관리되는 클래스에서만 가능
  • @Autowired 생략 조건
    • Spring 4.3 버전 부터 @Autowired 생략가능
    • 생성자 선언이 1개 일 때만 생략 가능
      • 파라미터가 다른 생성자들
public class A {
	@Autowired // 생략 불가
	public A(B b) { ... }

	@Autowired // 생략 불가
	public A(B b, C c) { ... }
}

 [ Lombok 의 @RequiredArgsConstructor 를 사용하면 다음과 같이 코딩 가능 ]

@RequiredArgsConstructor // final로 선언된 멤버 변수를 자동으로 생성합니다.
@RestController // JSON으로 데이터를 주고받음을 선언합니다.
public class ProductController {

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

'Spring' 카테고리의 다른 글

CORS 정리  (0) 2022.08.14
[ Spring ] IoC, DI 에 대해서 알아보자  (0) 2022.07.31