삽질 포인트

IntelliJ IDEA에서 한글이 깨진다

IntelliJ IDEA 2024.1 버전에 한국어 언어 플러그인을 설치하여 새 프로젝트를 만들었는데, 기본으로 만들어주는 코드에

package kotlin.nbcamp.spartacodingclub;
//TIP 코드를 <b>실행</b>하려면 <shortcut actionId="Run"/>을(를) 누르거나
// 에디터 여백에 있는 <icon src="AllIcons.Actions.Execute"/> 아이콘을 클릭하세요.
public class Main {
    public static void main(String[] args) {
        //TIP 캐럿을 강조 표시된 텍스트에 놓고 <shortcut actionId="ShowIntentionActions"/>을(를) 누르면
        // IntelliJ IDEA이(가) 수정을 제안하는 것을 확인할 수 있습니다.
  
//        System.out.println(System.getenv());
        System.out.println("안녕 그리고 반가운!");
  
        for (int i = 1; i <= 5; i++) {
            //TIP <shortcut actionId="Debug"/>을(를) 눌러 코드 디버그를 시작하세요. 1개의 <icon src="AllIcons.Debugger.Db_set_breakpoint"/> 중단점을 설정해 드렸습니다
            // 언제든 <shortcut actionId="ToggleLineBreakpoint"/>을(를) 눌러 중단점을 더 추가할 수 있습니다.
            System.out.println("i = " + i);
        }
    }
}

-같이 한글 주석이 들어가 있었다. (중간의 한글 출력 코드는 본인이 넣은 것이다). 빌드를 실행했더니

error: unmappable character for encoding x-windows-949

-라며 그 한글 주석을 가리키는 것이다. 이것저것 삽질하다가 이 문제를 해결하고 빌드에 성공했더니 이젠 콘솔에서 한글이 깨져 나오는 상황이 생겼다.

JEP 400

… 근데 나중에 더 찾아보니 JEP 400: UTF-8 by Default라는 개선방안으로 인해 - JEPJDk Enhancement Proposal의 약자로 파이썬의 PEP(Python Enhancement Proposal)을 생각하면 된다 - JDK 18부터 Java API의 기본 문자 인코딩으로 UTF-8을 선택하며 이런 문제가 발생했다고 한다.

  • 맥의 경우 기본 인코딩이 UTF-8으로 바뀐 게 (제안이 만들어진 2017년 기준으로) 좀 됐고,
  • 대다수의 리눅스 배포판들은 UTF-8을 기본 인코딩으로 설정했으며,
  • 서버 프로그램들은 -Dfile.encoding=UTF-8 옵션을 대부분 기본으로 주고 시작하기에 이 JEP으로 인한 영향이 없을 건데,
  • 윈도우 같은 경우 사용자의 언어를 기반으로 하여 기본 인코딩이 달라진다(windows-1252windows-31j 등).

그래서 여기선

  • 아시아나 다른 특정 지역에서 돌아가는 서버 환경
  • 아시아 지역의 Windows 사용자들

… 이렇게 두 종류에 해당하는 경우에 대해 이 JEP이 영향을 크게 줄 것이라고 했다. 이걸 보고 나서 시도한 건 2가지였는데,

  1. JDK 17(혹은 그 이하 버전의 JDK)를 사용한다. 간단하다.
  2. JDK 18을 그대로 쓰되, 일부 구성파일들을 수정한다.

가 있었다. 2번을 통해 한 삽질들을 적어보면 다음과 같다:

파일 인코딩 변경

  1. 설정 > 에디터 > 파일 인코딩에서 다음 3개 항목에 대해 인코딩을 모두 UTF-8로 변경해준다:
  • 전역 인코딩
  • 프로젝트 인코딩
  • 프로퍼티 파일에 대한 디폴트 인코딩
  1. 같은 설정 항목 아래의 명확한 Native에서 ASCII로의 변환을 활성화한다.

  1. 화면 우측 하단의 파일 인코딩(아래에는 x-windows-949로 설정된 항목이 그것이다)을 UTF-8로 바꿔준다(바뀐 인코딩으로 파일을 저장하게 된다).

컴파일/실행 인코딩 변경

  1. 도움말 > 사용자 지정 VM 옵션 편집... 항목을 누르면 idea.vmoptions (IntelliJ IDEA 가동에 쓰이는 JVM 옵션 구성 파일)의 아래에 다음 구성을 추가한다:

    -Dfile.encoding=UTF-8
    
  2. 실행 > 실행/디버그 구성 항목으로 들어가, 빌드 및 실행에서 VM 옵션 추가를 통해 다음 옵션을 추가해준다():

    -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8
    

    각각 System.out 스트림과 System.err 스트림의 인코딩을 설정해주는 옵션이다. (idea.vmoptions에선 설정해도 적용되지 않는다)

  3. build.gradle 아래에 다음 구성을 추가한다:

    tasks.withType(JavaCompile) {
    	options.encoding = UTF-8
    }
    

    Java로 컴파일하는 과정이 동반되는 Gradle task(compileJava, compileTestJava 등)들에 대해 UTF-8 인코딩 옵션을 추가하는 구성이다(로 이해했다).

  4. 설정을 변경하고 나선 반드시 파일 > 캐시 무효화...로 아래 둘 항목을 선택한 후 무효화 후 재시작을 눌러줘야 한다. 그렇지 않을 경우 build.gradle이나 idea.vmoptions에서 변경한 항목들이 적용되지 않는다.

그러고 빌드 후 재실행을 통해 한글이 (들어간 코드도 컴파일을 잘 해내고) 깨지지 않고 실행됨을 확인할 수 있었다.