11월 제품 빌드를 하고나서, 제품의 일부 기능이 제대로 되지 않는 것을 확인했다. 제품 코드 중에는 Guillemet(«, ») 기호를 사용하는 코드가 있는데, 기호가 "占쏙옙" 으로 표현되었다.
문제의 원인은 단순했다. 인코딩 정보를 UTF-8 로 설정하지 않아서 Guillemet기호가 "占쏙옙" 으로 나온 것이다. "Xtend User Guide" 에서 Guillemet 기호를 사용하려면 인코딩을 UTF-8 으로 설정하도록 나와있다.
9월 배포 버전에서는 발생하지 않은 문제였는데, 11월 배포 버전에서 문제가 발생한 것이다. pom.xml 에서 따로 인코딩을 설정하지 않은 상태였지만, '알아서 잘' 빌드되었었다. 이런저런 변경점을 알아본 결과, Jenkins 서버를 새로 구축했고 11월 릴리즈 제품은 새로 구축한 서버에서 빌드한 것을 확인했다.
과거 Jenkins 서버를 "9월서버", 새로 구축한 서버를 "11월서버"라 하겠다.
로그 분석
- 9월서버에서 최근에 성공한 빌드 로그
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources,
i.e. build is platform dependent!
9월서버에서는 Platform Encoding 인 UTF-8 을 사용해 리소스를 복사하고, 빌드 결과물은 Platform 설정에 의존한다는 로그를 확인했다. 빌드한 플랫폼인 Ubuntu 의 기본 인코딩은 UTF-8 이므로, Maven 에서도 이 기본 인코딩 정보를 이용해 빌드를 했었다. 그동안 pom.xml 에 인코딩 정보를 설정하지 않았어도 제품이 무사히 나왔던 것이 정말 다행이었다.
Maven의 Default Encoding 정보를 확인하는 방법
Maven의 Default Encoding 정보를 확인하는 방법은 간단한다. Maven 의 버전 정보를 확인하면 알 수 있다.
현재 PC 에서 Maven 으로 빌드하면, 인코딩으로 "UTF-8" 을 사용한다.
11월 서버의 Platform Encoding은 무엇이었을까
9월서버는 서버 PC에 Ubuntu를 바로 설치해서 Jenkins, Maven을 설치해서 사용했고, 11월 서버에서는 Docker 위에 Ubuntu 이미지를 받아서 Jenkins, Maven을 설치해서 사용했다.
pom.xml에서 인코딩 정보를 따로 입력하지 않았으니 Platform(Docker Ubuntu) 의 인코딩 정보를 사용했을 것이다. 다시 mvn -version 명령어를 실행해보자.
encoding이 "ANCI_X3.4-1968"으로 설정된 것을 확인할 수 있다. ANCI_X3.4-1968은 ASCII 코드라 보면된다. UTF-8로 작성된 글자를 ANCI_X3.4-1958로 인코딩하니 문제가 생길수 밖에 없었다.
그래서 Encoding 문제를 어떻게 해결했는가
pom.xml 에 encoding 정보를 추가해서 해결했다.
Maven이 Platform 에 설정된 인코딩 정보를 사용해 제품을 빌드하는 것은 매우 위험하다고 판단했다. 인코딩을 UTF-8 이외에 ASCII 나MS949를 설정해도 빌드에는 성공했기 때문이다.
인코딩을 ANCI_X3.4-1968으로 설정하고 빌드했을 때, 로그에 ERROR 나 WARNNING을 찾아볼 수 없었다.
Windows의 기본 인코딩(MS949)으로 빌드했을 때, "unmappable character for encoding" 이라는 에러 메세지가 나왔지만, 역시 빌드 결과는 "BUILD SUCCESS"로 나온다.
pom.xml 에 encoding 정보 추가
위와 같이 <project.build.sourceEncoding> 태그 안에 "utf-8" 을 입력하면, Maven 빌드시 인코딩을 utf-8로 설정한다. 이제 Platform 의 인코딩 설정과 관계없이 설정한 인코딩 정보를 사용하게 된다.
'Maven > Encoding 설정' 카테고리의 다른 글
테스트 코드를 이용해 인코딩 문제 확인 (0) | 2021.11.18 |
---|---|
Docker Ubuntu Locale 설정으로 Maven Default Encoding 변경하기 (0) | 2021.11.18 |