내일배움캠프 프로젝트

BuySell - 주문 조회

공부처음하는사람 2024. 4. 3. 02:58

 

구매한 상품에 대한 리뷰와 평점을 남길 수 있는 로직이 구현되었다.

 

이제 마이페이지에서 주문내역을 조회 후 리뷰를 작성할 수 있게 주문조회 기능을 구현중인데,

 

현재 정책상 삭제된 게시물에도 리뷰를 작성할 수 있게 되어있다.

 

그러나 주문조회 시 softDelete가 true인 게시물을 조회할 수 없는 에러가 발생했다..

 

19번 게시물을 조회하지 못한다

soft delete된 데이터를 조회하기 위해서 3가지의 방법이 있다.

  1. JPQL등에서 직접 처리하기

실무에서는 다양한 상황들이 나타나기 때문에 모든 상황을 직접 다룰 수 있게 JPQL을 사용하는 것을 권장드립니다. 참고로 실무에서는 대부분의 조회 쿼리가 단순하지 않기 때문에 JPQL을 자주 사용하게 됩니다.

  1. 하이버네이트 @Filter

대안으로는 하이버네이트 @Filter를 사용할 수 있는데, 이 기능을 사용하면 원하는 시점에 @Where와 같은 기능을 적용할 수 있습니다. 하지만 제대로 사용하기가 매우 복잡하고, 실수로 필터를 적용하지 않으면 또 버그가 발생하기 때문에 저는 권장하지는 않습니다. 또한 하이버네이트 전용 기능이어서 하이버네이트 session으로 전환하고 사용해야 하는데 이런 부분을 구현하기도 까다롭습니다.

  1. 조회 전용 엔티티

조회 전용 엔티티를 만들어서 특별한 곳에서만 사용할 수 있습니다. 하지만 같은 엔티티가 2개가 되기 때문에 엔티티를 중복으로 관리해야 하는 문제가 있습니다.

 

출처: https://www.inflearn.com/questions/1138673/comment/310404

 

게시판에서 삭제된 댓글을 보여주기 위해 Spring Data JPA에서는 어떻게 접근해야 할까요? - 인프런

상황 설명기본적인 게시판을 만들고 있어요.해당 게시판에는 게시물를 달 수 있고 해당 게시물에는 댓글을 달 수 있어요.댓글과 관련한 요구사항들은 다음과 같습니다.댓글 Create, Update, Delete각

www.inflearn.com


 

PostRepository

interface PostRepository: JpaRepository<Post, Int>, CustomPostRepository {

    @Query("SELECT p FROM Post p WHERE p.order.id = :orderId")
    fun findByOrderId(orderId: Int?): List<Post>
}

Service

    override fun getOrderHistories(memberId: Int): List<OrderHistoriesResponse> {
        val orders = orderRepository.findByMemberId(memberId)
        val histories = mutableListOf<OrderHistoriesResponse>()

        orders.forEach { order ->
            val posts = postRepository.findByOrderId(order.id)
            posts.forEach { post ->
                histories.add(
                    OrderHistoriesResponse(
                        imageUrl = post.imageUrl,
                        postTitle = post.title,
                        price = post.price
                    )
                )
            }
        }
        return histories
    }

 

 

현재 주문건수는 3건이다.

 

스웨거에서 구매내역 조회를 해봤을 때

 

2건만 나오게 된다. isDeleted가 true 인 게시물을 여전히 조회하지 못하고 있다. 

쿼리에 문제는 없어 보이는데 왜 조회가 안될까 하며 JPQL로 다시 시도를 해봤다.

 

 

@Repository
class PostRepositoryByJPQL (private val entityManager: EntityManager) {
    fun findAllPostsByOrderId(orderId: Int?): List<Post> {
        val query = entityManager.createQuery(
            "SELECT p FROM Post p WHERE p.order.id = :orderId", Post::class.java
        )
        query.setParameter("orderId", orderId)
        return query.resultList
    }
}

 

 

스웨거에서 다시 조회 해봤다.

 

 

여전히 2건만 조회가 된다. 

왜 조회가 안되는지 이해가 안간다.. 원인을 찾고 쿼리를 수정하고, 서비스코드를 수정해도 해결이 되지 않았다.

 

그러던 도중 콘솔의 로그를 확인해봤다.

 

쿼리에는 is_deleted를 필터링하는 내용이 없는데, 어디서 자꾸 필터링되고 있었다.

 

찾아보니 Post Entity에 @SQLRestriction이 걸려있었다.

@Entity
@Table(name = "post")
@SQLDelete(sql = "UPDATE post SET is_deleted = true WHERE id = ?") // DELETE 쿼리 대신 실행
@SQLRestriction("is_deleted = false")

 

이번 프로젝트에서는 Soft Delete를 적용해, 삭제 된 게시물을 조회할 수 없게 설정을 해두었는데, 그걸 깜빡하고 몇시간동안 뻘짓을 하게 된것이다..

 

SQLRestriction을 어떻게 처리해야될지 고민이다.

 

SQLRestriction을 해제하면 삭제된 게시글이 조회가 되고, 이는 정책 위반인 상황이라 해제할 수 없다.

 

SQLRedstiction이 힘이 쎈(?) 애라 현재까지 어떤짓을해도 이 어노테이션을 무시하고 조회한 적이 있나 생각해 보았다.

 

없다..

 

구매내역 조회만 어떻게 SQLRestriction을 해제하지않고 isDeleted가 true인 값도 같이 조회할 수 없을까?