원인

  • Gradle 스크립트의 기반이 되는 gradle-wrapper.jar 의 기본 출력 인코딩 셋이
    UTF-8 이다
  • 그러나 윈도우 콘솔 환경에 기본 인코딩 셋은 MS949(CP-949 | EUC-KR)
    • 참고로 리눅스 BashUTF-8이 기본 인것으로 안다
  • 그러다 보니 Gradle 스크립트는 UTF-8로 출력되고 윈도우는 그걸 MS949 로 받고 있으니 깨지는 것

해결 방법

  • 개같은 것이 인터넷에 해결방법 이라 떠돌아 다니는 것들은 Gradle 프로젝트 자체의 인코딩을 건드는 것들 뿐이다
  • 최종 출력은 gradle-wrapper.jar이 담당하는거라 이쪽 출력을 수정하지 않으면 안되는데 이딴 건 나오지도 않는다

gradlew.bat 파일 수정

  • 먼저 Gradle의 실행 스크립트인 gradlew 의 동작 원리를 보면 윈도우에서는 배치파일 인데
    • JVM 인자들이랑 여러 사용자 입력을 배치파일로 처리해서 gradle-wrapper.jar 에 전달하는 구조임
    • 해당 파일에서 gradle-wrapper.jarMS949 로 인코딩 해서 출력할 수 있도록 하면됨
# 해당 부분 찾기
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
 
# 이렇게 수정
===
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" "-Dfile.encoding=MS949" "-Dstdout.encoding=MS949" "-Dstderr.encoding=MS949"
===

build.gradle 수정

  • 프로젝트 java 파일은 gradle 이 내부적으로 UTF-8로 읽을 수 있게 수정 해야 함
allprojects {
    compileJava.options.encoding = 'UTF-8'
    tasks.withType(JavaCompile) {
        options.encoding = 'UTF-8'
    }
}

추가 설명

  • 아마 gradle-wrapper.jar 내부 클래스에서 내쪽 클래스를 jvm 인자를 전달하여
    java 로 서브 프로세스 생성해서 실행되는 구조인듯
  • 그래서 gradle-wrapper.jar 내부 클래스에서 실행할때 UTF-8로 해석되니까 거기에 맞춰 설정을 해줘야 한다는