• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

`@ConditionalOnClass` 관련 문의

23.01.29 23:38 작성 23.01.29 23:49 수정 조회수 485

1

 안녕하세요! 강의에서 한가지 궁금한 점이 있어서 질문드립니다!
@ConditionalOnClass 어노테이션에서 XmlMapper.class 는 빨간 줄로 나와서 찾아보니

import com.fasterxml.jackson.dataformat.xml.XmlMapper;

가 resolve 되지 못하는 것으로 추측되었습니다. 이런 경우는 빌드가 되지 않아야 하는 것이 아닌가 싶어서 제가 무엇을 놓치고 있는 것인지 알고 싶어 문의드립니다

답변 2

·

답변을 작성해보세요.

4

지금 보시는 화면은 직접 작성해서 컴파일되야 하는 소스코드가 아닙니다. 이건 스프링부트 라이브러리 안에 들어있는 클래스를 IDE가 소스코드를 끌어와서 참고하도록 보여주는 것이지요. 당연히 이 스프링 부트의 코드가 빌드 될 때는 XmlMapper 클래스가 있었고 그래서 컴파일이 잘 되었을 겁니다. 그런데 웹 자동 구성의 스타터에는 XML 관련 라이브러리가 디폴트로 들어있지 않습니다. 요즘은 대부분 JSON을 더 많이 사용하니까요. 그래서 이렇게 자동 구성 클래스를 가져와서 소스코드를 참고해서 보게할 때는 현재 프로젝트에 포함되지 않은 클래스 등이 나오는 경우 IDE가 더 이상 관련 클래스까지 추적해서 코드를 보여줄 수 없기 때문에 저렇게 빨간색으로 표시되는 겁니다. 이미 컴파일이 끝난 클래스 파일이기 때문에 이게 사용될 때까지는 문제가 없습니다. 다만 XML 관련 클래스를 메모리로 가져와 사용하려고 하면 그때 클래스를 찾을 수 없다는 에러가 나겠죠. 하지만 여기서 XmlMapper는 자동 구성중에 이런 클래스가 있는지 확인하는 용도로만 달려있는 것이고, 당연히 해당 클래스가 없으니 이 클래스의 자동 구성은 무시가 되겠죠. 좀 더 깊이 들어가면 클래스를 로딩하는 대신 ASM이라는 자바 클래스 바이너리 파일을 분석하는 툴을 사용해서 확인하기 때문에 클래스를 로딩해서 확인하는 작업도 필요가 없습니다. @ComponentScan도 모든 경로에 있는 클래스를 다 메모리로 로딩해서 @Component가 붙었나 보는 건 아니고, ASM 등을 이용해서 파일만 조사하는 특별한 방식을 사용해서 불필요하게 클래스를 메모리에 올리는 일이 없습니다. 이런 방식은 굉장히 고급이고 아주 특별한 용도로만 사용하는 것이라 깊이 아실 필요는 없습니다.

아무튼, 위에 소스는 참고하라고 소스를 어디선가 끌어와서 보여주는 것이지 실제 컴파일/빌드 해야하는 대상이 아니고 이미 빌드가 끝난 상태이기 때문에 직접 사용되지 않는 클래스 정보는 문제가 되지 않습니다. 앞으로도 다양한 라이브러리 내의 코드를 IDE를 통해서 보실 때 이런 경우를 만나실 수 있는데 당황하지 않으셔도 됩니다.

0

거울이님의 프로필

거울이

질문자

2023.01.30

와 감사합니다!