본문으로 이동
문서

JPA 덕분에 DB에서 삽질한 이야기

박제희 컬리 · 컬리 기술 블로그

원문 보기

AI 핵심 요약

UUID를 저장한 뒤 조회하면 결과가 나오지 않는 문제를 겪어, 테스트 케이스를 비교하며 H2 인메모리 DB와 개발용 MySQL의 차이를 확인했다. 엔티티의 UUID 컬럼이 BINARY(255)로 생성된 것이 원인이었고, UUID가 16바이트라는 점에 맞춰 컬럼을 BINARY(16)으로 지정하자 조회가 정상 동작했다. MySQL은 BINARY 값이 지정 길이보다 짧으면 오른쪽을 패딩하므로, 16바이트 UUID와 패딩된 컬럼 값이 일치하지 않아 조회가 실패할 수 있음을 SQL로 재현했다. 테스트 환경을 실제 DBMS와 맞추고, 컬럼 정의와 저장된 바이트를 확인하는 것이 문제를 정확히 진단하는 데 중요하다는 교훈을 얻었다.

  • UUID는 16바이트이므로 MySQL의 BINARY 컬럼도 BINARY(16)으로 정의해야 합니다.
  • MySQL은 BINARY 컬럼의 남는 공간을 오른쪽 패딩으로 채우므로, 컬럼 길이가 UUID보다 크면 저장한 값과 조회 조건의 바이트가 달라질 수 있습니다.
  • H2와 개발용 MySQL처럼 테스트 환경이 다르면 같은 코드도 다르게 동작할 수 있으니, 실제 DBMS와 일치하는 환경에서 검증하세요.
  • 문제가 재현되면 테스트 케이스의 목적과 컨텍스트를 점검하고, 스키마와 저장된 바이트를 직접 확인해 원인을 좁혀가세요.

소개

DB에 저장을 했는데, 조회가 안 돼요

비슷한 학습 자료

문서 김동호

DB Connection과 Garbage Collector의 관계를 중심으로 mysql-connector-j 사용 시 발생할 수 있는 메모리 누수를 탐지하고 해결한 경험을 공유합니다.

백엔드 데이터베이스

문서 이경훈

JdbcPagingItemReader와 MySqlPagingQueryProvider를 사용할 때 주의사항

백엔드 데이터베이스

문서 호선우

COMMIT, MVCC 그리고 SET AUTOCOMMIT

데이터베이스

문서 유형환

애플리케이션, DB 모두 행복한 BULK 처리

백엔드 데이터베이스

문서 박제희, 이규원, 이종립

성능 테스트로 데드락을 찾아 없애고 TPS를 끌어올리자!

데이터베이스 프로덕트 지표 · 실험

문서 허재진

컬리 데이터 파이프라인의 BigQuery 도입 결과 및 효과

데이터베이스 데브옵스 · 인프라