티스토리 뷰

반응형

 

 

 

 

 

 



 

 

SpringBoot

 

 

 

게시글을 올리고 삭제했을때,

데이터를 완전 삭제해버리는 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 절을 없애고 

조회 쿼리마다 지정을 해주는 것이 좋다.

 

 

 

 

 

 

 



 

 

 

 

 

 

반응형
댓글
반응형
최근에 올라온 글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Total
Today
Yesterday