스프링 IoC와 Bean

권보원·2023년 7월 30일
0

IoC(Inversion of Control)이란

  • 일반적으로는 개발자가 직접 의존성을 만든다.
    new 키워드를 이용
  • Inversion of Control(제어권 역전)
    직접적으로 의존성을 만들지 않고, 외부에서 의존성을 가져오는 것 (DI)

IoC 사용 목적


실행시점에 클래스 간의 관계가 형성되어 의존성을 낮춘다.
의존성이 삽입된다는 의미로 IoC를 DI라고도 표현한다.
1. 재사용성을 높여준다.
2. 테스트에 용이하다.
3. 코드를 단순화 시켜준다.
4. 사용하는 이유를 파악하기 수월하고 코드가 읽기 쉬워진다.
5. 종속성이 감소하기에 변경에 민감하지 않다.
6. 결합도(coupling)는 낮추면서 유연성과 확장성을 향상 시킬 수 있다.
7. 객체관의 의존관계를 설정할 수 있다.

빈(Bean)이란

스프링 IoC컨테이너(ApllicationContext, BeanFactory)가 관리하는 객체이다.
스프링은 Bean의 의존성을 관리하고, 객체를 만들고, 등록해주며 관리한다.
빈으로 등록되면 의존성 관리가 수월해지고 싱글톤 형태가 된다.

Bean으로 등록하는법

Java코드를 이용하여 Bean 등록

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationConfig {

    @Bean
    public BookRepository bookRepository() {
        return new BookRepository();
    }

    @Bean
    public BookService bookService() {
        BookService bookService = new BookService();
        bookService.setBookRepository(bookRepository());
        return bookService;
    }
}

ApplicationConfig라는 자바파일을 만든 뒤 @Configuration으로 빈을 등록할 곳에 @Bean어노테이션과 함께 코드를 작성하면 빈으로 등록이 된다.
하나하나 Bean으로 등록해야 하기에 번거롭다.

어노테이션을 이용

스프링 부트는 어노테이션을 통해 Bean을 설정하고 주입받는 것을 표준으로 삼는다.

Container에 Spring Bean으로 등록시켜 주는 Annotation

  • @Bean은 개발자가 컨트롤 할 수 없는 외부 라이브러리를 Bean으로 등록하고 싶은 경우(메소드로 return 되는 객체를 Bean으로 등록)
  • @Component는 개발자가 직접 컨트롤 할 수 있는 클래스(직접 만든 클래스)를 Bean으로 등록하고 싶은 경우 (선언된 클래스를 Bean으로 등록)
  • @Controller, @Service, @Repository 등은 @Component를 비즈니스 레이어에 따라 명칭을 달리 지정해준 것 Contrainer에 있는 Spring Bean을 찾아 주입시키는 Anntation
  • @Autowired는 IoC 컨테이너에 있는 참조할 Bean을 찾아 주입한다.(Spring 표준)

Component Scanning

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackageClasses = DemoApplication.class)
public class ApplicationConfig {
    
}

@ComponentScan이라는 어노테이션을 사용하고 현재 패키지를 적어주면 패키지 아래에 있는 빈으로 등록해야 할 어노테이션을 찾아 전부 빈으로 등록해 준다.
@Componet, @Service, @Repositroy, @Controller, @RestController 어노테이션을 찾아서 Bean으로 등록해 준다.

스프링 부트에서는 ApllicationContext를 직접 만들어 사용할 필요 없이 @SpringBootApplication이라는 어노테이션 때문에 @ComponentScan등을 편리하게 사용할 수 있다.

0개의 댓글