DB 연동 전에 문자셋부터 확인합니다. 콘솔에서 직접 조회합니다.
SELECT parameter, value
FROM nls_database_parameters
WHERE parameter = 'NLS_CHARACTERSET';AL32UTF8이면 한글 1자가 3바이트, KO16MSWIN949면 2바이트입니다. VARCHAR2 컬럼 길이를 BYTE가 아니라 CHAR로 선언하면 글자 수 기준이라 이 차이에 덜 민감해집니다.
레거시 MySQL 연동에서 흔히 빠뜨리는 두 줄입니다.
server:
servlet:
encoding:
charset: UTF-8
force: true
spring:
datasource:
url: jdbc:mysql://localhost:3306/app?characterEncoding=UTF-8&useUnicode=trueforce: true가 없으면 요청 인코딩만 UTF-8 로 바뀌고 응답 인코딩은 그대로 남는 경우가 있어 둘 다 명시합니다.
경계 지점에서만 변환하는 원칙을 코드로 옮기면 다음과 같습니다.
// 내부 UTF-8 문자열을 레거시 EUC-KR 전문 바이트로 변환
static byte[] toLegacyBytes(String internalUtf8Value) {
return internalUtf8Value.getBytes(Charset.forName("EUC-KR"));
}
// 레거시 EUC-KR 전문 바이트를 내부 UTF-8 문자열로 변환
static String fromLegacyBytes(byte[] legacyBytes) {
return new String(legacyBytes, Charset.forName("EUC-KR"));
}이 두 메서드 바깥으로는 byte[]를 절대 노출하지 않고, 서비스 로직은 항상 자바 String(UTF-16)만 다루도록 강제하는 것이 유지보수 포인트입니다.