• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

스프링 빈 조회 질문입니다

24.01.30 20:03 작성 24.01.30 20:33 수정 조회수 108

0

스프링 빈 조회할때 검증할때 isInstanceOf로 타입 비교를 할 때 느낌상으로는 MemberService 인터페이스를 넣어야될것같은데 MemberServiceImpl이 들어가는 이유가궁금합니다... 너무 당연하긴하지만 MemberService가 들어가도 검증이 되는지 궁금합니다.

그리고 하나 더 궁금한건 객체 타입이면 memberService이렇게 들어가면되는데 확장자 이름까지 들어가는지궁금합니다. ex) MemberServiceImpl -> MemberServiceImpl.class

package hello.core.beanfind;
import hello.core.AppConfig;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import
org.springframework.context.annotation.AnnotationConfigApplicationContext;
import static org.assertj.core.api.Assertions.*;
class ApplicationContextBasicFindTest {
 AnnotationConfigApplicationContext ac = new
AnnotationConfigApplicationContext(AppConfig.class);
 @Test
 @DisplayName("빈 이름으로 조회")
 void findBeanByName() {
 MemberService memberService = ac.getBean("memberService", 
MemberService.class);
 assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
 }
 @Test
 @DisplayName("이름 없이 타입만으로 조회")
 void findBeanByType() {
 MemberService memberService = ac.getBean(MemberService.class);
 assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
 }
 @Test
 @DisplayName("구체 타입으로 조회")
 void findBeanByName2() {
 MemberServiceImpl memberService = ac.getBean("memberService", 
MemberServiceImpl.class);
 assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
 }
 @Test
 @DisplayName("빈 이름으로 조회X")
 void findBeanByNameX() {
 //ac.getBean("xxxxx", MemberService.class);
 Assertions.assertThrows(NoSuchBeanDefinitionException.class, () ->
ac.getBean("xxxxx", MemberService.class));
 }
}

답변 1

답변을 작성해보세요.

0

안녕하세요. 이찬진님

이 테스트의 목적은 MemberService를 구현한 여러가지 구현체 중의 하나가 아니라 아주 명확하게 MemberServiceImpl가 구현을 했는지 확인하기 위함입니다.

추가로 자바에서 .class가 붙게되면 특정 클래스의 타입 정보를 확인할 수 있습니다. 클래스 정보를 instance of에서는 .class를 생략할 수 있지만 이 테스트 메서드에서는 .class를 붙여서 클래스의 타입 정보를 명확하게 전달해주어야 합니다. 인스턴스나 객체가 아니라 클래스의 정보를 전달하려면 .class를 붙여야 된다고 이해하시면 됩니다.

감사합니다.

이찬진님의 프로필

이찬진

질문자

2024.02.02

좋은 답변 감사드립니다. 덕분에 궁금증 해결하고 갑니다!