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

tiger1303님의 프로필 이미지
tiger1303

작성한 질문수

스프링 핵심 원리 - 기본편

중복 등록과 충돌

CoreApplication 실행시 AppConfig, AutoAppConfig순서

작성

·

76

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예

[질문 내용]
CoreApplication 실행 시에 @SpringBootApplication어노테이션 안에 @ComponentScan 이 있어서

@Configuration이 써진 AppConfig와 AutoAppConfig가 스캔되는 대상인 것은 알겠습니다.

 

CoreApplication 실행시 AppConfig의 로그가 찍히는데

image.png

1.AppConfig와 AutoAppConfig가 둘다 작동됐는데 AppConfig가 뒤에 작동 된건지 순서가 궁금합니다.

 

2.AutoAppConfig에서 필터로 AppConfig는 스캔되지 않게 해줬는데 이것과 무관하게 CoreApplication 의 어노테이션으로 인해 AppConfig파일도 스캔된건지 궁금합니다.

@Configuration
@ComponentScan(
        excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =
                Configuration.class))
public class AutoAppConfig {

}
  1. CoreApplication 실행 시에 스프링 컨테이너를 설정 안해줬는데 왜 AppConfig의 로그가 도는지... 궁금합니다

    image.png

     

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

tiger1303님의 질문에 대해 유사한 상황을 다룬 질문들을 발견했습니다. 아래의 내용들은 tiger1303님의 궁금증을 해결하는 데 도움이 될 수 있을 것입니다.

  1. AppConfig와 AutoAppConfig의 스캔 순서 및 실행에 대한 질문: 스프링 부트에서 @SpringBootApplication 어노테이션이 붙은 CoreApplication 실행 시, 내부적으로 @ComponentScan 어노테이션이 있어 지정된 패키지 내의 모든 컴포넌트(@Component, @Service 등) 및 @Configuration이 붙은 클래스들(AppConfig, AutoAppConfig 포함)을 스캔합니다. AutoAppConfig에서 AppConfig를 제외시키려고 설정한 excludeFilters는 AutoAppConfig 내부에서만 적용됩니다. 즉, CoreApplication 수준에서의 스캔은 @SpringBootApplication에 의해 직접 제어되므로, AppConfig와 AutoAppConfig가 모두 스캔 대상이 될 수 있습니다.

  2. CoreApplication에서 AppConfig 로그 실행 원인: 이는 CoreApplication 실행 시 스프링이 @SpringBootApplication 어노테이션이 포함한 @ComponentScan에 의해 패키지 내 모든 컴포넌트 및 설정 클래스를 스캔하기 때문입니다. AppConfig의 로그가 찍히는 것은 AppConfig에 정의된 Bean들이 스프링 컨테이너에 의해 생성되고 있음을 의미합니다.

비슷한 상황을 다루는 질문들로부터의 추출된 정보를 바탕으로 제공되었습니다. 자세한 해명이나 추가적인 설명이 필요한 경우, 다음 링크들을 참조하시기 바랍니다:

이러한 정보들로 tiger1303님의 질문에 답변이 되었기를 바랍니다. 추가적으로 궁금한 사항이 있다면, 언제든지 더 자세한 질문을 남겨주세요. 스프링 프레임워크와 관련하여 발생할 수 있는 여러가지 설정과 작동 방식에 대해 더 알아가는 것은 개발 과정에서 큰 도움이 됩니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

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

추가적으로 https://www.inflearn.com/community/questions/1039845/%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EC%8A%A4%EC%BA%94-%EA%B4%80%EB%A0%A8-%EC%A7%88%EB%AC%B8

이곳에 답변에 의하면

'이런 경우에는 스프링 부트의 설정이 먼저 적용됩니다. 따라서 AppConfig, AutoAppConfig도 함께 스캔이 되고, 빈으로 생성됩니다. 이 경우 AutoAppConfig의 설정은 무시됩니다. ' 이렇게 답변이 되었습니다.

그렇다면

  1. AutoAppConfig의

@ComponentScan( excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class))

이 부분이 무시가 되어서 결국 AutoAppConfig파일을 스캔해도 @Configuration 어노테이션만 적용되고 @ComponentScan은 적용되지 않아

public class AutoAppConfig { } 이 빈 부분만 스캔되는 것이고 @ComponentScan어노테이션 기능은 안하는 것인가요?

  1. 따라서 결국엔 AppConfig의 밑에 @Bean부분들만 스캔되는 것인가요?

image.png

 

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. tiger1303님

여러 컴포넌트 스캔이 함께 사용되는 경우 결과들이 하나로 합쳐지게 됩니다.

예를 들어서 CoreApplication에 있는 컴포넌트 스캔과 AutoAppConfig에 있는 컴포넌트 스캔이 함께 작동하면 둘의 합이 결과로 나오게 됩니다.

따라서 AppConfig는 CoreApplication에 있는 컴포넌트 스캔에 의해서 스캔이 됩니다.

감사합니다.

tiger1303님의 프로필 이미지
tiger1303

작성한 질문수

질문하기