백엔드 프레임워크 만들기 (개정판), 제로 - 인프런 에서 배운 내용을 정리한다. 컴퓨터를 사용하다 보면 아래와 같이 알 수 없는 문자를 본 적이 한 번쯤은 있다. 한글이 깨졌다.
궢귛귍귪궻귺긏긘깈깛
이런 난감한 상황을 막으려면 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"