공공부하자개발 · 영어 학습 노트
자바
실무 확장Excel · 파일 업로드 · DB 연동0/22 완료
  • 01Excel(XLSX) 구조와 순수 JDK로 읽기/쓰기
  • 02Apache POI로 Excel 업로드/다운로드
  • 03파일 업로드/다운로드 서버 (HttpServer)
  • 04JDBC 기초와 트랜잭션 (H2)
  • 05MyBatis 어노테이션 매퍼로 쿼리 연동
  • 06MyBatis XML 매퍼 · Oracle 방언 · PageHelper · Spring Boot
  • 07REST API 서버와 JSON
  • 08Vue 3 SPA 와 Java 서버 연동
  • 09@Scheduled 운영
  • 10로깅 실무: 레벨·계층, MDC 추적, 예외·성능, 마스킹, 롤링, JSON 로그
  • 11외부 API 연동
  • 12테스트 실무
  • 13암호화·개인정보 보호
  • 14인코딩·한글 실무
  • 15@Transactional 심화
  • 16긴 작업 비동기 처리와 진행률
  • 17SFTP·FTP 파일 연계
  • 18로컬 캐시와 @Cacheable
  • 19메일·알림 발송
  • 20웹 보안 체크리스트
  • 21빌드 도구와 폐쇄망 의존성 반입
  • 22성능 측정: p50·p95·p99, 측정 계층, JFR, JMH 함정, 자체 부하 테스트, 병목 순위
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › 실무 확장 › 14 / 22

인코딩·한글 실무

UTF-8·EUC-KR·CP949, BOM, 깨진 글자 진단, 바이트 길이, 파일명
섹션 7진행 0 / 22
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6연습 문제7정리‹ 이전다음 ›

5. 자주 하는 실수 (Tip)

실수 1: 콘솔이 깨진다고 소스 파일 인코딩을 EUC-KR 로 바꾼다

콘솔 출력 문제는 stdout.encoding이나 chcp 문제인 경우가 대부분입니다. 소스 파일 인코딩을 바꾸면 다른 도구(Git, IDE)와 충돌해 더 큰 문제가 생깁니다. 항상 소스는 UTF-8 로 고정하고 출력 쪽만 조정합니다.

실수 2: DB 컬럼을 BYTE 기준으로 잡고 글자 수로 길이를 검증한다

VARCHAR2(100 BYTE)에 String.length()로 100자 미만인지만 검사하면, 한글이 많은 값에서 insert 시점에 ORA-12899가 발생합니다. 저장 전에 getBytes(charset).length로 바이트 기준 검증을 해야 합니다.

실수 3: CSV 를 BOM 없이 UTF-8 로만 내려주고 "Excel 버그"라고 넘긴다

Excel 이 BOM 없는 UTF-8 CSV 를 EUC-KR 로 오인하는 것은 알려진 동작입니다. Excel 로 열 CSV 는 BOM 을 붙여 내려주는 것이 올바른 대응입니다.

실수 4: 파일명 비교 시 정규화 형태를 맞추지 않는다

같은 글자라도 NFC 와 NFD 는 equals()가 false입니다. 외부 입력(특히 macOS 유래) 파일명은 저장·비교 전에 Normalizer.normalize(name, Form.NFC)로 통일해야 합니다.

실수 5: 인코딩 변환을 여러 계층에서 반복한다

컨트롤러, 서비스, DAO 마다 각자 인코딩 변환을 하면 어디선가 이중 변환이 생겨 디버깅이 어려워집니다. 변환은 레거시 경계 한 곳에만 두고, 내부는 항상 UTF-8 문자열로 통일합니다.

실수 6: String(byte[])를 플랫폼 기본 인코딩으로 호출한다

Charset을 명시하지 않은 new String(bytes)와 str.getBytes()는 JVM 기본 인코딩을 씁니다. JDK 18+ 는 대개 UTF-8 이지만, 이식성과 명확성을 위해 항상 Charset을 명시적으로 넘깁니다.

자주 하는 실수 (Tip)
  • 실수 1: 콘솔이 깨진다고 소스 파일 인코딩을 EUC-KR 로 바꾼다
  • 실수 2: DB 컬럼을 BYTE 기준으로 잡고 글자 수로 길이를 검증한다
  • 실수 3: CSV 를 BOM 없이 UTF-8 로만 내려주고 "Excel 버그"라고 넘긴다
  • 실수 4: 파일명 비교 시 정규화 형태를 맞추지 않는다
  • 실수 5: 인코딩 변환을 여러 계층에서 반복한다
  • 실수 6: String(byte[])를 플랫폼 기본 인코딩으로 호출한다
이전 섹션4 응용 변형 예제5 / 7다음 섹션6 연습 문제