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가 정상적으로 동작하려면 두 인스턴스가 빈으로써 스프링 컨테이너에 들어가있어야 합니다.
스프링 컨테이너의 동작 과정:
- 설정 정보를 통해 스프링 컨테이너를 구성합니다. 이는 주로 XML, Java Config, Annotation을 통해 이루어집니다.
- 설정된 정보를 바탕으로 스프링 컨테이너가 빈을 생성하고, 해당 빈들의 의존성을 해결합니다.
- 애플리케이션 실행 중에 필요한 빈들을 요청하면, 컨테이너는 빈을 반환하고, 필요한 경우 빈의 생성 및 초기화 작업을 수행합니다.
- 애플리케이션 종료 시, 스프링 컨테이너는 생성된 빈들의 생명 주기를 관리하고, 필요에 따라 적절히 종료 작업을 수행합니다.
이러한 스프링의 컨테이너와 빈은 애플리케이션의 유연성, 확장성, 테스트 용이성 등을 높여주는 핵심적인 요소입니다.
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 |