[Spring] JPA @Where 어노테이션 사용

Walter Mitty·2023년 6월 25일
0

파트장님이 내가 만든 기능 QA를 해주시던 중에, Faq & FaqImage 삭제에 대한 의견을 주셨다.
여러 상황 중 클라이언트가 삭제한 Faq에 대한 복구를 요청했을 때다.

기존에 내 로직은
1. 클라이언트가 고유번호가 1번인 Faq 삭제 클릭
2. Faq 1번 객체에 연관관계되어 있는 FaqImage도 Cascade로 함께 DB에서 싹 다 삭제

파트장님의 추천 로직은
1. 클라이언트가 고유번호가 1번인 Faq 삭제 클릭
2. DB에서는 isDelete 컬럼을 하나 추가해서 해당 삭제 일자가 들어가도록 수정
3. 조회시 isDelete가 null인 Faq만 조회 (목록 조회시, 상세 조회시)

지금 로직에서 쉽게하기위해 Faq Entity쪽에 @Where 어노테이셔을 붙여주기로 했다.

Faq.java

@Entity
@Table(name = "faq")
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
@DynamicInsert
@DynamicUpdate
public class Faq extends DateColumn {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "faqId")
    private Integer faqId;

    @Column(name = "adminId")
    private Integer adminId;

    @Column(name = "faqTitle")
    private String faqTitle;

    @Column(name = "faqContent")
    private String faqContent;

    @JsonManagedReference
    @OneToMany(mappedBy = "faq", fetch = FetchType.LAZY)
    private List<FaqImage> faqImages;

    /**
     * 자주묻는질문 수정
     */
    public void modifyFaq(FaqRegistRequest request) {
        this.faqTitle = request.getFaqTitle();
        this.faqContent = request.getFaqContent();
    }
}

@Where 조건을 안붙였을 때 아래와 같이 select에 where 조건이 보이지 않는다.


변경된 Faq.java

@Entity
@Table(name = "faq")
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
@DynamicInsert
@DynamicUpdate
@Where(clause = "isDeleted is null") // <<<<<<<<여기!!!!!!!!!!
public class Faq extends DateColumn {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "faqId")
    private Integer faqId;

    @Column(name = "adminId")
    private Integer adminId;

    @Column(name = "faqTitle")
    private String faqTitle;

    @Column(name = "faqContent")
    private String faqContent;

    @Column(name = "isDeleted") // <<<< 추가
    private LocalDateTime isDeleted; // <<<< 추가

    @JsonManagedReference
    @OneToMany(mappedBy = "faq", fetch = FetchType.LAZY)
    private List<FaqImage> faqImages;

    /**
     * 자주묻는질문 수정
     */
    public void modifyFaq(FaqRegistRequest request) {
        this.faqTitle = request.getFaqTitle();
        this.faqContent = request.getFaqContent();
    }

    public void deleteFaq() { // <<<< 추가 
        LocalDateTime dateTime = LocalDateTime.now(); // <<<< 추가
        this.isDeleted = dateTime; // <<<< 추가
    }
}

그러면, 이렇게 select 시에 무조건 where 조건에 내가 설정한 로직이 붙게 된다.
참고로 나는 @Where(clause = "{DB 컬럼명} 조건") 으로 적어줬다.

혹시 몰라 포스트맨으로 테스트 중 Faq 상세 보기 API 쿼리문에 직접 삭제된 faq 고유번호를 넣어줬는데, DB에는 해당글이 존재함에도 잘 예외처리가 된다!

0개의 댓글