Spring

[Springboot] IOC Container & Beans

codi-3 2024. 8. 19. 16:08

IOC(제어의 역전, Inversion of Control) 컨테이너는 스프링 프레임워크의 핵심 개념 중 하나로, 객체의 생성과 관리의 책임을 개발자가 아닌 컨테이너(프레임워크)에게 맡기는 것을 의미한다. 이를 통해 객체 간의 결합도를 낮추고 코드의 유연성과 재사용성을 높일 수 있다.

IOC Container 란?

  • IOC 컨테이너는 스프링에서 객체의 생성, 초기화, 소멸 등을 관리하는 컴포넌트이다.
  • 개발자가 직접 객체를 생성하거나 의존성을 설정하지 않고, 스프링이 이를 대신 수행한다.
  • IOC 컨테이너는 객체를 관리할 뿐만 아니라, 객체들 간의 의존성을 주입하는 역할도 한다.

Bean이란?

  • Bean은 스프링 IOC 컨테이너에 의해 관리되는 객체를 의미한다.
  • 일반적으로 애플리케이션의 구성 요소(예: 서비스, 리포지토리, 컨트롤러 등)가 Bean으로 등록된다.
  • Bean은 싱글톤 패턴을 따르는 것이 기본이지만, 필요에 따라 다른 범위(scope)를 가질 수 있다.

Spring Boot에서 IOC  Container & Bean 사용 방법

Bean 등록 방법:

  • @Component: 클래스에 붙이면 해당 클래스가 자동으로 Bean으로 등록된다.
  • @Service, @Repository, @Controller: 각각 서비스, 리포지토리, 컨트롤러 역할을 하는 클래스에 사용되며, 이들도 Bean으로 등록된다.
  • @Configuration + @Bean: 메서드 수준에서 Bean을 등록할 때 사용된다. @Bean이 붙은 메서드가 반환하는 객체가 Bean으로 등록된다.
@Service
public class MyService {
    // 서비스 로직
}

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyService();
    }
}

 

의존성 주입(Dependency Injection):

  • 스프링에서는 의존성 주입을 통해 Bean 간의 관계를 설정한다.
  • @Autowired를 사용하면, 해당 필드나 생성자, 메서드에 필요한 의존성이 자동으로 주입된다.
  • 생성자 주입 방식이 권장되며, 이외에도 필드 주입, 세터 주입 등이 있다.
@Service
public class MyService {
    private final MyRepository myRepository;

    @Autowired
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }
    
    // 서비스 로직
}

 

Bean의 범위(Scope):

  • Singleton: 스프링 컨테이너 당 하나의 인스턴스만 생성(기본 설정).
  • Prototype: 요청 시마다 새로운 인스턴스 생성.
  • Request: 웹 요청 당 하나의 인스턴스 생성.
  • Session: 웹 세션 당 하나의 인스턴스 생성.
@Scope("prototype")
@Component
public class PrototypeBean {
    // Bean 로직
}

 

 

 

  • IOC 컨테이너는 객체의 생성과 관리를 담당하며, Bean은 그 컨테이너에 의해 관리되는 객체이다.
  • 스프링 부트에서는 다양한 어노테이션을 사용해 Bean을 등록하고, 의존성 주입을 통해 Bean 간의 관계를 설정한다. 이를 통해 개발자는 객체 생성과 관리에 신경 쓰지 않고 비즈니스 로직에 집중할 수 있다.