You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
NoSuchBeanDefinitionException: No bean named 'xxxxx' available 조회 대상 빈이 없으면 해당 에러 발생
스프링 빈 조회 - 동일한 타입이 둘 이상
당연하지만 빈 이름을 지정해주면 된다.
@Test@DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다")
voidfindBeanByTypeDuplicate() {
//MemberRepository bean = ac.getBean(MemberRepository.class);assertThrows(NoUniqueBeanDefinitionException.class, () ->
ac.getBean(MemberRepository.class));
}
타입으로 조회했는데 같은 타입이 둘 이상 있으면 NoUniqueBeanDefinitionException 에러가 발생한다.
@Test@DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 빈 이름을 지정하면 된다")
voidfindBeanByName() {
MemberRepositorymemberRepository = ac.getBean("memberRepository1",
MemberRepository.class);
assertThat(memberRepository).isInstanceOf(MemberRepository.class);
}
xml 기반의 설정 파일은 최근에 거의 사용하지 않지만 xml을 사용하면 컴파일 없이 빈 설정 정보를 변경할 수 있다.
스프링 빈 설정 메타 정보 - BeanDefinition
스프링이 자바 코드 형식이든 XML 형식이든 다양한 설정 형식을 지원할 수 있는 것은 BeanDefinition이라는 추상화가 있다.
XML을 읽어서 BeanDefinition을 만들면 된다.
자바 코드를 읽어서 BeanDefinition을 만들면 된다.
스프링 컨테이너는 XML인지 자바 코드인지 몰라도 되고 BeanDefinition만 알면 된다.
BeanDefinition을 빈 설정 메타정보라고 한다.
@Bean, <bean>당 하나씩 메타 정보가 생성된다.
⬇️
한마디로 역할과 구현을 개념적으로 나눈 것
- 코드 레벨
- `AnnotationConfigApplicationContext`는 `AnnotatedBeanDefinitionReader`를 사용해서 `AppConfig.class`를 읽고 `BeanDefinition` 생성
- `GenericXmlApplicationContext`는 `XmlBeanDefinitionReader`를 사용해서 `appConfig`를 읽고 `BeanDefinition` 생성
- 새로운 형식의 설정 정보가 추가되면, XxxBeanDefinitionReader를 만들어서 `BeanDefinition`을 생성하면 됨
BeanDefinition
BeanClassName: 생성할 빈의 클래스 명 (자바 설정처럼 팩토리 역할의 빈을 사용하면 없음)
factoryBeanName: 팩토리 역할의 빈을 사용하는 경우 ex) appConfig
factoryMethodName: 빈을 생성할 팩토리 메서드 지정 ex) memberService
Scope: 싱글톤
lazyInit: 스프링 컨테이너 생성 시점에 빈을 생성하는 것이 아니라, 사용 때가지 생성을 지연 처리 하느지 여부
InitMethodName: 빈을 생성하고 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
DestroyMethodName: 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명
Constructor arguments, Properties: 의존관계 주입에서 사용 (자바 설정처럼 팩토리 역할의 빈을 사용하면 없음)
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
스프링 컨테이너 생성
ApplicationContext를스프링 컨테이너라고 하며 인터페이스이다.XML 기반 / 애노테이션 기반의 자바 설정 클래스로 만들 수 있다.
AnnotationConfigApplicationContext가ApplicationContext의 구현체다.스프링 생성 과정
1. 스프링 컨테이너 생성
AppConfig.class를 구성 정보로 지정2. 스프링 빈 등록
3. 스프링 빈 의존관계 설정
💡참고 스프링 빈 등록과 의존관계 설정을 나눠서 설명했지만, 자바 코드로 스프링 빈을 등록할 때는 생성자 호출과 의존관게 주입이 한번에 처리된다.
컨테이너에 등록된 모든 빈 조회
스프링 컨테이너 정보 가져오기
모든 빈 출력하기
ac.getBeanDefinitionNames(): 스프링에 등록된 모든 이름 조회ac.getBean(): 빈 이름으로 빈 객체(인스턴스) 조회애플리케이션 빈 출력하기
getRole()메서드로 빈 구분ROLE_APPLICATION: 사용자가 정의한 빈ROLE_INFRASTRUCTURE: 스프링 내부에서 사용하는 빈💡tip
iter단축키 활용하면for-each구문 빠르게 만들 수 있음스프링 빈 조회 - 기본
①
ac.getBean(빈이름, 타입)②
ac.getBean(타입)빈 이름으로 조회하기
구체 타입으로 조회하기
MemberServiceImpl.class구체 타입에 의존하고 있기 때문에 좋은 코드는 아니다.존재하지 않는 빈 이름으로 조회했을 때
NoSuchBeanDefinitionException: No bean named 'xxxxx' available조회 대상 빈이 없으면 해당 에러 발생스프링 빈 조회 - 동일한 타입이 둘 이상
당연하지만 빈 이름을 지정해주면 된다.
NoUniqueBeanDefinitionException에러가 발생한다.ac.getBeansOfType()을 사용하면 해당 타입의 모든 빈을 조회할 수 있다.스프링 빈 조회 - 상속 관계
Object타입으로 조회하면 모든 스프링 빈이 함께 조회됨NoUniqueBeanDefinitionException에러 발생getBeansOfType()메서드를 활용해 부모 타입으로 모두 조회할 수 있다.Object로 조회하면 모든 스프링 빈을 확인할 수 있다.BeanFactory와 ApplicationContext
BeanFactory
getBean()제공BeanFactory가 제공하는 기능임ApplicationContext
BeanFactory기능을 모두 상속 받아서 제공BeanFactory에서 제공 받는 것ApplicationContext는 빈을 관리하고 조회할 수 있는 기능 외에 수 많은 부가 기능을 갖고 있다.MessageSource: 국가에 따른 출력 언어 설정EnvironmentCapable: 환경 변수로 로컬/개발/운영 등을 구분해서 처리ApplicationEventPublisher: 이벤트를 발생하고 구독하는 모델을 편리하게 지원ResourceLoader: 파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회BeanFactory를 직접 사용할 일은 거의 없으며 부가 기능이 포함된ApplicationContext를 사용하며 이 둘을 스프링 컨테이너라 한다.다양한 설정 형식 지원 - 자바 코드, XML
애노테이션 기반 자바 코드 설정 사용
AppConfig파일을 작성한 것이 바로 애노테이션 기반의 자바 설정 파일AnnotationConfigApplicationContext클래스를 사용하면서자바 코드로 된 설정 정보를 넘겨줌XML 설정 사용
GenericXmlApplicationContext를 사용하면서xml설정 파일을 넘겨줌src/main/resources/appConfig.xml파일 생성(참고) xml 문서에서 setter를 활용한 빈 등록
setter 활용
xml 기반의 설정 파일은 최근에 거의 사용하지 않지만 xml을 사용하면 컴파일 없이 빈 설정 정보를 변경할 수 있다.
스프링 빈 설정 메타 정보 - BeanDefinition
스프링이

자바 코드형식이든XML형식이든 다양한 설정 형식을 지원할 수 있는 것은BeanDefinition이라는 추상화가 있다.XML을 읽어서BeanDefinition을 만들면 된다.자바 코드를 읽어서BeanDefinition을 만들면 된다.XML인지자바 코드인지 몰라도 되고BeanDefinition만 알면 된다.BeanDefinition을 빈 설정 메타정보라고 한다.@Bean,<bean>당 하나씩 메타 정보가 생성된다.⬇️
한마디로 역할과 구현을 개념적으로 나눈 것
- 코드 레벨
BeanDefinition
BeanClassName: 생성할 빈의 클래스 명 (자바 설정처럼 팩토리 역할의 빈을 사용하면 없음)factoryBeanName: 팩토리 역할의 빈을 사용하는 경우 ex) appConfigfactoryMethodName: 빈을 생성할 팩토리 메서드 지정 ex) memberServiceScope: 싱글톤lazyInit: 스프링 컨테이너 생성 시점에 빈을 생성하는 것이 아니라, 사용 때가지 생성을 지연 처리 하느지 여부InitMethodName: 빈을 생성하고 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명DestroyMethodName: 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명Constructor arguments,Properties: 의존관계 주입에서 사용 (자바 설정처럼 팩토리 역할의 빈을 사용하면 없음)BeanDefinition으로 추상화해서 사용하는 것으로 이해하면 됨All reactions