김영한님의 스프링 강의 학습/스프링 핵심 원리

#4 스프링 컨테이너와 스프링 빈

2022. 11. 10. 19:58
목차
  1. 스프링 컨테이너 생성
  2. 스프링 빈 조회
  3. BeanFactory와 ApplicationContext
  4.  
  5. 다양한 설정 형식 지원 - XML
  6. 스프링 빈 설정 메타 정보 - BeanDefinition

해당 강의는 김영한 강사님의 유료 강의로, 아주 간략하게 배운 부분들을 짚고 넘어가는 식으로 작성하였습니다.

생략된 부분이 많습니다. 전체 소스코드 공개도 금지이므로 블로그에 부분적으로만 올릴 생각입니다.

강의를 보며 포스트잇을 붙이는 느낌으로 제가 보기 위해 작성하는 글이니

학습을 위해서라면 아래 링크의 강의를 직접 들으시는 것을 추천합니다!

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8#

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

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
  1. 스프링 컨테이너 생성
  2. 스프링 빈 조회
  3. BeanFactory와 ApplicationContext
  4.  
  5. 다양한 설정 형식 지원 - XML
  6. 스프링 빈 설정 메타 정보 - BeanDefinition
'김영한님의 스프링 강의 학습/스프링 핵심 원리' 카테고리의 다른 글
  • #5 싱글톤 컨테이너, #6 컴포넌트 스캔
  • #3 스프링 핵심 원리 이해2 - 객체지향 원리 적용2
  • #3 스프링 핵심 원리 이해2 - 객체지향 원리 적용1
  • #2 스프링 핵심 원리 이해 - 예제 만들기2
daramG
daramG
dotori Java
daramG
다람쥐의 개발 블로그
daramG
전체
오늘
어제
  • 분류 전체보기 (193)
    • Java 코딩테스트 공부 (67)
      • Java 알고리즘 공부 (37)
      • Java 백준 문제풀이 (27)
      • Java 코테 나만의 팁 (3)
    • SQL Study (0)
      • Programmers SQL 문제풀이 (0)
      • SQLP 준비 (0)
    • 웹 개발 지식 정리 (0)
      • Servlet (0)
      • Java 정리 (0)
    • 자바 스프링 (45)
      • 스프링 공부 (4)
      • 스프링 게시판 프로젝트 (6)
      • 부트 블로그 JPA 프로젝트 (30)
      • react & springboot (5)
      • 스프링 오류창고 (0)
      • 리액트 + 스프링 프로젝트 (0)
      • pf (0)
      • pfError (0)
    • React (6)
      • React 정리 (3)
      • React 오류 창고 (3)
    • C++ 코딩테스트 공부 (중단) (20)
      • c++ 백준 문제풀이 (15)
      • c++ 알고리즘 공부 (5)
    • Unity (3)
      • Unity 공부 (3)
    • WebRTC (2)
      • WebRTC 강의학습 정리 (0)
      • WebRTC 프로젝트 (1)
    • 김영한님의 스프링 강의 학습 (10)
      • 스프링 강의 목차 (1)
      • 인텔리제이 & 스프링 기초 (1)
      • 스프링 핵심 원리 (8)
    • 전공 지식 정리 (40)
      • interview (0)
      • Java (0)
      • 운영체제 (4)
      • 데이터베이스 설계 (10)
      • 소프트웨어 공학 (3)
      • 유닉스 (14)
      • 디지털 논리회로 (0)
      • 인공지능 (7)
      • js (0)
      • etc (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 부트 jpa 게시판 프로젝트
  • 스프링 공부
  • 운영체제
  • 스프링부트 프로젝트
  • React&Spring 강의수강
  • 디지털 논리회로
  • 무서운 이야기
  • 인공지능
  • Java 코테 나만의 팁
  • Java 백준 문제풀이
  • 노마드코더의 zoom클론코딩
  • 김영한의 스프링 핵심 원리
  • 스프링 프로젝트
  • 데이터베이스 설계
  • 김영한 스프링 강의
  • C++ 알고리즘
  • Unity 공부
  • 백준 c++
  • 코테 알고리즘
  • java
  • 유닉스
  • java 알고리즘
  • 김영한 스프링 입문
  • 스프링부트 블로그 프로젝트

최근 댓글

최근 글

hELLO · Designed By 정상우.
daramG
#4 스프링 컨테이너와 스프링 빈
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.