프로젝트를 진행하다가 좋아요 기능을 구현하기 위해 좋아요 DB를 저장하기 위한 1대1 매핑 클래스인 Like Entity를 만들었다.
하지만 프로그램을 실행시키면 @Entity에 해당하는 클래스들은 자동으로 jpa에서 DB에 테이블을 생성해 주는데 Like Entity만 생성되지 않는 오류가 발생했다.
알고보니 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문이 아닌 문자로 구분하여 작성을 해 주었다.
문자로 구분을 해주었기 때문에 정상동작하는 것을 확인할 수 있다.
위에서 생성한 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값에 현재 시간을 넣는다.
이때 @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 = ?")
정상적으로 동작하는 것을 알 수 있다.