Oracle INSERT 시 DEFAULT가 적용되지 않는 이슈

코드줍줍·2025년 9월 17일
0

삽질 일지

목록 보기
8/13
post-thumbnail

🐞 문제

API 테스트 중 DB INSERT 시 다음 이슈 발생

  • COUNTRY_CODE VARCHAR2(5) DEFAULT ‘82‘ 컬럼에 빈 문자열(’’)이 저장됨

🔍 원인

Oracle에서 DEFAULT는 컬럼을 생략했을 때만 적용됨

INSERT INTO BTALK_MSG (..., COUNTRY_CODE, ...) VALUES (..., #{countryCode}, ...)
  • 위와 같이 #{countryCode} 자리에 빈 문자열 값이 전달되면, Oracle은 이를 NULL로 간주하지 않고 실제 값으로 처리함

✅ 해결

SQL 레벨에서 NVL(NULLIF(…)) 적용

INSERT INTO BTALK_MSG (..., COUNTRY_CODE, ...)
VALUES (..., NVL(NULLIF(#{countryCode}, ''), '82'));
  • NULLIF(#{countryCode}, ‘’) → 빈 문자열이면 NULL 반환
  • NVL(..., ‘82’) → NULL 이면 82 대입

✨ 배운 점

  • Oracle에서는 ’’(빈 문자열)도 유효한 값이며, DEFAULT가 적용되지 않는다.
  • DEFAULT는 컬럼 생략 시에만 동작한다.
  • MyBatis 등에서 파라미터가 빈 문자열일 수 있는 경우는 쿼리 또는 로직에서 명시적으로 처리해야 한다.
profile
Just Wanna Dev

0개의 댓글