인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

Hello님의 프로필 이미지
Hello

작성한 질문수

토비의 스프링 부트 - 이해와 원리

Environment 추상화와 프로퍼티

BooleanCondition 동작 질문

해결된 질문

작성

·

494

0

토비님. 안녕하세요!

다름이 아니라 '스프링부트의 @Conditional' 항목을 공부하던 중에 conditional() 테스트 코드가 어떻게 동작할지 생각해보았습니다. 저는 true과 false가 1번씩 호출될 것이라고 추측을 했었는데, true가 3번이 호출되어서 생각과는 다른 결과를 확인하였습니다.

제가 무언가를 잘못 알고 있는 것 같아서 확인해보고 싶습니다. 어떠한 키워드로 알아보면 이것에 대해서 알 수 있을까요?

 

잘려서 보이지 않는 윗부분의 소스 코드는 강의 내용과 다른 점이 없이 작성되어있습니다.

답변 3

3

토비님의 프로필 이미지
토비
지식공유자

조금 더 살펴봤습니다.

일단 컨디션이 false인 경우는 한번만 출력됩니다.

그런데 true인 경우는 처음 한번 출력이 되고 그리고 다음 로그가 나온 뒤에 두 번이 더 출력되네요.

DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'

일단 false 인 경우는 Config2가 아예 빈 생성 대상에서 빠지기 때문에 조건을 한번 체크하고 나서는 더 이상 건드릴 일이 없습니다.

반면 true인 경우는 Config1 클래스 자체가 빈으로 등록이 되고 이후 annotation processor 같은 애노테이션을 다루는 처리기를 거치게 되는데요. 아마 이 작업 중에 컨디션을 다시 체크하는 작업이 두 번 반복적으로 들어가는 것 같습니다. 이게 이미 빈으로 생성된 Config1에 영향을 주는 일은 없지만, 왜 체크하는 기능을 불필요하게 두 번 반복하는지는 더 깊이 내부를 파고 들어가봐야 알 수 있을 것 같습니다.

2

토비님의 프로필 이미지
토비
지식공유자

제가 실행을 해봐도 위에 true가 두번 나오고 나서, 원래 기대했던 true, false가 한번씩 찍힙니다.

자동 구성을 테스트하는 ApplicationContextRunner라는 스프링 부트가 제공하는 테스트 도구에서 뭔가 사전 확인이나 캐싱을 위해서 Condition을 콜을 하는 것 같다는 생각이 드는데요. 이건 제가 내부를 좀 더 들여다봐야 알 수 있을 것 같습니다. 좀 더 확인을 해보고 다시 공유해드릴게요.

일단 간단한 Condition을 만들어서 작성한 코드가 기대한대로 동작하는데는 아무 문제는 없습니다.

2

토비님의 프로필 이미지
토비
지식공유자

이건 제가 해당 부분 코드를 만들어서 테스트를 해봐야겠네요. 위의 코드만 봐서는 이상한 점은 없습니다.

혹시 이런 현상이 있는 코드 전체를 github 등으로 공유를 해주시면 제가 빠르게 원인을 찾아볼 수 있습니다. 번거로우시면 제가 예상 가능한 원인을 한번 추적해볼게요.

Hello님의 프로필 이미지
Hello

작성한 질문수

질문하기