해당 강의는 김영한 강사님의 유료 강의로, 아주 간략하게 배운 부분들을 짚고 넘어가는 식으로 작성하였습니다.
생략된 부분이 많습니다. 전체 소스코드 공개도 금지이므로 블로그에 부분적으로만 올릴 생각입니다.
강의를 보며 포스트잇을 붙이는 느낌으로 제가 보기 위해 작성하는 글이니
학습을 위해서라면 아래 링크의 강의를 직접 들으시는 것을 추천합니다!
스프링 핵심 원리 - 기본편 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...
www.inflearn.com
스프링 컨테이너 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext를 스프링 컨테이너라 한다.
스프링 컨테이너 생성 과정
1. 스프링 컨테이너 생성 : 스프링 컨테이너 생성, 구성 정보 지정(여기서는 AppConfig.class를 구성정보로 지정함)
2. 스프링 빈 등록 : 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록한다.
3. 스프링 빈 의존관계 설정
스프링 빈 조회
- 컨테이너에 등록된 모든 빈 조회
- 스프링 빈 조회 (기본)
//ac.getBean(빈이름, 타입)
//ac.getBean(타입)
// 빈 이름으로 조회
MemberService memberservice = ac.getBean("memberService", MemberService.class);
// 이름없이 타입만으로 조회
MemberService memberservice = ac.getBean(MemberService.class);
// 구체 타입으로 조회 : 유연성 떨어진다!
MemberService memberservice = ac.getBean("memberService", MemberServiceImpl.class);
- 스프링 빈 조회 (동일한 타입이 둘 이상)
// 타입으로 조회시 같은 타입이 둘 이상 있으면 중복 오류 발생한다.
DiscountPolicy bean = ac.getBean(MemberRepository.class); // 오류 발생
// 타입으로 조회시 같은 타입이 둘 이상 있으면 빈 이름 지정하면 된다.
MemberRepository memberRepository = ac.getBean("memberRepository", MemberRepository.class);
// 특정 타입 모두 조회하기
...
- 스프링 빈 조회 (상속 관계)
부모 타입으로 조회하면 자식 타입도 함께 조회된다.
그래서 모든 자바 객체의 최고 부모인 Object 타입으로 조회하면 모든 스프링 빈을 조회한다.
(눈에 보이지 않지만 아래와 같은 클래스들을 살펴보면 extends Object를 하고 있다. 자동으로 코드가 들어간다.
자바는 기본적으로 모든 최상위 부모는 Object이다.)
public class ApplicationContextBasicFindTest extends Object { ... }
// 부모 타입으로 조회시 자식이 둘 이상 있으면 중복 오류가 발생한다.
DiscountPolicy bean = ac.getBean(DiscountPolicy.class); // 중복 오류 발생
// 부모 타입으로 조회시 자식이 둘 이상 있으면 빈 이름을 지정하면 된다.
DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy", DiscountPolicy.class);
// 특정 하위 타입으로 조회
DiscountPolicy bean = ac.getBean(RateDiscountPolicy.class);
// 부모 타입으로 모두 조회하기
...
// 부모 타입으로 모두 조회하기 (Object)
...
@Configuration
static class TestConfig {
@Bean
public DiscountPolicy rateDiscountPolicy() {
return new RateDiscountPolicy();
}
@Bean
public DiscountPolicy fixDiscountPolicy() {
return new FixDiscountPolicy();
}
}
BeanFactory와 ApplicationContext
BeanFactory
스프링 컨테이너의 최상위 인터페이스
스프링 빈을 관리하고 조회하는 역할
getBean()을 제공
지금까지 우리가 사용했던 대부분 기능은 BeanFactory가 제공하는 기능
ApplicationContext
BeanFactory 기능을 모두 상속받아서 제공
빈 관리기능 + 편리한 부가 기능을 제공
BeanFactory를 직접 사용할 일은 거의 없다. 부가기능이 포함된 ApplicationContext 사용
BeanFactory나 ApplicationContext를 스프링 컨테이너라고 한다.
다양한 설정 형식 지원 - XML
스프링 컨테이너는 다양한 형식 설정 정보 받아들일 수 있게 유연하게 설계되어 있다.
자바 코드, XML, Groovy 등 ...
지금까지 애노테이션 기반 자바 코드 설정을 사용하였다.
new AnnotationConfigApplicationContext(AppConfig.class)
AnnotationConfigApplicationContext 클래스를 사용하면서 자바 코드로 된 설정 정보를 넘겨주었다.
최근에는 스프링 부트를 많이 사용하면서 XML 기반 설정은 잘 사용되지 않는다.
하지만 아직 많은 레거시 프로젝트들이 XML로 되어있으므로 한번쯤 배워두는 것도 괜찮다고 한다.
GenericXmlApplicationContext를 사용하면서 xml 설정 파일을 넘기면 된다.
...
스프링 빈 설정 메타 정보 - BeanDefinition
스프링이 자바 코드, xml 등의 이러한 다양한 설정 형식을 지원하는 중심에는 beanDefinition이란느 추상화가 있다.
쉽게 이야기해서 역할과 구현을 개념적으로 나눈 것이다.
xml을 읽어서 BeanDefinition을 만든다.
자바 코드를 읽어서 BeanDefinition을 만든다.
BeanDefinition을 빈 설정 메타정보라고 한다.
@Bean , <bean> 당 각각 하나씩 메타 정보가 생성된다.
스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.
추상화에만 의존하도록 설계한 것이다.
BeanDefinition자체가 인터페이스이다.
BeanDefinition 정보
- BeanClassName : 생성할 빈의 클래스 명
- factoryBeanName : appConfig와 같은 팩토리 역할의 빈을 사용할 경우 이름
- factoryMethodName : memberService와 같은 빈을 생성할 팩토리 메서드 지정
- Scope : 싱글톤(기본값)
...
여기까지 스프링 컨테이너와 스프링 빈에 대해 알아보았다.
다음 파트에선 싱글톤 컨테이너에 대해 정리하도록 하겠다.
'김영한님의 스프링 강의 학습 > 스프링 핵심 원리' 카테고리의 다른 글
#5 싱글톤 컨테이너, #6 컴포넌트 스캔 (0) | 2022.12.22 |
---|---|
#3 스프링 핵심 원리 이해2 - 객체지향 원리 적용2 (0) | 2022.10.01 |
#3 스프링 핵심 원리 이해2 - 객체지향 원리 적용1 (1) | 2022.09.30 |
#2 스프링 핵심 원리 이해 - 예제 만들기2 (0) | 2022.09.29 |
#2 스프링 핵심 원리 이해 - 예제 만들기1 (0) | 2022.09.28 |