콘솔 출력 문제는 stdout.encoding이나 chcp 문제인 경우가 대부분입니다. 소스 파일 인코딩을 바꾸면 다른 도구(Git, IDE)와 충돌해 더 큰 문제가 생깁니다. 항상 소스는 UTF-8 로 고정하고 출력 쪽만 조정합니다.
VARCHAR2(100 BYTE)에 String.length()로 100자 미만인지만 검사하면, 한글이 많은 값에서 insert 시점에 ORA-12899가 발생합니다. 저장 전에 getBytes(charset).length로 바이트 기준 검증을 해야 합니다.
Excel 이 BOM 없는 UTF-8 CSV 를 EUC-KR 로 오인하는 것은 알려진 동작입니다. Excel 로 열 CSV 는 BOM 을 붙여 내려주는 것이 올바른 대응입니다.
같은 글자라도 NFC 와 NFD 는 equals()가 false입니다. 외부 입력(특히 macOS 유래) 파일명은 저장·비교 전에 Normalizer.normalize(name, Form.NFC)로 통일해야 합니다.
컨트롤러, 서비스, DAO 마다 각자 인코딩 변환을 하면 어디선가 이중 변환이 생겨 디버깅이 어려워집니다. 변환은 레거시 경계 한 곳에만 두고, 내부는 항상 UTF-8 문자열로 통일합니다.
String(byte[])를 플랫폼 기본 인코딩으로 호출한다Charset을 명시하지 않은 new String(bytes)와 str.getBytes()는 JVM 기본 인코딩을 씁니다. JDK 18+ 는 대개 UTF-8 이지만, 이식성과 명확성을 위해 항상 Charset을 명시적으로 넘깁니다.