[Spring] 김영한 스프링 핵심원리 기본_chap04 스프링 컨테이너와 스프링 빈

HMS·2023년 3월 30일

해당 내용은 김영한 스프링 핵심원리 기본 강의를 들으며 강의 자료를 참고하여 정리한 내용입니다.

김영한 스프링 핵심원리 기본


스프링 컨테이너와 스프링 빈
ApplicationContext를 스프링 컨테이너라 함
ApplicationContext는 인터페이스다.
스프링 컨테이너는 XML 기반으로 만들 수 도 있고 어노테이션 기반의 자바 클래스로 만들 수 있다, -> XML은 잘 안쓴다
스프링 컨테이너 생성

new AnnotationConfigApplicationContext(AppConfig.class) 로 컨테이너 생성
스프링 컨테이너를 생성할 때는 구성정보를 지정해주어야하는데 여기서는 AppConfig.class를 구성 정보로 지정

스프링 빈 등록

스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록함
@Bean이 붙은 메소드를 호출하고 빈 이름을 Key로 new로 생성한 객체를 value로 저장한다.
이름은 직접지정할 수 도 있으나@Bean(“name”) 보통은 default로
빈 이름은 항상 다른 이름을 부여해야한다! -> 충돌해서 오류발생가능
스프링 빈 의존관계 설정

스프링 컨테이너는 설정정보를 참고해서 의존관계를 주입함
동적인 인스턴스 의존관계를 참조값을 전달해주어 연결해 줌
빈을 먼저 생성하고 구현관계를 연결하는것

컨테이너에 등록된 스프링 빈 조회하기
Tip 배열이 있을때 iter +탭 치면 자동으로 포문 만들어줌
getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름 조회 배열로 저장
.getBean() 빈 이름으로 빈 객체 조회
스프링이 내부에서 사용하는 빈은 getRole() 로 구분할 수 있다.
ROLE_APPLICATION : 일반적으로 사용자가 정의한 빈
ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈

스프링 빈 조회
스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 방법
ac.getBean(빈이름, 타입)
ac.getBean(타입)
타입에는 인터페이스를 적는것이 좋으나 구체클래스를 적어도 리턴타입과 일치한다면 검색은 된다.
하지만 구체클래스를 사용하는것은 구현에 의존하는것이기 때문에 유연성이 떨어져 좋은코드가 아니다.
테스트시 isInstanceOf()메소드를 사용하면 객체의 속성일치를 확인할 수 있다.
assertThrows(“”,””)메소드는 오른쪽 매개변수가 실행되면 왼쪽예외가 터지는것을 확인한다.

스프링 빈 조회
타입으로 조회시 같은 타입이 둘 이상 있으면 중복 오류가 발생한다.
NoUniqueBeanDefinitionException 발생 하나만 있어야하는데 두개 나왔다
타입으로 조회시 같은 타입이 둘 이상 있으면, 빈이름을 지정하면됨!.
getBean("memberRepository",MemberRepository.class)
특정타입 모두 조회
getBeansOfType(MemberRepository.class); -> 맵 배열에 키와 객체로 담을 수 있음
컨트롤 알트 v = 값에 맞는 변수 자동 생성

스프링 빈 조회 -상속관계
부모타입으로 조회하면 자식 타입도 함께 조회한다
Object 타입으로 검색하면 스프링 빈에 등록된 모든 타입 스프링빈을 조회하게됨
오브젝트 타입으로 모두 조회하기
getBeansOfType(Object.class);
모든 스프링빈 확인 가능

BeanFactory와 ApplicationContext

빈 팩토리는

BeanFactory
스프링 컨테이너의 최상위 인터페이스
스프링 빈을 관리하고 조회하는 역할을 담당
getBean() 제공
ApplicationContext
빈팩토리의 모든 기능을 상속받아 제공
빈팩토리와 차이는 빈을 관리 조회하는 기능 뿐만아니고, 환경설정이나 메세지소스제공등 수 많은 부가기능을 상속받아 제공한다.
일반적인 애플리케이션을 만들때 필요한 공통기능들

메시지소스
한국에서 들어오면 한국어로 영어권에서 들어오면 영어로 출력
환경변수
로컬 개발 운영들을 구분해서 처리
개발이면 개발db에 운영이면 운영db에 연결하는 그러한 역할
애플리케이션 이벤트
이벤트를 발생하고 구독하는 모델을 편리하게 지원
리소스로더
파일, 클래스패스 , 외부등에서 리소스를 편리하게 조회
정리
어플리케이션컨택스트는 빈팩토리를 상속받아 사용한다. 빈팩토리의 빈 관리 기능과 추가적으로 어플리케이션을 만들 때 필요한 부가기능들을 제공한다.
빈팩토리를 직접 사용할 일은 거의 없으며 빈팩토리나 어플리케이션 컨텍스트를 스프링 컨테이너라고 한다.

다양한 설정 형식 지원 - 자바 코드, XML
스프링이 얼마나 유연하게 설정정보를 바꿀수 있는가를 아는것이 중요!
AnnotationConfigApplicationContext : 자바코드로 설정
GenericXmlApplicationContext : xml방식으로 설정
스프링 부트를 사용하면서 xml기반 설정을 잘 사용하지 않는다
컴파일없이 빈 설정 정보를 변경할 수 있는 장점도 있음
XxxApplicationContext : 직접 방식을 지정하여 설정

이 두 코드는 완벽하게 같다
bean객체로 memberService 메소드를 생성하고 class주소를 지정해준다
bean객체로 memberRepository메소드를 생성하고 class주소를 지정
constructor로 구현객체이름과 레퍼런스를 넘긴다.

스프링 빈 설정 메타 정보 - BeanDefinition
어떻게 다양한 설정형식을 지원하는것??

profile
안녕하세요

0개의 댓글