💻 프로젝트/트러블슈팅

[ 트러블 슈팅 ] SQLSyntaxErrorException - @SQLDelete 사용 시 테이블 컬럼명 불일치 문제

carrot0911 2025. 2. 4. 20:38

Soft Delete를 구현하기 위해 Hibernate의 @Where 및 @SQLDelete 어노테이션을 적용했을 때, 다음과 같은 SQLSyntaxErrorException이 발생했다.


문제 상황

SQLSyntaxErrorException: Unknown column 'member_id' in 'where clause'

코드 작성 과정

@Where(clause = "is_deleted = false")
@SQLDelete(sql = "UPDATE member SET is_deleted = true WHERE member_id = ?")
  • @Where를 사용하여 is_deleted가 false인 데이터만 조회하도록 설정했다.
  • @SQLDelete를 활용하여 삭제 요청 시 Soft Delete되도록 SQL 쿼리를 작성했다.

하지만 테이블 컬럼명은 id로 설정되어 있었고, SQL 쿼리에서는 member_id를 사용하면서 오류가 발생했다.


문제 원인 분석

 

  • Hibernate의 @SQLDelete는 직접 작성한 SQL을 실행하는데, 테이블에 존재하지 않는 컬럼명을 사용하면 SQL 문법 오류(SQLSyntaxErrorException)가 발생합니다.
  • 실제 테이블 컬럼명: id
  • 잘못된 SQL 구문에서 사용한 컬럼명: member_id
  • 즉, UPDATE member SET is_deleted = true WHERE member_id = ?에서 member_id 컬럼이 존재하지 않아 에러가 발생한 것입니다.

해결 방법

잘못된 컬럼명(member_id)을 id로 수정해야 한다.

수정 후 코드

@Where(clause = "is_deleted = false")
@SQLDelete(sql = "UPDATE member SET is_deleted = true WHERE id = ?")

 

WHERE member_id = ? → WHERE id = ?로 수정하여, 실제 테이블의 컬럼명과 일치하도록 변경했다.


결론

 

  • Hibernate에서 @SQLDelete를 사용할 때는 테이블의 정확한 컬럼명을 확인하고 SQL을 작성해야 한다.
  • Soft Delete를 구현할 때는 JPA 엔티티 필드명(Member 클래스의 필드명)실제 데이터베이스 컬럼명이 다를 수 있으므로 주의해야 한다.
  • DDL (테이블 생성 SQL)과 JPA 매핑 정보를 사전에 확인하면 실수를 방지할 수 있다.