BeanFactory vs. ApplicationContext
- ApplicationContext는 BeanFactory의 기능 (Bean 관리 기능)을 상속 받음
- ApplicationContext는 추가로 편리한 부가 기능을 제공
- BeanFactory나 ApplicationContext를 Spring Container라 함
ApplicationContext 부가 기능
메시지소스를 활용한 국제화 기능
예를 들어서 한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력
환경변수
로컬, 개발, 운영등을 구분해서 처리
애플리케이션 이벤트
이벤트를 발행하고 구독하는 모델을 편리하게 지원
편리한 리소스 조회
파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회
다양한 설정 형식
Annotation 기반 자바 코드 설정 사용
// Spring Container 생성
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
// 구성 정보 지정
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(
memberRepository(),
discountPolicy());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
}
XML 설정 사용
// Spring Container 생성
ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
<!-- 구성 정보 지정 -->
<!-- resources/appConfig.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="memberService" class="group.name.member.MemberServiceImpl">
<constructor-arg name="memberRepository" ref="memberRepository" />
</bean>
<bean id="memberRepository"
class="group.name.member.MemoryMemberRepository" />
<bean id="orderService" class="group.name.order.OrderServiceImpl">
<constructor-arg name="memberRepository" ref="memberRepository" />
<constructor-arg name="discountPolicy" ref="discountPolicy" />
</bean>
<bean id="discountPolicy" class="group.name.discount.RateDiscountPolicy" />
</beans>
BeanDefinition
- BeanDefinition은 Bean 설정 메타 정보라 함
- @Bean, <bean> 당 메타 정보가 생성됨
- Spring Container은 이 메타 정보를 기반으로 Spring Bean을 생성
AnnotationConfigApplicationContext는 AnnotatedBeanDefinitionReader를 사용해서 AppConfig.class를 읽고 BeanDefinition을 생성
GenericXmlApplicationContext도 XmlBeanDefinitionReader를 사용해서 appConfig.xml
설정 정보를 읽고 BeanDefinition을 생성
…
Singleton Container
- Spring Container은 객체 instance를 Singleton으로 관리함
- Singleton Registry: Singleton 객체를 생성하고 관리하는 기능
- 고객의 요청이 올 때마다 이미 만들어진 객체를 공유해서 효율적으로 재사용
- 무상태(Stateless)로 설계해야 함
- 특정 client에 의존적인 field가 있으면 안됨
- 특정 client가 값을 변경할 수 있는 field가 있으면 안됨
- 가급적 읽기만 가능
- field 대신에 자바에서 공유되지 않는 지역변수, 파라미터, ThreadLocal 등을 사용해야 함
Q. 다음 코드에서 MemoryMemberRepository 객체는 3개 생성되는 것이 아닌가?
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(
memberRepository(),
discountPolicy());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
...
}
A. 스프링은 클래스의 바이트 코드를 조작하는 라이브러리를 사용하기 때문에 1개가 생김
@Configuration이 붙은 AppConfig 확인
스프링이 CGLIB라는 바이트 코드 조작 라이브러리를 사용하여 AppConfig 클래스를 상속받는 임의의 다른 클래스를 만듦
그 클래스를 bean으로 등록 (AppConfig@CGLIB)
이때, AppConfig@CGLIB의 예상 코드 다음과 같음
@Bean public MemberRepository memberRepository() { if (memoryMemberRepository가 이미 스프링 컨테이너에 등록되어 있으면) { return 스프링 컨테이너에서 찾아서 반환; } else { //스프링 컨테이너에 없으면 기존 로직을 호출해서 MemoryMemberRepository를 생성하고 스프링 컨테이너에 등록 return 반환 } }
출처: 김영한, 「스프링 핵심 원리 - 기본편」, 인프런
'Web > Spring Boot' 카테고리의 다른 글
Spring Container와 Spring Bean (0) | 2024.10.24 |
---|---|
Slf4j 사용하기 (0) | 2024.10.24 |
테스트 케이스 작성하기 (0) | 2024.10.24 |
PRG 패턴 (0) | 2024.01.08 |
스프링 MVC 요청과 응답 (0) | 2024.01.05 |