티스토리 뷰
게시글을 올리고 삭제했을때,
데이터를 완전 삭제해버리는 Hard Delete 방식과
데이터를 남기는 Soft Delete 방식이 존재한다.
어떻게 운영하냐에 따라서 각각의 방식을 사용할 수 있다.
사내 백오피스를 리뉴얼하면서 레거시를 보니
어떤 메뉴는 Hard 방식 어떤메뉴는 Soft 방식을 혼용하고 있었다.
그래서 동일하게 가져가기 위해 모든 메뉴의 삭제기능을 soft 방식으로 가져가려고 한다.
JPA 엔티티에 @SQLDelete 어노테이션을 사용하여
Delete 명령시 Update로 삭제유무 컬럼을 조정하게 해줄 수 있다.
적용한 엔티티는 아래와 같다.
@Entity
@Table(name="sample")
@SQLDelete(sql = "UPDATE sample SET DELETE_YN = '1' WHERE UUID = ?")
@Where(clause = "DELETE_YN = '0'")
public class sampleEntity {
@Column(name="DELETE_YN", nullable = false)
private String deleteYN = "0";
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="UUID")
private String uuid;
}
@SQLDelete 에 의해서 repository.delete(entity) 를 수행하면
delete 구문이 아닌 어노테이션에 지정한 쿼리를 수행한다.
delete 를 수행했는데 update 구문으로 수행하는 것을 확인 할 수 있다.
UPDATE
SAMPLE
SET
DELETE_YN = '1'
WHERE
UUID = '2532AAA9CC4307E8E065000000000001'
보통 boolean 형을 사용하는데
나는 oracle 을 사용하고 있어 boolean 형이 없기 때문에 NUMBER(1) 이나 CHAR(1) 을 사용하고 있다.
그래서 데이터형을 꼭 Boolean 을 사용 할 필요는 없고
int 나 char 로 처리해도 무방하다.
'1'/'0' 이나 'Y'/'N' 또는 1/0 등으로 데이터를 사용해도 된다.
@SQLDelete 에서 특별히 지정되어있는 데이터형이 없기 때문이다.
그리고 삭제안된 데이터만 로드하기 위한
@Where 에 의해서 조회쿼리 마다 내가 지정한 구문이 Where 절에 붙어 나간다.
* 엔티티에 적용된 것이기 때문에 이는 Querydsl 에도 적용된다.
where
(
sample0_.DELETE_YN = '0'
)
이 부분은 약간의 단점이 있는데 모든 쿼리에 적용되서 나가므로
삭제 된 데이터를 조회하는 기능이 있다면 위의 @Where 절을 없애고
조회 쿼리마다 지정을 해주는 것이 좋다.
'Java > JPA, QueryDSL' 카테고리의 다른 글
[QueryDSL] LocalDateTime 형식 DateTimeExpression 으로 년월(YYYYMM)만 비교하기 (0) | 2024.03.07 |
---|---|
[JPA] DB환경별 다중 schema, catalog 엔티티 적용법 (2) | 2023.11.22 |
[QueryDSL] Projections, @QueryProjection 을 사용하여 DTO로 반환하기 (1) | 2023.11.13 |
[QueryDSL] 다중 Datasource 설정하기 (feat.@Qualifier 사용) (0) | 2023.11.13 |
[JPA] LocalContainerEntityManagerFactoryBean의 setJpaPropertyMap을 설정할 때 사용할 수 있는 key 값 목록 (0) | 2023.10.24 |