시작하며
김영한 님의 스프링 입문 강의를 듣던 중, build 하는 과정에서 계속 에러가 발생해서 이를 디버깅하는데 3시간을 썼다..
하지만 결국 의지의 한국인답게 해결.. 거창하진 않지만 그 과정을 얘기하려 한다.
build 과정 중에 해결한 에러는 2개였는데, 스프링 자체를 이제 막 입문한 상황이라 어떤 폴더에 뭐가 있고 왜 있는지 파악을 제대로 못한 상황이라서 쉽지 않았다.
이 글을 통해서 다음에 같은 문제를 마주할 분들에게 도움이 되는 마음에 공유한다.
첫 번째 에러 - 버전 차이로 인한 에러
A problem occurred configuring root project 'hello-spring'.
> Could not resolve all files for configuration ':classpath'.
> Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.2.2.
생략
이전에 자바 로드맵을 하면서 이미 자바 21 버전을 인텔리제이에서 다운로드하여서 사용 중이었다.
근데 에러 메시지에서 계속 내가 8 버전을 사용 중이니 17 버전 이상의 자바를 사용하라는 에러였다.
IDE 설정 변경
그래서 인프런 질문 게시판과 구글링, 챗gpt, 김영한 님 로드맵 FAQ 문서 등 모든 것을 참고해서 gradle과 project 설정을 전부 다운로드한 자바 21 버전으로 맞추었다.
환경 변수 변경
그래도 계속 문제가 발생되어서 더욱 검색을 해보니 환경 변수를 확인해 보라는 얘기였다.
그래서? 환경 변수도 21 버전으로 바꾸고, 다시 스프링 부트 프로젝트를 init 하고 시작했는데도 같은 문제가 반복되었다.
캐시 문제 해결
gradle 탭을 이용해서 캐시를 clean을 여러 번 진행하고 다시 재시작해도 해결되지 않았다.
플러그인 및 의존성 확인
plugin 내용과 dependencies 부분도 제대로 되어 있나 확인했다. 문제가 없었지만 재설치하고 실행해도 같은 문제가 발생했다.
아니 도대체 왜 인텔리제이 내의 모든 설정을 자바 21로 맞추고 했는데도 자꾸 8 버전을 쓴다고 나오지!?!?!
해결
그러다 작년에 전공 수업에서 이클립스를 사용할 때 사용했던 8 버전이 생각났다.
그래서 프로그램 추가 제거를 통해서 검색해 보니 인텔리제이 내에서는 21 버전을 사용한 게 맞지만, 기본 자바 프로그램으로 깔려있는 버전이 8 버전이라서 build시 프롬프트에서 이를 이용해서 그런 게 아닌가 싶은 생각이 들었다.
그래서 21 버전을 제외한 모든 자바를 삭제했다. 그리고 이클립스로 돌아가지 않을 것이니 인텔리제이의 내장되어 있는 시스템을 믿고 디스크 자체에 다운되어 있던 자바도 모두 삭제하였다.
결국 인텔리제이에서는 이미 Java 21을 사용 중이었음에도 시스템의 기본 Java 버전이 8로 설정되어 있어 발생한 문제였다.
그러고 나서 실행을 하니..!! 새로운 에러가 또 발생했다.
두 번째 에러 - 테스트 파일 인식 문제
> Task :test FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///D:/%EA%B0%9C%EB%B0%9C/Java/%EA%B9%80%EC%98%81%ED%95%9C%20%EB%A1%9C%EB%93%9C%EB%A7%B5/%EC%8A%A4%ED%94%84%EB%A7%81%20%EC%9E%85%
EB%AC%B8_%EC%BD%94%EB%93%9C%EB%A1%9C%20%EB%B0%B0%EC%9A%B0%EB%8A%94%20%EC%8A%A4%ED%94%84%EB%A7%81%20%EB%B6%80%ED%8A%B8,%20%EC%9B%B9MVC,%20DB%20%EC%A0%91%EA%B7%BC%20%EA%B8%B0%EC%88%A0/hello-spring/build/reports/tests/test/index.html
* Try:
> Run with --scan to get full insights.
전체 길이는 너무 길어서 줄여서 적었다.
에러 코드의 내용을 요약하자면 test 작업 실행 중 에러가 발생했다는 것이고, reports 폴더에 테스트 보고서를 작성했다는 얘기다.
그래서 gradle로 다시 과정마다 나눠서 실행해 보니 test에서만 문제가 생기는 것을 직접 확인하고 테스트 보고서 내용을 참고해서 다시 에러를 분석했다.
GPT가 에러를 분석해 준 내용은 아래와 같다
제공된 테스트 보고서 내용에 따르면, 총 1개의 테스트가 실행되었으며, 그중 1개가 실패했습니다. 성공률이 0%로, 모든 테스트가 실패한 상태입니다. 특히, "Gradle Test Executor 2"라는 테스트 클래스에서 실패가 발생했음이 언급되어 있습니다.
이후에도 코드를 수정하면 2에서 6으로, 6에서 7로 테스트 클래스 실패한 게 넘어갈 뿐 계속 테스트 클래스에서 문제가 발생했다.
그런 와중에 테스트를 아예 안 하고 build를 하면 넘어가진다는 인프런 문의 답변 글을 봤다.
이를 통해서 빌드를 해보니 우선 빌드가 됐다.
하지만 이건 테스트가 안되니 이를 생략하고 넘어간 임시방편이라 생각했다.
완벽히 해결하기 위해서 GPT가 해보라는 단계 별로 하나하나 해보다가
hello.hellospring.HelloSpringApplicationTests 클래스를 실행하는 데 실패한 것으로 나타났습니다. 이 문제는 ClassNotFoundException으로 인해 발생했으며, 이는 HelloSpringApplicationTests 클래스를 찾을 수 없음을 의미합니다. 이러한 유형의 오류는 일반적으로 다음과 같은 몇 가지 이유로 발생할 수 있습니다:
이런 힌트를 주었다.
그래서 이를 일반적인 클래스 경로에 대해서 찾아봤는데, src/test/java에 주로 있다고 하였다.
내 test 클래스는 저 경로에 잘 있는데 왜... 인식을 못하지..?
여기서 또 테스트 라이브러리인 JUnit은 제대로 깔려 있는지, gradle 버전은 최신 버전으로 업그레이드는 됐는지 등등 또 억겁의 디버깅의 시간이 지났다.
그런 와중에! 자주는 아니지만 가끔 Windows에서 사용하는 한글 인코딩과 JVM에서 사용하는 file encoding이 달라서 프로젝트의 파일들을 제대로 읽지 못하는 문제가 발생한다는 내용을 발견했다.
그래서 모든 파일 저장 경로 중에서 한글이 있는 부분을 다 영어로 바꾸고, 스프링 부트 프로젝트를 다시 init하니 드디어 테스트를 생략하지 않고 build를 성공했다.
후기
장장 3시간에 걸친 디버깅이었고, 원래 나가려던 진도만큼 못 나가게 됐지만 그래도 긴 시간 동안
gradle이 뭔지, 의존성은 어디서 확인하는지, 자바에서는 터미널 창을 어떻게 다루는지, 기본 powershell 말고 명령어를 더 다양하게 쓸 수 있는 git bash를 인텔리제이에서 어떻게 바로 쓸 수 있는지, 에러 메시지를 어떻게 파악하고 이를 해결해 나갈지 등등 아주 많은 것을 배운 경험이었다.
특히 테스트를 생략하는 것과 같은 일시적인 문제 해결이 아닌 근본적인 문제 해결을 위해 한 번도 안 쉬고 이를 해결해 낸 경험 자체가 소중했다.
할 때는 정말 머리 아프고 스트레스받지만 끝나면 확 성장하는 게 디버깅 같다.