스프링

스프링컨테이너와 빈

inle 2024. 3. 3. 18:31

1. 스프링 컨테이너 (Spring Container):

  스프링 컨테이너는 스프링에서 자바 객체들을 관리하는 공간을 말합니다. 자바 객체를 스프링에선 빈(Bean)이라고 하는데, 스프링 컨테이너에서는 이 빈의 생성부터 소멸까지를 개발자 대신 관리해주는 곳이라고 할 수 있습니다.

컨테이너는 크게 두 종류로 나눌 수 있습니다. 하나는 BeanFactory이고, 다른 하나는 ApplicationContext입니다. 

 ApplicationContext컨테이너가 BeanFactory의 기능을 포괄하면서 추가적인 기능을 제공하기 때문에 대부분의 경우에는 ApplicationContext를 사용합니다.

 

 

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

@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
}

@Service
public class MemberService {

    private final MemberRepository memberRepository;
    ...
}

 

 위의 코드와 같이 MemberController 클래스에는 @Controller Annotation을, 그리고 생성자에 @Autowired를 적어두면, 이 인스턴스는 MemberService와 의존관계를 가진다는 의미를 줍니다.
단, @Autowired가 정상적으로 동작하려면 두 인스턴스가 빈으로써 스프링 컨테이너에 들어가있어야 합니다.

 

스프링 컨테이너의 동작 과정:

  1. 설정 정보를 통해 스프링 컨테이너를 구성합니다. 이는 주로 XML, Java Config, Annotation을 통해 이루어집니다.
  2. 설정된 정보를 바탕으로 스프링 컨테이너가 빈을 생성하고, 해당 빈들의 의존성을 해결합니다.
  3. 애플리케이션 실행 중에 필요한 빈들을 요청하면, 컨테이너는 빈을 반환하고, 필요한 경우 빈의 생성 및 초기화 작업을 수행합니다.
  4. 애플리케이션 종료 시, 스프링 컨테이너는 생성된 빈들의 생명 주기를 관리하고, 필요에 따라 적절히 종료 작업을 수행합니다.

이러한 스프링의 컨테이너와 빈은 애플리케이션의 유연성, 확장성, 테스트 용이성 등을 높여주는 핵심적인 요소입니다.

 

2. 빈 (Bean):

  • 빈은 스프링 컨테이너에 의해 관리되는 객체를 말합니다.
  • 빈은 스프링 컨테이너에 의해 생성, 조립, 관리되며, 개발자는 이러한 빈들을 가져와서 사용할 수 있습니다.
  • 빈은 스프링 컨테이너에 등록되면 싱글톤(Singleton) 형태로 관리될 수도 있고, 프로토타입(Prototype)과 같은 다른 스코프로도 설정할 수 있습니다. 다만 주로 싱글톤 방식이 채택됩니다.

*싱글톤이란?

  싱글톤(Singleton)은 객체지향 프로그래밍에서 한 클래스의 인스턴스가 오직 하나만 생성되는 패턴을 가리킵니다. 이는 해당 클래스의 인스턴스를 전역적으로 접근할 수 있게 하며, 여러 곳에서 동일한 인스턴스를 공유하여 메모리를 절약하고, 일관성을 유지합니다.

 

*빈 스코프란?

  빈이 생성되는 범위를 지정하는것, 싱글톤, 프로토타입, request, session, application 등 다양한 스코프 제공

 

 

스프링 빈을 등록하는 방법

1. 컴포넌트 스캔
@Component Annotation을 통해 가능한데, 이 외에도 스프링 프레임워크에서 제공하는 @Controller @Service 혹은 @Repository와 같은 Annotation은 아래와 같이 인터페이스로 @Component Annotation을 받기 때문에 컴포넌트 등록이 가능합니다.

...
@Component
public @interface Service {
	...
}

 

2. 스프링 빈 직접 등록
스프링 빈을 직접 등록하는 것은 @Configuration @Bean Annotation으로 가능합니다.

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

 

'스프링' 카테고리의 다른 글

ConcurrentHashMap vs 레코드 락  (0) 2024.10.11
ConcurrentHashMap  (1) 2024.10.11
MVP 단계 트러블 슈팅  (0) 2024.04.12
Mybatis와 JPA  (2) 2024.03.12
IoC & DI  (0) 2024.02.25