백엔드 프레임워크 만들기 (개정판), 제로 - 인프런 에서 배운 내용을 정리한다. 컴퓨터를 사용하다 보면 아래와 같이 알 수 없는 문자를 본 적이 한 번쯤은 있다. 한글이 깨졌다.

궢귛귍귪궻귺긏긘깈깛

이런 난감한 상황을 막으려면 character set 기준을 정해야 한다.

Character set: 사람의 문자 문자열을 컴퓨터의 문자 비트열로 저장하기 위한 규칙.
Encoding: 문자열과 비트열간 변환 작업.
Decoding: Encoding된 대상을 원본으로 되돌리는 작업을 의미한다.

Character set에 맞춰 어떻게 encoding/decoding 할지 결정한다.

character set에 맞지 않게 인코딩되면 데이터를 해석할 수 없다.

UTF8은 여러 종류의 character set 인코딩에 호환된다. UTF8은 기본적으로 3 Bytes를 사용하기 때문이다. 그렇기 때문에 EUC-KR을 UTF8로 변환할 수는 있어도 UTF8을 EUC-KR로 변환할 수는 없다.

백엔드 프레임워크는 UTF8의 호환성을 이용해야 한다. UTF8의 호환성을 사용해야 하는 곳은 크게 세 가지로 나뉜다. 첫째, 베이스라인, 둘째, DMBS/네트워크/레거시, 셋째, 컨테이너다. 각자에 맞는 방식으로 UTF8의 호환성을 이용한다.

베이스라인 (산출물)

아래와 같이 xml, jsp, html 등에서 파일 헤더에 character set을 표현하자.

<?xml version="1.0" encoding="UTF-8"?>

DBMS, 네트워크, 레거시

하나의 character set만 사용해야 한다. 이렇게 할 수 없으면 아래와 같이 어떤 요청이 WAS로 올 때 해당 요청을 UTF8로 변환한 후 작업을 하자.

protected override fun service(request: HttpServletRequest, response: HttpServletResponse) {
        // POST 방식 요청에 대해 UTF-8 인코딩을 적용한다.
        request.characterEncoding = this.characterSet
}
val characterSet: String = init.getCharacterSet()
    println("uri characterSet [$characterSet]")
    val conn = tomcat.getConnector()
    // GET 방식 요청에 대해 UTF8 인코딩 적용
    // GET 방식 요청에 대해 UTF8 인코딩 적용
    conn.setURIEncoding(characterSet)

컨테이너 (JVM)

톰캣을 띄울 때, 톰캣은 JVM 위에서 돌아간다. 그리고 JVM은 character set을 OS로부터 부여받는다. OS에서 넘겨주는 character set은 프레임워크 단에서 변경 못 할 수도 있다. 그렇기 때문에 프레임워크를 사용하는 서버의 character set을 UTF8로 아래와 같이 설정한다. UTF8은 호환성이 있기 때문이다.

CHARACTER_SET :
  DEFAULT : "UTF-8"

Reference