[Spring] 스프링 컨테이너와 스프링 빈

밀크야살빼자·2023년 5월 4일
0

스프링 컨테이너란?

자바 객체의 생명 주기를 관리하고, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할을 한다. 즉, 빈(=자바 객체)의 생성부터 소멸까지 개발자 대신 관리해주는 공간이다.

스프링 컨테이너 종류

1. BeanFactory

  • 빈을 등록하고 생성하고 조회하고 돌려주는 등 빈을 관리하는 역할을 한다. getBean() 메소드를 통해 빈을 인스턴스화할 수 있다.(getBean() 메소드가 호출된 시점에 해당 빈을 생성한다.)
  • 빈을 생성하고 관계를 설정하는 IoC의 기본 기능에 초점을 맞춘 것이다.

AppConfig

@Configuration
public class SpringConfig {
   
   @Bean
   public MemberService memberService() {
   		return new MemberService(memberRepository());
   }
  
  @Bean
   public MemberRepository memberRepository() {
  		return new MemoryMemberRepository();
   }
}

@Bean이 붙은 메소드의 명을 스프링 빈의 이름으로 사용하여 빈 등록을 한다.

스프링 컨테이너 안에 스프링 빈 저장소가 있고, 스프링 빈 저장소 안에 빈이 있다.

MemberController

@Controller
     public class MemberController {
     
     private final MemberService memberService;
     
     @Autowired //MemberService와 의존관계를 가진다.
     public MemberController(MemberService memberService) {
       	this.memberService = memberService;
     }
}
  • @Autowired가 정상적으로 동작하려면 두 인스턴스가 빈으로써 스프링 컨테이너에 등록되어 있어야 한다.

2. ApplicationContext

  • BeanFactory처럼 빈을 관리할 수 있다.(BeanFactory의 기능을 포과하면서 추가적인 기능을 제공한다.)
  • Context 초기화 시점에 모든 싱글톤 빈을 미리 로드한 후 애플리케이션 가동 후에는 빈을 지연 없이 받을 수 있다.
  • 별도의 정보를 참고해서 빈의 생성, 관계 설정 등의 제어를 총괄하는 것에 초점을 맞춘 것이다.

BeanFactory vs ApplicationContext

ApplicationContext가 BeanFactory 자체를 상속받은 것은 아니지만 빈을 관리하는 기능을 물려받았고 추가적인 기능까지 제공한다.
그래서 특별한 이유가 없다면 ApplicationContext를 사용해야 한다고 공식문서에 나와있습니다.

스프링 빈이란?

  • 스프링 컨테이너에 생성되어 관리되는 자바 객체가 스프링 빈이다.
  • 스프링 컨테이너에 빈 인스턴스를 단 한개만 저장하는 싱글톤 방식을 사용한다.
    스프링 컨테이너는 객체의 인스턴스를 싱글톤으로 관리하기 때문에 AppConfig 클래스를 읽어 만든 빈 목록에 있는 임의의 빈을 여러 번 불러도, 그 빈들의 주소는 같다.(싱글톤 컨테이너)
  • 빈 이름은 항상 다르게 지정이 되어야 한다. -> 예상치 못한 여러 에러가 발생하는데, 이를 개발 중 발견하기 매우 어렵기 때문이다.

스프링 빈 등록 방법

1. 컴포넌트 스캔

  • @Component Annotation을 통해 가능하다.
  • @Controller,Service,@Repository 등의 어노테이션들은 인터페이스로 @Component를 받기 때문에 컴포넌트 등록이 가능하다.

2. 직접 등록

  • @Configuration@Bean으로 가능하다.
    AppConfig
@Configuration
public class SpringConfig {
   
   @Bean
   public MemberService memberService() {
   		return new MemberService(memberRepository());
   }
  
  @Bean
   public MemberRepository memberRepository() {
  		return new MemoryMemberRepository();
   }
}

스프링 컨테이너에 빈을 등록하는 이유

스프링이 각 객체간 의존관계를 관리하도록 하는데에 목적이 있다. 객체가 의존관계를 등록할 때 스프링 컨테이너에서 해당하는 빈을 찾고, 그 빈과 의존성을 만든다.

profile
기록기록기록기록기록

0개의 댓글