-
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
'운영 중인 서비스 > Coconut.' 카테고리의 다른 글
단일 진입점으로 개별 서비스의 Swagger 접근하기 (0) 2024.04.13 Nginx 로그 살펴보기 ( feat. 웹 스캐닝 ) (0) 2024.04.07 VARCHAR(255) 타입의 컬럼에 255 바이트 이상을 넣으려고 한다면? (0) 2024.03.25 쓰기에 시간을 쓸 것인가? 읽기에 시간을 쓸 것인가? (0) 2024.03.21 Patch Package로 의존성 이슈 해결하기 (0) 2024.03.20