ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • corretto17 openjdk에서 발생한 인코딩 이슈해결 (error: error while writing...)
    운영 중인 서비스/Coconut. 2024. 3. 29. 02:25

     

     

    Code Build 환경에서 사용되는 corretto17에서 한글로 작성된 클래스 이름을 인식하지 못하는 이슈를 해결하는 과정입니다.

    한글로 작성된 클래스 이름을 영문으로 변경하는 방법과 jdk를 바꾸는 방법을 선택할 수 있었고, 그 중 실행환경과 동일한 jdk로 변경하는 방법으로 해결한 내용을 정리한 글입니다.

     


     

    이 글은 아래 3가지로 구성 되어있습니다.

    1. 문제의 발생

    2. 시도해본 해결책 2가지

    3. 해결 및 정리

     

     

    1. 문제의 발생

    테스트를 작성할 때는 해당 테스트 케이스를 설명하는 이름을 짓는데, 이 때 한글을 사용하는 것이 보다 보기에 편하다는 의견을 받은 적이 있습니다. 그래서 테스트 관련 클래스에서는 한글을 일정부분 사용하고 있습니다.

     

    작성된 코드는 작업하는 로컬환경에서는 테스트와 빌드가 문제없이 작동됩니다.

    하지만 ci/cd 파이프라인의 Code Build 환경에서 테스트를 수행하면서 문제가 발생했습니다.

     

    최초에 발생한 문제는 클래스 이름이 ?????으로 표시되면서 컴파일이 실패하는 이슈였습니다.

    딱 보아도 한글에서 비롯한 encoding 문제라는 느낌이 듭니다.

     

     

    2. 시도해본 해결책 2가지

    2-1. UTF-8 인코딩 강제

    그래서 컴파일시에 UTF-8을 사용해서 인코딩할 수 있도록 buildspec.yml을 수정해주었습니다.

    문제 해결을 위해 UTF-8 관련해서 넣을 수 있는 모든 옵션들을 다 추가해보았습니다.

    version: 0.2
    phases:
      install:
        runtime-versions:
          java: corretto17
      pre_build:
        commands:
          - java -version
          - export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
          - export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
          - export GRADLE_OPTS="-Dfile.encoding=UTF-8"
          - aws s3 cp $REMOTE_PATH ./src/main/resources/application.yml
      build:
        commands:
          - ./gradlew test -Dfile.encoding=UTF-8
    
    cache:
      paths: []
    
    artifacts:
      files:
        - '**/*'

     

    그랬더니 이번에는 ?? 로 표시되던 파일이름은 잘 표시가 되지만, 여전히 동일한 이유로 컴파일이 되지 않는 것 같습니다.

     

    2-2. JDK 변경

    이래저래 검색을 좀 해보니 예전 openjdk 중에 비슷한 이슈가 있었던 것을 찾았습니다. ( 링크
    직접적인 관련이 있는 것 같지는 않지만 jdk를 다른 것을 한번 사용해보겠습니다.

     

     

    코드 빌드 옵션을 Managed Image 에서 Custom Image로 변경하고, 프로젝트에서 도커 빌드할 때 사용하는 temurin 17을 사용하도록 설정하였습니다.

     

    실행 환경을 변경하고 추가적으로 필요한 패키지 등을 추가해줍니다.

    s3 의 데이터를 가져오기 위한 aws-cli, aws-cli 설치를 위한 unzip이 필요합니다. 

    ( yum으로 설치 시도를 해봤는데 yum을 못 쓰고 apt로 되는 것으로 보아 Custom Image를 사용하면 CodeBuild에서 Debian 계절의 linux를 제공하는 것 같습니다)

    version: 0.2
    phases:
      install:
        commands:
          - export LANG=en_US.UTF-8
          - export LC_ALL=en_US.UTF-8
          # unzip 설치
          - apt-get update
          - apt-get install -y unzip
          # AWS CLI v2 설치
          - curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
          - unzip awscliv2.zip
          - ./aws/install
      pre_build:
        commands:
          - java -version
          - export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
          - export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
          - export GRADLE_OPTS="-Dfile.encoding=UTF-8"
          - aws s3 cp $REMOTE_PATH ./src/main/resources/application.yml
      build:
        commands:
          - ./gradlew test -Dfile.encoding=UTF-8
    
    cache:
      paths: []
    
    artifacts:
      files:
        - '**/*'

    i

     

    그랬더니 에러가 바뀌는 것을 확인할 수 있습니다. 기존에는 컴파일이 안되는 이슈였는데 이번에는 테스트를 통과하지 못한다고 합니다.

    살펴보니 db 관련 설정에 이슈가 있는 듯 합니다.

     

    아무래도 환경변수 설정의 문제로 보여집니다. 개발환경에서는 mysql을 사용하고 있고 테스트 환경에서는 H2를 사용하는데, 위 이슈는 테스트를 진행하려고 하는데 개발환경의 application.yml을 사용하는 것 같습니다.

     

    간단하게 @ActiveProfiles를 추가해줍니다.

     

     

    드디어 테스트 stage에 파란불이 들어옵니다.

     

     

    3. 해결 및 정리

    마무리로 테스트하면서 추가했던 불필요한 설정을 제거하고 코드를 정리합니다.

    version: 0.2
    phases:
      install:
        commands:
          # unzip 설치
          - apt-get update
          - apt-get install -y unzip
          # AWS CLI v2 설치
          - curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
          - unzip awscliv2.zip
          - ./aws/install
      pre_build:
        commands:
          - java -version
          - aws s3 cp $REMOTE_PATH ./src/main/resources/application.yml
      build:
        commands:
          - ./gradlew test
    
    artifacts:
      files:
        - '**/*'
    

     

    다시 테스트 돌아가는 것을 확인하면 끝!

     

     

    처음에는 한글로 된 클래스 이름을 영문으로 고치는 것이 가장 합리적인 해결책이라고 생각이 들었습니다.

    하지만 로컬환경에서는 분명히 작동이 되는데, 환경이 바뀌어서 작동이 안되는 것은 해결방법이 있는 문제라고 생각하고 접근해보았습니다.

    JDK 별로 다른 이슈가 발생할 수 있다는 부분을 느껴보는 좋은 기회였던 것 같습니다~~

     

    감사합니다.

     

     


    [참고]

    https://github.com/eclipse-openj9/openj9/issues/11915

     

     

     

     

     

Designed by Tistory.