Programming-[Backend]/Spring

[스프링 기초] 9. 빈 조회하기

컴퓨터 탐험가 찰리 2021. 6. 15. 22:06
728x90
반응형

1. 빈 조회하기



우리가 원하는 프로그램을 위해서 이제 컨테이너에 등록된 빈들을 조회해야 한다. 즉, 구성영역에 있는 Service와 Repository 등으로 미리 맺어진 관계를 이용해서 필요한 객체들을 불러와야 한다.


2. 빈 조회해보기



빈을 조회하는 메서드는 스프링에서 미리 정해둔 여러가지 메서드를 사용한다. 코드를 보면 간단히 이해할 수 있다. 실무에서는 이런 메서드를 이용해서 빈을 조회하지도 않고, 만약 필요하다고해도 대략적인 이름만 기억하더라도 IDE가 메서드 이름의 목록을 호출해주기 때문에, 굳이 일일이 외울 필요는 없다. 그냥 테스트 코드를 통해 빈들을 조회해보는 실습만 해보면 된다. 대략 아래와 같은 코드로 테스트 해보면 된다.




코드에서 사용되는 빈 메서드 종류를 정리하면 다음과 같다.


  • getBeanDefinitionNames() : 컨테이너에 등록된 모든 빈을 조회한다.
  • getBean(빈 이름) : '빈 이름'을 갖는 빈을 조회한다.
  • getBean(빈 타입) : '빈 타입'을 갖는 빈을 조회한다. 인터페이스, 구체타입 어떤 걸로든 조회가능하다. 같은 타입의 빈이 둘 이상이면 오류가 발생한다. 이 때는 빈 이름을 지정해주도록 한다.
  • getBean(빈 이름, 빈 타입) : '빈 이름'을 갖고, '빈 타입'을 갖는 빈을 조회한다.
  • getBeanDefinition(빈 이름) : 빈에 대한 메타 데이터 정보를 BeanDefinition 타입으로 반환한다.
  • getBeanDefinition(빈 이름).getRole() : BeanDefinition.ROLE_APPLICATION으로 스프링 내부 빈을 제외한 애플리케이션에서 사용하는 빈만 조회할 수 있다.(스프링 내부의 Bean은 BeanDefinition.ROLE_INFRASTRUCTURE로 조회한다)
  • getBeansOfType(빈 타입) : 특정 타입의 빈을 모두 조회한다.





3. 빈 조회 - 상속 관계



빈을 조회할 때, 기억해야할 중요한 원칙이 있다.

부모 타입으로 조회하면, 자식 타입도 함께 조회한다.



그래서 아래와 같이 자식 타입이 있는 빈을 부모타입으로 빈을 조회하면 NoUniqueBeanDefinitionException이 발생한다. 테스트 해보자.



굳이 컨테이너를 따로 만들지 않고 테스트 파일 내부에서 정적인 컨테이너를 이용해슈 테스트할 수 있다. TestConfig를 static한 컨테이너로 만들어두고, CaringPolicy를 상속받는 fixedCaringPolicy, rateCaringPolicy를 Bean으로 정의해놓는다. 그리고 이 컨테이너에서 부모 타입인 CaringPolicy를 조회하면, 스프링이 fixed, rate CaringPolicy 중 어떤 것을 조회해야할 지 모르기 때문에 에러가 발생한다.

지난 글에서 배운 것과 같이 빈 이름을 명시해주거나, 특정 하위 타입으로 빈을 조회하면 된다.
중요한 것은 부모 타입으로 조회 했을 땐 상속받는 자식 타입들도 모두 조회된다는 사실을 기억하고 있는 것이다!


참조

1. 인프런_스프링 핵심 원리 기본편_김영한 님 강의
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/dashboard

728x90
반응형