개요
저는 현재 맡은 업무가 고(golang) 언어로 API 서버를 개발하는 업무를 맡았습니다.
그런데, 개발 중간에 tcp 통신을 통해 다른 server에게 request 해야할 사항이 생겼는데,
문제는 이 서버에서 한글은 EUC-KR 형식인겁니다.. 이게 왜 문제냐? 바로바로..
고 (golang 이하 고 라고 하겠습니다)는 rune 이라는 특이한 스타일로 타입을 사용하고 이를 UTF-8로 인코딩합니다.
그러므로 고 언어는 UTF-8 타입을 디폴트로 사용하게 되는데요, 이 타입 그대로 byte 타입으로 변환하게 된다면,
byte 코드 또한 그 타입을 따라갑니다. 그래서 통신하는 정보에 한글이 필요하다면 어떤 타입의 char type을 정해뒀는지
확인 할 필요가 있습니다.
JSON
보통 다른 server 로 보낼 때, json 라이브러리의 Marshal메소드가 byte 코드로 손쉽게 변환해 주어 많이들 사용하는데요
func Marshaling(st string) []byte {
return ma := json.Marshal(st) // byte type으로 변환된다.
}
Marshal 메서드는 정말 편하지만, 고 언어로 한글을 처리해 다른 서버로 보내는데 타입이 다르다면?
기존의 string 을 utf8 -> euckr 로 바꿔서 Marshaling 하면 될까요? 안됩니다.. 이유는 바로 Marshal 메서드의 작업역시
고 언어가 변환할때, utf8로 인코딩을 진행하기 때문에 그전에 어떤 타입의 언어든 utf8을 기준으로 변환됩니다.
그래서 저는 Marshal 로 json 의 byte타입으로 변환한뒤, 이를 다시 문자열(string)으로 변환하고, 원하는 타입으로 전환 후 다시 byte로 변환해 보낸다면? json 형식은 유지된채 문자열의 타입만 변경되어 byte code로 보낼 수 있게됩니다!
이를 위해 저는 중간에 메서드를 새로 만들었습니다.
func Marshaling(st string) []byte {
ma := json.Marshal(st) // json 형식의 byte code로 변환된다.
st := bytes.NewBuffer(ma).string() // convert -> byte to string
s, _, _ := transform.String(korean.EUCKR.NewEncoder(), st) // utf8 -> euc-kr 변환
bt := []byte(s) // 타입이 바뀐 문자열을 다시 byte 로 변환하기.
return bt
}
이처럼 몇단계의 과정을 메서드로 만든다면 쉽게 byte -> string(utf8) -> string(euckr) -> byte 로 변환되어 받는 서버의 문자타입에 맞추어 보낼 수 있게 됩니다!!
고 언어를 사용해 진행하는 첫 프로젝트인 만큼 몰라던 점이 많았는데 많은 공부가 되었습니다..
요약
1. 고 언어는 UTF-8 타입이 default
2. json 으로 보내야할때, json.Marshal 을 많이 사용하는데 이 또한 UTF-8
3. EUC-KR 타입으로 변환해서 보내야한다면 Marshal 후 타입을 다시 바꿔서 보내자
'Programming > GO' 카테고리의 다른 글
GO - unresolved dependency, GOPATH error (0) | 2022.05.15 |
---|---|
GO - RESTful API만들기 Echo Framework & Gorm ORM (0) | 2022.04.30 |