JPA에서 Entity명을 SQL예약어로 했을때 에러 발생

배지원·2023년 1월 5일
0

에러

목록 보기
4/6

프로젝트를 진행하다가 좋아요 기능을 구현하기 위해 좋아요 DB를 저장하기 위한 1대1 매핑 클래스인 Like Entity를 만들었다.
하지만 프로그램을 실행시키면 @Entity에 해당하는 클래스들은 자동으로 jpa에서 DB에 테이블을 생성해 주는데 Like Entity만 생성되지 않는 오류가 발생했다.

에러 종류

(1) GenerationTarget encountered exception accepting command : Error executing DDL "create table like 에러

알고보니 DB에서 like라는 예약어를 사용하고 있기 때문에 오류가 발생했던 것이다.

따라서 기존에는

@Entity
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Builder
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@EntityListeners(AuditingEntityListener.class)
public class Like extends BaseTimeEntity{

}

으로 만들어서 오류가 발생했었더라면

이제는

@Entity
@Table(name = "\"like\"")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Builder
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@EntityListeners(AuditingEntityListener.class)
@Where(clause = "deleted_at IS NULL")           // deletedAt의 Default 값은 null
@SQLDelete(sql = "UPDATE \"like\" SET deleted_at = CURRENT_TIMESTAMP where id = ?")     // Delete 쿼리문이 실행되면 현재 like id를 통해 like DB에 deletedAt값에 현재 시간을 넣는다.
public class Like extends BaseTimeEntity{

}

으로 Table명을 지정을 해주는데 like라는 이름을 그대로 사용하기 위해 이름 옆에 \"를 사용하여 sql문이 아닌 문자로 구분하여 작성을 해 주었다.

문자로 구분을 해주었기 때문에 정상동작하는 것을 확인할 수 있다.



(2) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"likes" SET deleted_at = CURRENT_TIMESTAMP where id = 2' at line 1 에러


위에서 생성한 Entity에서 삭제 기록을 남기기 위해 Soft Delete를 아래와 같이 해주었다.

@Where(clause = "deleted_at IS NULL")           // deletedAt의 Default 값은 null
@SQLDelete(sql = "UPDATE \"like\" SET deleted_at = CURRENT_TIMESTAMP where id = ?")     // Delete 쿼리문이 실행되면 현재 like id를 통해 like DB에 deletedAt값에 현재 시간을 넣는다.
  • @Where를 통해 deleted_at의 Default 값을 null로 잡아주고 추후에 데이터를 호출할때 null값만 호출할 수 있도록 한다.
  • @SQLDelete를 통해 Delete기능이 실행이 될때 실제로는 Delete가 실행되지 않고 (sql = "UPDATE \"like\" SET deleted_at = CURRENT_TIMESTAMP where id = ?") 내용이 실행이 된다.

이때 @SQLDelete안에 테이블명은 이전에 @Table로 지정해줬던 \"like\"값을 그대로 사용하였는데 실제로 Delete를 하면 Entity 이름에 관련해서 오류가 발생한다.

따라서 구글링을 해본 결과 예약어를 컬럼명으로 사용한 경우에는 키보드 Tab키 위에 ` 문자를 사용해야한다고 한다.

따라서 아래와 같이 다시 코드를 변경해보니

@Where(clause = "deleted_at IS NULL")           // deletedAt의 Default 값은 null
@SQLDelete(sql = "UPDATE `like` SET deleted_at = CURRENT_TIMESTAMP where id = ?")


정상적으로 동작하는 것을 알 수 있다.

profile
Web Developer

0개의 댓글