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

Sully님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

중복 등록과 충돌

이것 때문에 진도를 못 나가고 있는데 혹시 강사님이 진행하신 코드를 다운받을 수 있을까요?

작성

·

576

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]

https://www.inflearn.com/questions/1241959/%EA%B0%95%EC%9D%98%EB%A5%BC-%EB%94%B0%EB%9D%BC%EA%B0%80%EB%8B%A4%EA%B0%80-%ED%95%98%EB%82%98%EC%9D%98-%EB%B9%88%EC%9D%B4-%ED%95%84%EC%9A%94%ED%95%9C%EB%8D%B0-2%EA%B0%9C%EC%9D%98-%EB%B9%88%EC%9D%B4-%EC%A1%B0%ED%9A%8C%EB%90%9C%EB%8B%A4%EA%B3%A0-%EB%82%98%EC%98%A4%EB%A9%B4%EC%84%9C-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%84%9C%EB%B2%84%EA%B0%80-%EB%9D%84%EC%9B%8C%EC%A7%80%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4

 

이 링크가 제가 어제 질문했던 부분인데요

답변을 봐도 영한님이 쓰신 코드랑 똑같이 진행했던 코드라 틀리는 게 아무리 봐도 이해가 되질 않습니다

 

영한님의 컴포넌트 부분 코드를 다운 받을 수 있을까요?

아니면 제 코드를 첨부하고 싶은데 여기에 첨부할 수가 없어서 너무 답답합니다 ㅠㅠ

 

빨리 진도도 나가고 싶은데 이런 이유도 모르는 부분에서 막히니 이거에만 계속 매달리고 있어요

답변 1

-1

안녕하세요. Sully님, 공식 서포터즈 David입니다.

도움을 드리고 싶지만 질문 내용만으로는 답변을 드리기 어렵습니다.

실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx


주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요


추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명


링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

Sully님의 프로필 이미지
Sully
질문자

https://drive.google.com/file/d/13bo2Q4wqsWUfLihMDcl5CeTOWwO8BS8c/view?usp=sharing

 

  1. 테스트 파일 중, CoreApplicationTests 파일을 실행시키면 오류가 발생합니다.

  2.  

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in hello.core.member.MemberServiceImpl required a single bean, but 2 were found:
	- memoryMemberRepository: defined in file [/Users/wonjunjeong/study/inflearn/kim/project/core/out/production/classes/hello/core/member/MemoryMemberRepository.class]
	- memberRepository: defined by method 'memberRepository' in class path resource [hello/core/AppConfig.class]

This may be due to missing parameter name information

위와 같은 문제가 발생합니다.

해당 테스트를 실행시키면 오류가 발생하는게 정상입니다.

이런 오류를 피하기 위해 AutoAppConfig에 excludeFilter를 통해 @Configuration 클래스를 스캔하지 않도록 한 뒤, 컨테이너 생성시 AutoAppConfig를 파라미터로 넘겨주는 것입니다.

AutoAppConfig를 넘겨줘서 컨테이너를 생성하는 예시는 AutoAppConfigTest 클래스를 보시면 됩니다.

본 강의 옵션처리편 2분17초부터 참고해 주세요.

Sully님의 프로필 이미지
Sully
질문자

본 강의에서는 AutoAppConfig에 수동으로 빈 주입을 했을 때, CoreApplicationTests 테스트가 오류가 발생을 한 것이고, 그 수동 빈 주입 코드를 삭제하면 CoreApplicationTests는 정상적으로 돌아가더라구요

제 경우는 AutoAppConfig에 수동으로 빈 주입을 하지 않았는데도 CoreApplicationTests가 돌아가질 않아서, excludeFilter가 제대로 작동하지 않은 것인지 그것이 의문이에요

강사님이랑 같은 환경에서 같은 코드를 작성했는데, 강사님은 CoreApplicationTests 테스트가 아무 문제가 없고, 저는 CoreApplicationTests 테스트가 문제가 있으니 이 이유를 알고 싶어요!
오류가 발생하는 것이 정상이라면 강사님 개발 환경에서도 CoreApplicationTests 테스트에서 오류가 나야 한다고 생각했어요

안녕하세요, Sully님.

답변이 매우 늦어져 죄송합니다.

 

제가 강의를 몇번 돌려보았는데 아래 부분에 해당하는 곳을 찾지 못했습니다. 혹시 몇분 몇초인지 알려주실 수 있으실까요?
본 강의에서는 AutoAppConfig에 수동으로 빈 주입을 했을 때, CoreApplicationTests 테스트가 오류가 발생을 한 것이고, 그 수동 빈 주입 코드를 삭제하면 CoreApplicationTests는 정상적으로 돌아가더라구요

 

올려주신 코드 상에서 문제되는 부분은 AppConfig에서 수동으로 추가되는 MemberRepository와 @Component가 붙어있는 MemoryMemberRepository입니다.

 

@ComponentScan에 대한 학습 테스트를 진행해 보면 @ComponentSacn이 여러 개 존재할 때 먼저 처리되는 @ComponentScan(여기서는 Config01)이 적용되고 그 아래 것들(Config02~04)는 적용되지 않음을 확인할 수 있습니다.

 

Config01은 config01 이하 패키지를 모두 스캔합니다.

이때, Config02는 excludeFilter를 갖고 있으나 Config03, 04가 여전히 스캔됩니다.
image

@Configuration
@ComponentScan(
        basePackages = "com.playground.springboot279.componentscan.config01"
)
public class Config01 {

}
@Configuration
@ComponentScan(
        basePackages = "com.playground.springboot279.componentscan.config01.config02",
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class Config02 {

}
@Configuration
public class Config03 {

}
@Configuration
public class Config04 {

}
public class ComponentScanTest {

    @Test
    void componentScanTest() {
        final ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(Config01.class);
        final Object config02 = ac.getBean("config02");
        final Object config03 = ac.getBean("config03");
        final Object config04 = ac.getBean("config04");
        Assertions.assertNotNull(config02);
        Assertions.assertNotNull(config03);
        Assertions.assertNotNull(config04);
    }
}

 

강의 3분 26초의 테스트를 보시면 ExcludeFilter가 걸려있는 AutoAppConfig를 컨테이너를 생성할 때 넘겨줍니다. 이렇게 되면 해당 컨테이너는 AutoAppConfig의 @ComponentScan 설정을 통해 컴포넌트 스캔이 진행됩니다. 그러나 CoreApplicationTests 테스트의 경우 @SpringBootTest에 의해 CoreApplication 클래스에 붙어 있는 @SpringBootApplication 내 @ComponentScan의 설정으로 컴포넌트 스캔이 진행되게 됩니다. 그러면 AutoAppConfig의 @ComponentScan 설정(excludeFilter)이 먹지 않을 것입니다. 그래서 발생하는 오류로 추측됩니다.

Sully님의 프로필 이미지

작성한 질문수

질문하기