작성
·
598
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예
[질문 내용]
이 링크가 제가 어제 질문했던 부분인데요
답변을 봐도 영한님이 쓰신 코드랑 똑같이 진행했던 코드라 틀리는 게 아무리 봐도 이해가 되질 않습니다
영한님의 컴포넌트 부분 코드를 다운 받을 수 있을까요?
아니면 제 코드를 첨부하고 싶은데 여기에 첨부할 수가 없어서 너무 답답합니다 ㅠㅠ
빨리 진도도 나가고 싶은데 이런 이유도 모르는 부분에서 막히니 이거에만 계속 매달리고 있어요
답변 1
-1
해당 테스트를 실행시키면 오류가 발생하는게 정상입니다.
이런 오류를 피하기 위해 AutoAppConfig에 excludeFilter를 통해 @Configuration 클래스를 스캔하지 않도록 한 뒤, 컨테이너 생성시 AutoAppConfig를 파라미터로 넘겨주는 것입니다.
AutoAppConfig를 넘겨줘서 컨테이너를 생성하는 예시는 AutoAppConfigTest
클래스를 보시면 됩니다.
본 강의 옵션처리
편 2분17초부터 참고해 주세요.
본 강의에서는 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가 여전히 스캔됩니다.
@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)이 먹지 않을 것입니다. 그래서 발생하는 오류로 추측됩니다.
https://drive.google.com/file/d/13bo2Q4wqsWUfLihMDcl5CeTOWwO8BS8c/view?usp=sharing
테스트 파일 중, CoreApplicationTests 파일을 실행시키면 오류가 발생합니다.
위와 같은 문제가 발생합니다.