JPA @ColumnDefault 사용에 대한 고찰 - 영속성 컨텍스트 + not null 컬럼

김동영·2025년 3월 12일
0

상황 설명

  • 특정 테이블의 컬럼이 아래와 같이 정의되어 있음.
    # not null && defualt 설정
    my_column_1 varchar(30) not null default 'NOT_LINK'
  • 기존에 존재하던 테이블에 신규 컬럼을 추가하면서 운영 오류 없이 처리하기 위해 디폴트 값을 설정하게 됨.
  • 디폴트 값이 적용될 수 있도록 @DynamicInsert 를 통해 null 컬럼은 인서트 구문에서 제거시킴.
  • 이후 운영하던 중, 하나의 테이블에 대해 생성/수정 각각 진행하던 API 2개를 하나의 트랜잭션으로 합쳐야 하는 상황이 발생함.
    why)API 간 의존 관계가 있어 실패 시, 전체 롤백이 필요해짐.

이슈 설명

  1. 분리되어있던 데이터 조회, 수정 기능을 하나의 트랜잭션으로 통일
  2. my_column_1 과 매핑된 jpa 속성 값이 영속 컨텍스트가 유지됨에 따라 디폴트 값을 세팅받지 못하고 null 로 유지됨.
  3. 수정 기능에서 데이터 조회 시, 해당 컬럼이 null 로 조회됨.
  4. 수정 후 저장 시, 해당 컬럼에 null 을 저장하려고 해서 오류가 발생함.

해결 방안

  • @ColumnDefault 제거하여 값을 항상 세팅하도록 변경
  • @DynamicInsert 제거하여 JPA 컬럼 디폴트가 동작할 수 없도록 변경
    디폴트 값은 기존 테이블의 row 에 값을 세팅하기 위함이므로 제거함.

느낀 점

  • 컬럼 디폴트 값이 존재한다고 해서 무분별하게 null 을 세팅하거나 @DynamicInsert 를 설정하면 위험할 수 있다는 것을 느낌,,,
  • 가능한 온전한 데이터가 세팅되어 쿼리문이 완전히 생성될 수 있도록 처리하는 것이 안정성을 올리는데 도움이 될 수 있을 것 같음.
  • 하지만 컬럼 디폴트가 존재하기 때문에 값이 실제로 세팅되었는지, 디폴트가 동작하여 세팅된 것인지 구분이 어려울 수 있음.
    생각해보니 구분할 필요가,,? 테스트 케이스에 문제가 있을런지...
profile
k8s, 프레임워크와 함께하는 백엔드 개발자입니다.

0개의 댓글