Spring IoC Container, Bean 정리

이창윤·2022년 7월 4일
0

스프링 스터디를 하기 전 김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의를 듣고있는데 스프링 빈이 정확히 무엇인지 알고 넘어갈 필요가 있다고 생각해서 정리를 해보려고 한다.



Spring IoC Container

IoC(Inversion of Control) - 제어의 역전

객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미함.

Spring 프레임워크에서 컨테이너는 객체의 생명주기를 관리하고 의존 관계를 설정해주고 생성된 객체들에게 추가적인 기능을 제공한다.

컨테이너는 적절한 설정만 되어있다면 개발자의 도움 없이도 스스로 객체의 생성과 소멸을 컨트롤해준다.

  • 객체 관리의 주체가 개발자가 아닌 컨테이너가 되기 때문에 개발자는 비즈니스 로직에 집중할 수 있다.
  • 객체 생성 코드가 없으므로 TDD에 용이하다.

Spring Container 종류

1. BeanFactory

  • Factory 디자인 패턴을 구현한 것으로 Bean을 생성하고 분배하는 역할
  • BeanFactory 계열의 인터페이스만 구현한 클래스는 단순히 컨테이너에서 객체를 생성하고 DI(Dependency Injection)를 처리해주는 기능만 제공함.
  • Bean의 정의는 즉시 로딩하지만 Bean의 인스턴스화는 필요할 때 진행된다. (Lazy loading)

2. ApplicationContext

  • BeanFactory를 상속받아 BeanFactory가 제공하는 기능 뿐만 아니라 추가적으로 기능을 제공한다.
    • 텍스트 메시지 관리
    • 파일 자원을 로드할 수 있는 포괄적인 방법 제공
    • 리스너로 등록된 빈에게 이벤트 발생을 알려줌
  • 초기화 시점에 모든 Bean을 미리 로드해서 어플리케이션 가동 후 Bean을 지연 없이 얻을 수 있음.



Spring Bean이란?

Spring IoC Container가 관리하는 자바 객체를 Bean이라고 부른다.

  • 직접 new로 생성한 객체가 아니라 Spring IoC Container에 의해 생성되고 관리되는 객체이다.
    ApplicationContext.getBean() 메소드로 얻어질 수 있는 객체여야 한다.

  • Spring에서 Bean은 보통 Singleton으로 존재한다.
    Singleton: 어떤 클래스가 최초 한번만 메모리를 할당하고 그 메모리에 객체를 만들어 사용하는 디자인 패턴
  • Spring에서의 POJO(Plain Old Java Object)를 Bean이라고 한다.
    POJO: 특정 기술에 종속되어 동작하는 것이 아닌 본래 자바의 장점을 살리는 오래된 방식의 순수한 자바 객체

Bean 등록 방법

1. Component Scanning

@Component, @Service, @Controller, @Repository, @Bean, @Configuration 등의 Annotation으로 Bean을 등록하고 필요한 곳에서 @Autowired를 통해 주입받아 사용하는 방법

@Controller
public class SpringController {
    @GetMapping("spring")
    public String spring(Model model){
        model.addAttribute("data", "hello!!");
        return "spring";
    }
   ...
}


@Service, @Controller, @Repository는 @Component를 상속받고 있으며 해당 어노테이션으로 등록된 클래스는 스프링 컨테이너에 의해 자동으로 생성되어 Bean으로 등록됨

2. Configuration

XML로 된 설정파일을 사용하는 방법과 자바 설정 클래스를 사용하는 방법이 있는데 최근 추세는 자바 클래스에서 관련 설정을 대신하는 방법을 주로 사용한다고 한다.

설정 클래스는 @Configuration 어노테이션을 클래스 앞에 추가하면 되는데, 이때 @Bean 어노테이션을 메소드에 사용해 메소드의 리턴 객체가 Bean 객체임을 선언하는 방법이 있다.

@Configuration
public class SpringConfig {

    @Bean
    public MemberService memberService(){
        return new MemberService(memberRepository());
    }
   ...
}

실무에서 사용하는 구조는 편리한 컴포넌트 방식으로 스프링 빈을 등록하지만, 정형화된 틀이 없거나 상황에 따라 구현 클래스를 직접 수정해야 하는 일이 있는 경우에는 Configuration 클래스로 직접 등록하는 게 유리하다.

출처 및 참고

[스프링 기초] 컨테이너와 IoC (Inversion of Control, 제어의 역전) 란?
[Spring] Bean 정리
[스프링부트] Bean 객체를 등록하는 두 가지 방법(@Component, @Bean)

0개의 댓글