프로그램/Java

[Java] OutputStreamWriter를 사용할 때 한글이 깨지는 현상 해결 방

neorc 2025. 5. 20. 11:04
OutputStreamWriter를 사용할 때 한글이 깨지는 이유는 문자 인코딩을 명시하지 않고 기본 인코딩을 사용할 경우
, 시스템 환경에 따라 UTF-8이 아닌 다른 문자셋(예:EUC-KR, ISO-8859-1)이 사용되기 때문입니다.

 

✅ 문제 상황 예시 (깨지는 코드)

OutputStream os = connection.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(os); // ❌ 인코딩 미지정
writer.write("홍길동");
writer.flush();

이 경우, OutputStreamWriter는 시스템 기본 문자셋을 사용합니다. 시스템이 UTF-8이 아닐 경우 한글이 깨질 수 있습니다.

 

✅ 해결 방법: 명시적으로 UTF-8 인코딩 지정

OutputStream os = connection.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(os, "UTF-8"); // ✅ 인코딩 지정
writer.write("홍길동");
writer.flush();

또는 BufferedWriter를 함께 쓰면 더 안정적이고 효율적으로 데이터를 보낼 수 있습니다.

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8"));
bw.write("홍길동");
bw.flush();

 

✅ 반드시 같이 설정해야 하는 부분

 

 HTTP 헤더에도 인코딩 지정

connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");

 

서버가 UTF-8로 응답하지 않으면, 응답도 수동 디코딩 필요

new InputStreamReader(conn.getInputStream(), "UTF-8");

 

✅ 결론

OutputStreamWriter를 사용할 땐 항상 두 가지를 체크하세요:

  • 인코딩 "UTF-8"을 명시
  • HTTP 헤더에 charset=UTF-8 설정

그렇지 않으면 환경에 따라 한글이 깨질 수 있습니다. 특히 윈도우 환경에서 개발하고 리눅스 서버에 배포할 때 이런 문제가 자주 발생합니다.