인프런 커뮤니티 질문&답변

sy k님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

필터

[필터 실습 중 ]BeanA 를 인식하지 못하는 현상

해결된 질문

작성

·

532

3

어노테이션을 만들고, BeanA에 어노테이션 붙인 후

테스트를 하는데 계속 BeanA 가 없다고 나옵니다.

  1. 어노테이션 만들기

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyExcludeComponent {
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyIncludeComponent {

}

  1. 클래스에 필터 붙이기

@MyIncludeComponent
public class BeanA {

}
@MyExcludeComponent
public class BeanB {
}


3. 테스트(에러 발생)

  • BeanA에 NoSuchBeanDefinition에러가 발생합니다

  • includeFilters를 적용했는데 이유를 모르겠습니다 ㅠㅠ

@Test
    void filterScan(){

        ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentfilterAppConfig.class);

        BeanA bean = ac.getBean(BeanA.class);
        assertThat(bean).isNotNull();

        Assertions.assertThrows(NoSuchBeanDefinitionException.class, () ->
                ac.getBean(BeanB.class));


    }

    @Configuration
    @ComponentScan(
            includeFilters = @Filter( type = FilterType.ANNOTATION,
            classes = MyIncludeComponent.class),
            excludeFilters = @Filter(type = FilterType.ANNOTATION,
            classes = MyExcludeComponent.class)
    )
   static class ComponentfilterAppConfig{

   }
}


스크린샷 2022-08-27 오전 11.01.48.png

답변 6

0

sy k님의 프로필 이미지
sy k
질문자

image이렇게 말씀이실까요? 아직 같은 오류가 뜹니다 ㅠ

image

image

BeanA랑 BeanB의 계층을 MyExcludeComponent, MyIncludeComponent랑 비교해보시면 보이실꺼에요.

sy k님의 프로필 이미지
sy k
질문자

오 같은패키지 안에 넣으라는 말씀이셨군요 ㅠㅠ

이제 테스트 수행이 됩니다.
계층구조가 문제였군요 ㅠㅠ 어렵네용

여기에 너무 시간 많이 내어주셔서 감사합니다!

학습하시다 막히는 부분 있으면 언제든 질문 남겨주세요 :)

0

sy k님의 프로필 이미지
sy k
질문자

image

테스트로 패키지를 옮겨서 실행 시켜도 같은 에러가 발생하고있습니다 ㅠㅠ

제가 올린 이미지랑 BeanA, BeanB의 위치가 달라요~

0

sy k님의 프로필 이미지
sy k
질문자

OMG님 이렇게 신경 써주셔서 감사합니다 ㅠㅠ 처음에 할때는 이상없이 된 것으로 봐서 두번째로 제가 다시 해보려고 처음부터 해본것인데 제가 뭐 잘못할건지 잘 모르겠네요 ㅠㅠ

남겨주신 링크 클릭시 404에러가 떠서 일단 구글 드라이브에 업로드해서 링크로 드려봅니다
https://drive.google.com/file/d/19ct5xN8WehTOAxl-7GPJ_fFXYdmOCdbI/view?usp=sharing

감사합니다

image링크가 아마 인프런 에디터가 변경되서 이렇게 입력되어 오류가 나는 것 같아요.

확인 후 답변드리겠습니다

image

BeanA, BeanB, MyExcludeComponent, MyIncludeComponet 위치를 main/java 패키지에서 test/java로 옮겨서 확인해보시겠어요?

0

sy k님의 프로필 이미지
sy k
질문자

클래스 BeanA , BeanB가 있는데도

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'beanA' available

이렇게 에러가 나네요
다만 타입으로 지정시에는 타입을 찾을 수 없다고 나오고 이름까지 지정시에는 빈 이름을 조회할 수 없다고 나옵니다.

혹시나 해서 강의 자료 코드를 그대로 복사해서 넣어봐도 에러가 뜹니다. 일단 컴파일 에러가 뜨지 않는것으로 봐서 테스트 코드에는 문제가 없고 아예 빈 자체를 인식을 못하는것 같은데 무엇이 문제인지 잘 모르겠네요 ㅠㅠ

안녕하세요. sy k님, 공식 서포터즈 OMG입니다.
코드를 확인해봐야 알 것 같습니다

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

주의
: 업로드시 권한 문제 꼭 확인해주세요
공유 기본 설정은 비공개로 되어 있어 업로드 한 본인 계정만 접근이 가능합니다.

본인 계정이 아닌 링크를 통한 타 계정 접근이 가능한지 확인하는 방법은 업로드 한 구글 계정을 로그아웃하고 링크를 접속하여 "액세스 권한 요청 화면"이 출력되는지 확인을 해주세요.

감사합니다

0

sy k님의 프로필 이미지
sy k
질문자

public class ComponentFilterAppConfigTest {

    @Test
    void filterScan(){

        ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentfilterAppConfig.class);

        BeanA bean = ac.getBean("beanA", BeanA.class); assertThat(bean).isNotNull();

        Assertions.assertThrows(NoSuchBeanDefinitionException.class, () ->
                ac.getBean("beanB", BeanB.class));


    }

    @Configuration
    @ComponentScan(
            includeFilters = @Filter( type = FilterType.ANNOTATION,
            classes = MyIncludeComponent.class),
            excludeFilters = @Filter(type = FilterType.ANNOTATION,
            classes = MyExcludeComponent.class)
    )
   static class ComponentfilterAppConfig{

   }
}


그렇게 해도 에러가 납니다 ㅠㅠ

저렇게 해도 상관이 없을것 같아서 한번 해봤는데 이전것으로 올려졌나봐요

클래스가 BeanA, BeanB 각각 하나씩밖에 없기때문에 빈 이름과 클래스 두개를 지정 안하고
클래스 타입으로만 지정해도 검색이 되지 않을것 같아서 처음에 저렇게 해봤습니다 ㅠ

0

안녕하세요. sy k님, 공식 서포터즈 OMG입니다.
2가지 문제 중 하나이지 않을까 싶습니다.(두번째가 더 가능성 높다고 생각합니다.)

1. BeanA bean = ac.getBean(BeanA.class); assertThat(bean).isNotNull();

이 부분을 강의와 동일하게 작성해서 확인해주세요

  1. https://www.inflearn.com/questions/422982

답변에서 영한님이 말씀하시는 것처럼 스캔 대상의 위치로 인한(패키지 경로) 문제일 것 같습니다.

우선 패키지명이 강의와 다른 것으로 보아 위치도 확인해봐야 알 것 같아요.

좌측의 패키지 구조를 확인할 수 있게 캡쳐(전체 클래스(테스트 코드 포함) 확인 가능하게)해서 올려주세요


감사합니다.

sy k님의 프로필 이미지
sy k
질문자

패키지 명이 다른것은 제가 복습한다고 다시 한번 해 보느라 프로젝트명을 다르게 작성했습니다 hello -> hi

파일 구조를 아래와 같이 첨부드립니다

image

1번도 확인 하셨을까요?

1번도 동일하지 않을 경우 에러가 발생합니다.

https://www.inflearn.com/questions/280865

sy k님의 프로필 이미지
sy k
질문자

@Test
    void filterScan(){

        ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentfilterAppConfig.class);

        BeanA bean = ac.getBean(BeanA.class); assertThat(bean).isNotNull();

        Assertions.assertThrows(NoSuchBeanDefinitionException.class, () ->
                ac.getBean(BeanB.class));


    }

    @Configuration
    @ComponentScan(
            includeFilters = @Filter( type = FilterType.ANNOTATION,
            classes = MyIncludeComponent.class),
            excludeFilters = @Filter(type = FilterType.ANNOTATION,
            classes = MyExcludeComponent.class)
    )
   static class ComponentfilterAppConfig{

   }
}

네, 말씀하신것 처럼 이렇게 작성했는데 BeanA 가 왜 빈으로 등록이 안되는지 모르겠네요 ㅠㅠ

 BeanA bean = ac.getBean(BeanA.class)

이게 아니라

 BeanA bean = ac.getBean("beanA", BeanA.class) 

이렇게요

sy k님의 프로필 이미지

작성한 질문수

질문하기