이전에 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 값을 할당하지 않으며, 쿼리 작성을 통해 논리적 삭제된 데이터를 조회할 수 있다.
'Spring' 카테고리의 다른 글
| Spring Day 33 : 메서드 실행 시간 측정 기능 AOP (0) | 2024.03.15 |
|---|---|
| Spring Day 32 : Booleanbuilder, Booleanexpression (0) | 2024.03.12 |
| Spring Day 30 : 통합 테스트, 단위 테스트 차이 (0) | 2024.03.08 |
| Spring Day 29 : 페이지 반환 타입 (1) | 2024.03.07 |
| Spring Day 28 : 영속성 컨텍스트 특징 (0) | 2024.03.06 |