IT 성장일기

[Spring] 다국어 지원 기능을 만들다가 만난 상황들 본문

Java/Spring

[Spring] 다국어 지원 기능을 만들다가 만난 상황들

고 양 2023. 9. 8. 10:08
반응형
다국어 지원 기능을 만들다가 만난 상황들

내부회계관리를 위한 어플리케이션의 다국어 지원을 위해서 벌써 2주일 넘게 작업중입니다.

작업 중 겪은 여러가지 상황들을 조금 정리하고 기록해놓고자 합니다...

 

 


 

스프링 메시지 태그 번들 만들기

전자정부 기반 프로젝트다보니까 이미 많은 것들이 기반으로서 구현되어있었고
저는 필요한 메시지번들을 제작해서 화면에 가져다가 바르기만 하면 되는 상황이었습니다.

 

처음 메시지 번들을 만들 때 메시지 태그의 작명 규칙과 분류 규칙에서 많은 고민이 생겼었는데
그 중 분류방식에 대해 많은 고민을 했던 것 같습니다.

  1. 어플리케이션 상의 업무 프로세스를 기준으로 분류할 것 인지
  2. 버튼, 텍스트, 알러트 팝업 등 메시지 태그가 사용 될 고유 위치를 기준으로 분류할 것 인지
  3. 말도 안되지만 가나다 순으로 분류할 것 인지

저도 마찬가지고 사수님도 해당 작업을 해본 경험이 없어 함께 의논해보다가 결국 이렇게 하기로 했습니다.

"여러개의 메시지 번들을 만들어서 2번 기준으로 먼저 분류하고 각 파일 내부에서 1번 기준으로 다시 분류하자"

 

이미 극히 일부 구현되어 있는 다국어 메시지 번들

 

물론 굳이 분류하지 않고 모든 메시지 태그들을 하나의 파일에 때려 넣는 간단한 방법도 있었습니다.
만약 메시지 번들을 제작만 하는 것이 맡은 업무의 끝이었다면 상관 없겠지만 저는 그 메시지 태그들을 이곳 저곳에 적용도 시켜야 했습니다.

조금이라도 실수를 줄이고 체계적으로 진행하려면 소스 또한 나름의 체계를 갖춰야 한다고 생각했었습니다.

해당 작업을 진행하면서 어플리케이션의 모든 화면과 메뉴와 팝업을 샅샅이 훑어보는 과정이 필수적으로 동반됐습니다.
그 와중에 발견하지 못했던 개선 여지가 있는 부분이나 사소한 오류들을 발견한 것은 의외의 소득이었습니다.

 


HTML 문서에서 스프링 메시지 태그 사용하기

메뉴와 헤더, 버튼, 컨펌과 알러트 메시지, InnerHTML Text 등으로 분류해 만든 태그들을
JSP파일과 일부 서비스 로직에서 만들어주는 문구에 적용시켜야 했습니다.

이 때 HTML 사이에 끼워주는 태그와 Java 코드에 적용시키는 방식이 크게 달랐습니다.

 

추후 태그가 어떤 문구를 표현하는지 직관적으로 인식하기 위해 귀찮지만 주석을 단 모습

 

 

JSP 파일의 HTML 부분에서의 메시지 태그는 아래와 같이 사용할 수 있었습니다.

 

이 때 사용하고자 하는 태그라이브러리를 미리 선언해놓아야 합니다.

 

그렇지 않으면 JSP 파일은 이클립스를 통해 '저기요? 이게 뭔가요?' 라는 메시지를 내뿜습니다. 

 

메시지 태그는 변수로 선언해서 사용할 수도 있었습니다.

 

수천개나 되는 하드코딩 되어 있는 텍스트를 모두 스프링 메시지로 바꾸는데 가장 큰 도움을 준 기능은
이클립스 내부에서 제공하는 찾아바꾸기 기능이었습니다. ( Ctrl + H )

 

부작용도 있었습니다... 이건 처음 접했을 때 진짜 어이 없는 현상이었습니다. ㅋㅋㅋㅋ

 

 

예를 들어 찾아바꾸기 한 "계정</th>"이라는 키워드가 다른 문구에 공교롭게 포함되어 있는 경우
위와 같이 문구의 끝자락이 바뀌어버리는 현상이 몇번 있었습니다...
해프닝정도로 웃어넘길 수 있는 일이었습니다.

 


 

스크립트에서 스프링 메시지 태그 사용하기

스크립트 태그 사이에서 스프링 메시지 태그는 아래와 같이 사용할 수 있었습니다.

 

 

또는 함수를 이용해 테이블을 구성하는 경우

 

 

따로 이스케이프 문자가 필요하지는 않았습니다.

HTML문서에 변수처럼 선언된 메시지를 스크립트에서 사용할 수도 있었습니다.

 

 


Java 코드에서 스프링 메시지 태그 사용하기

미리 만들어진 스프링 메시지 태그를 자바코드에서 사용하기 위해서
ReloadableResourceBundleMessageSource 객체를 구현해야했고 이는 해당 프레임워크에 이미 구현이 되어 있었습니다.

덕분에 해당 메시지가 필요한 클래스에서 아래와 같이 선언만해주면 되었습니다.

 

전자정부 프레임워크 감사합니다.

 

그리고 나서 마치 DTO나 VO에서 값을 가져오듯이 getMessage 메서드를 호출하고
매개변수로서는 선언된 코드를 넘겨줌으로써 원하는 스트링 형식의 메시지를 반환받을 수 있습니다.

 

 

 

작업 중 마주친 온갖 에러들

처음 해보는 작업이다 보니 마냥 순조롭지만은 않았습니다. 수많은 에러 메시지를 마주했었는데

200번 숫자가 붙은 에러나 500번 에러는 물론이고 404번 에러도 밥먹듯 봐야 했습니다.

 

꺄아악

 

 

404번 에러는 원래 밥 대신 먹고 지내오긴 했었지만 맨 뒤에 200번 숫자가 붙은 에러는 처음이라 당황스러웠습니다.

 

*참고 : 웹 상태코드 알아보기

2023.09.04 - [Web/Variaty Web] - [WEB] Web Page Status Codes (웹 페이지 응답 상태 코드)

 

[WEB] Web Page Status Codes (웹 페이지 응답 상태 코드)

Web Page Status Codes (웹 페이지 응답 상태 코드) Web Page Status Codes (웹 페이지 응답 상태 코드)는 세 자리 숫자로 이루어졌으며, HTTP 프로토콜을 사용하여 클라이언트(웹 브라우저)가 서버로부터 요청

februaryfairys.tistory.com

 

 

500

가장 처음 겪었던 에러는 HTML 내부에 자바 표현식을 이용해 3항 연산식을 구현했을 때였습니다.

첫시도는 위처럼 식 내부에 태그를 직접 붙여넣는 방식이었습니다.
곰곰히 생각해보니 될 리가 없었습니다...ㅋㅋㅋㅋ 저 홑따옴표 안의 문자열이 그대로 출력되었습니다...

 

두번째 시도였습니다. 변수를 선언하고 식 내부에 붙여넣은 모습입니다.

 

 

이 때 화면이 표시되지 않고 브라우저 콘솔창에 500번 에러가 떴었던 것으로 기억합니다.
저는 이게 왜 안되지? 라며 20분 가량 헤매었었습니다.

결국 올바른 답을 찾아내었고 '표현식 내부에 변수를 사용할 때에는 따옴표 또 다른 표현식 기호를 사용할 수 없다'는 것을 알았습니다.

 

 

200

 

 

net::ERR_INCOMPLETE_CHUNKED_ENCODING(불완전한 청크 인코딩) 에러가 떴을 땐
거의 빠지지 않고 아래의 괄호 빠졌다는 메시지가 함께 노출되었습니다.
스크립트 쪽을 잘 뒤져보면 스프링 메시지 태그를 따옴표 없이 사용한 곳이 발견되곤 했었습니다.
그럴 때 마주했던 에러입니다.

 

404

 

HTML 문서에서 태그 내부에 따옴표를 삽입하지 않았던 경우도 있었는데 이럴 경우 컴파일에 실패했던건지 404 에러가 표시되었습니다.

 

 

이 외에도 메시지번들에 선언되지 않은 메시지 태그를 사용한다거나 (= 메시지 태그에 오타가 나는 경우)

 

 

위와 같은 식으로 태그가 사용되어 에러를 촉발시킨 경우도 있었습니다.
대체적으로 해결이 어려운 에러는 아니었습니다.

 

작업을 하면서 가장 바보같은 실수를 했던 것은 자바코드 내에서 HTML 문서를 구성하는 코드를 다룰 때였습니다.

PDF 파일을 생성하는 부분을 손보고 있었는데, 제가 해놓은 꼴을 좀 보세요.

 

 

한참을 이렇게 작업해놓고 '이게 왜 안되지?..' 라며 멍때렸던 기억이 있습니다. 사실 잘 기억나지 않습니다.

 

 

올바른 모습의 코드입니다.

 


 

그 외 잡다한 상황들

 

사소한 오타들도 종종 있었는데 파일을 붙어'녛'기 해주세요 라고 쓰여있었습니다.

 

스프링 메시지 태그를 적용시키면서 원래의 가장 큰 목적인 다국어 팩 구현 외에도 여러가지의 자잘한 소득이 있었습니다.

  • 어플리케이션 내부 곳곳에 산재해있던 오타
  • 같은 의미의 문장들 내의 사소한 표현 차이
  • 통일되지 않은 용어 등의 정리 
  • 스프링 메시지가 적용되지 않은 태그를 효과적으로 찾기 위해 정규표현식을 공부함.

 

그리고 이젠 코드만 봐도 구역질이 나오려고 합니다

 

도움이 되어드렸다면 구독 / 좋아요 부탁드립니다.👏🏻

감사합니다.🙂

반응형