본문 바로가기
Spring

Spring Day 31 : Soft Delete v2

by 우 석 2024. 3. 11.

이전에 soft delete 구현 방식은 deleted_at 필드에 미리 null 값을 할당하고, 객체가 삭제되는 시점에 시간을 넣어, null 이 아닌 값을 조회하도록 구현하였다. 

https://ws-code-diary.tistory.com/42

 

Spring Day 23 : Soft Delete

Soft Delete 논리적으로만 삭제하는 방법 Hard Delete( 물리적 삭제, 데이터를 삭제함) 논리적으로 삭제한다 -> 유저에게 삭제된 데이터를 보여주지 않고, 데이터를 보관한다. 예를 들어 악성 댓글을 입

ws-code-diary.tistory.com

 

하지만 DB에 null 값을 넣는 방법은 데이터 무결성, 검색 및 정렬 어려움, 에러 발생 가능성도 있기 때문에 수정하였다.

 

무엇보다 @SQLRestriction("deleted_at is NULL") 어노테이션은 SQL에 대한 직접적인 의존성을 만들 수 있다. 예를 들어   데이터베이스 종류를 변경하거나 SQL 문법을 변경해야 할 경우, 해당 어노테이션을 수정해야 한다.

 

새롭게 구현한 soft delete 방식은 deleted_YN 필드를 생성하고, 객체가 생성되는 시점에  deleted_YN = "N" 을 적용한다. 

 User user = User.builder()
            .email(requestDto.getEmail())
            .username(requestDto.getUsername())
            .password(passwordEncoder.encode(requestDto.getPassword()))
            .role(UserRole.USER)
            .deleted_YN("N") // 생성시 필드 값 = N
            .build();

 

DB

 

 

QueryDSL 을 적용하여 아래의 코드처럼 deleted_YN 필드 값이 "N" 인 경우만 조회할 수 있다.

삭제되는 시점엔 deleted_YN 필드 값을 "Y"로 변경하여 해당 정보를 조회하지 않는다.

@RequiredArgsConstructor
public class SearchUserImpl implements SearchUser {

    private final JPAQueryFactory jpaQueryFactory;
    QUser user = QUser.user;

    @Override
    public Optional<User> searchUserInfo(Long userId) {
        return Optional.ofNullable(jpaQueryFactory.selectFrom(user)
            .where(user.id.eq(userId)
                .and(user.deleted_YN.eq("N")))
            .fetchOne());
    }
}

 

 

v2 방법으로 구현한 soft delete 방식은 @SQLRestriction 를 사용하지 않고, null 값을 할당하지 않으며,  쿼리 작성을 통해 논리적 삭제된 데이터를 조회할 수 있다.