요약: 클라우드 운영 환경(PostgreSQL) 한글 데이터 정렬 실패 및 무작위 반환 현상을 해당 컬럼의 Collation 처리로 해결
🛠 육하원칙 기반 오류 보고
1. 누가 (Who / Environment)
- 영향 범위
- 도서 목록 화면에서 ‘제목순’ 정렬 기능을 사용하는 모든 클라이언트(사용자)
- 환경 차이
- 로컬 개발 환경 - H2 인메모리 데이터베이스
- 운영 배포 환경 - 클라우드 기반 PostgreSQL (17.6 ver)
2. 언제 (When / Timeline)
- 발생 시점
- 로컬(H2) 환경에서 커서 기반 페이징 및 정렬 기능 개발을 완료하고, 최초로 운영 환경(PostgreSQL) 서버로 배포하여 통합 테스트를 진행하던 중 발견
- 지속성
- 일시적인 네트워크 장애가 아닌, 특정 조건(한글 제목 정렬)에서 지속적으로 발생하는 로직 및 설정 결함
3. 어디서 (Where / Location)
- 기능 계층
- 도서 목록을 불러오는 조회 API(
GET /api/books)의 페이징 정렬 로직
- 인프라 계층
- 운영 환경의 PostgreSQL 데이터베이스 엔진 내부 정렬(Sort) 과정
4. 무엇을 (What / Symptom)
- 현상
- 사용자가 도서 목록 검색 시 ‘제목순(오름차순)’ 정렬을 요청했음에도, 화면에 출력되는 순서는 가나다순이나 최신순이 아닌 완전히 뒤죽박죽인 무작위 순서로 노출
- 분석
- 프론트엔드의 파라미터 요청(
orderBy=title, direction=ASC)과 백엔드의 QueryDSL 동적 쿼리 생성에는 문제가 없음을 로그로 확인함.
DB 툴을 통해 직접 쿼리(SELECT title, created_at FROM books ORDER BY title ASC)를 실행했을 때도 정렬이 무시되는 현상 확인.
5. 왜 (Why / Cause)
- 데이터베이스 콜레이션(Collation, 문자 정렬 규칙) 불일치
- 로컬 H2 데이터베이스는 기본적으로 시스템 locale을 따라 한글 정렬을 지원했으나, 클라우드에 설치된 PostgreSQL은 기본 언어셋이 영어(ex
en_US.UTF-8 또는 기본 설정)로 되어있었음.
- 이로 인해서 DB 엔진이 ‘한글 문자열’의 정렬 가중치(순서)를 판단하지 못해 모든 한글 데이터를 동일한 우선순위(Tie)로 취급했고, 결과적으로 하드디스크(Heap)에 저장되어 있는 물리적인 저장 순서 그대로 데이터를 반환하여 무작위 정렬처럼 보이게 되었음.
6. 어떻게 (How / Action)
- 즉각적 조치
- DB 인스턴스 전체의 언어셋을 재설치하거나 변경하는 대신, 가장 빠르고 안전한 방법으로
books 테이블의 title 컬럼 정렬 규칙(Collate)을 바이트(Byte) 단위 정렬 방식인 "C" 콜레이션으로 강제 변경하는 DDL 쿼리를 실행해서 문제를 해결함
ALTER TABLE books ALTER COLUMN title TYPE varchar COLLATE "C";
- 결과
- UTF-8 인코딩 환경에서 바이트 단위 순서는 한글 가나다순과 완벽하게 일치하므로 정상적인 오름차순/내림차순 정렬이 동작함을 확인함.