인프런 커뮤니티 질문&답변
2강 예제 소스 실행 문의
작성
·
43
·
수정됨
0
안녕하세요.
2강 예제는 크게 두 가지가 있습니다.
private 필드 리플렉션 접근 제어
ServiceLoader로 등록된 서비스 찾기
처음에는 영상 그대로 타이핑하여 실행했지만, 두 가지 모두 기대와 다르게 작동합니다.
(※ 예제 Git으로 프로젝트를 생성해도 동일합니다)
xxx-domain 모듈에서 opens 지시어가 없음에도 private 필드 리플렉션이 정상적으로 동작합니다.
또한 ServiceLoader.load() 메서드로 xxx-domain에 정의한 두 가지 구현체를 찾지 못합니다
제 추측으로는,
코딩 시점(컴파일 환경)에서는 IntelliJ + Gradle로 관리되는 모듈과 JPMS 기능이 정상적으로 작동하지만,
런타임 환경에서는 모듈 패스가 아닌 클래스패스로 참조되어 문제가 발생하는 것이 주 원인으로 보입니다.
이 문제를 해결 하기 위해 gradle 이나 실행옵션에서 모듈패스를 사용하도록 시도 해봤지만 여전히 클래스패드 참조로 실행되는 것 같습니다.
영상과의 차이점은 오직 IntelliJ 버전 차이밖에 없는데, 제 버전은 2025.2.1입니다.
이번 예제에서 JPMS가 정상적으로 적용되도록 private 리플렉션과 ServiceLoader가 동작하게 하는 방법에 대해 도움을 주실 수 있을까요?
답변 3
0
문제 원인을 분석하고 직접 찾아봤습니다.
Gradle 명령어로 실행하면(
./gradlew :example-api:run) 예외가 발생합니다.module-path방식을 사용합니다.IntelliJ 내부 설정의 "Build and Run" 옵션을
IntelliJ로 설정하고 실행시켜도 예외가 발생합니다.module-path방식을 사용합니다.
문제는 최근 버전의 IntelliJ에서, 내부 설정의 "Build and Run" 옵션을 Gradle로 설정하는 경우입니다. 이 경우 IDE가 빠른 실행을 위해 Gradle의 application 플러그인 run 태스크 설정을 따르지 않고, 자체적으로 클래스패스 기반의 실행 명령어를 생성하여 실행합니다. (gradle.properties에서 debug를 키고 확인해봤습니다)
결국 1, 2번 방법을 사용해야지만 예상한대로 동작하는 것 같습니다.
0
안녕하세요! 🙂 보내주신 내용을 확인해 보았는데요!
실행 환경 차이 (ex. IntelliJ로 실행하게 되어 있는데 Java 9 미만으로 실행되고 있는 경우) 또는
오탈자
가 유력해 보입니다!
제가 질문자 분의 환경을 100% 확인할 수는 없어서 github 으로 테스트 해보신 내용을 보내주시면 직접 확인해보도록 하겠습니다! 감사합니다. 🙇
0
안녕하세요, 인프런 AI 인턴입니다. 조선왕조실룩샐룩님!
현재 겪고 계신 문제는 자바 모듈 시스템(JPMS)과 관련된 것으로 보입니다. 여러 강의에서 유사한 문제들을 다룬 질문과 답변이 있었는데, 이를 참고하시면 도움이 될 것으로 생각됩니다.
리플렉션 접근 제어 문제:
- 자바 모듈 시스템을 사용하는 경우, 모듈 경로로 설정되어 있다면, ‘open’ 옵션이나 ‘exports’ 지시어가 없을 시 리플렉션이 정상적으로 동작하지 않아야 합니다. 만약 정상 동작한다면, 이는 모듈 경로가 아닌 클래스패스로 로딩되고 있을 가능성이 높습니다.
- 자바 모듈 시스템을 사용하는 경우, 모듈 경로로 설정되어 있다면, ‘open’ 옵션이나 ‘exports’ 지시어가 없을 시 리플렉션이 정상적으로 동작하지 않아야 합니다. 만약 정상 동작한다면, 이는 모듈 경로가 아닌 클래스패스로 로딩되고 있을 가능성이 높습니다.
ServiceLoader 사용 문제:
- 동일하게, ServiceLoader의 동작이 모듈 경로 문제일 수 있습니다. 서비스 로더가 서비스 구현체를 찾지 못하는 경우, 이는 서비스 내역을 모듈-info 파일에서 올바르게 제공하고 있는지, 그리고 실행 시 모듈 경로 설정이 올바른지 확인이 필요합니다.
- 동일하게, ServiceLoader의 동작이 모듈 경로 문제일 수 있습니다. 서비스 로더가 서비스 구현체를 찾지 못하는 경우, 이는 서비스 내역을 모듈-info 파일에서 올바르게 제공하고 있는지, 그리고 실행 시 모듈 경로 설정이 올바른지 확인이 필요합니다.
이 문제를 해결하기 위한 몇 가지 방법을 제안드립니다:
- Gradle 설정 파일 수정:
- compileJava와 run task에 --module-path 옵션을 사용하여 모듈 경로를 명확히 지정해보세요.
- implementation 'path.to:module:version'이 아닌 모듈 친화적인 방식으로 선언했는지 점검하세요.
- IntelliJ 설정 조정:
- IntelliJ에서 실행 구성 설정(run configuration)에서 모듈패스 설정을 확인해보세요.
Project Settings->Modules에서 각 모듈이 JPMS 규칙을 따르고 있는지 확인하세요.
- IntelliJ에서 실행 구성 설정(run configuration)에서 모듈패스 설정을 확인해보세요.
많은 사용자들이 IntelliJ의 새로운 버전에서 발생하는 문제를 겪습니다. 유사한 문제를 겪고 있는 다른 학생들의 질문과 답변을 확인하시기 바랍니다.
- 빌드하고 실행하기 오류에서는 모듈 경로가 잘못되는 문제를 다루고 있습니다. 꼭 참고해 보세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





