구매한 상품에 대한 리뷰와 평점을 남길 수 있는 로직이 구현되었다.
이제 마이페이지에서 주문내역을 조회 후 리뷰를 작성할 수 있게 주문조회 기능을 구현중인데,
현재 정책상 삭제된 게시물에도 리뷰를 작성할 수 있게 되어있다.
그러나 주문조회 시 softDelete가 true인 게시물을 조회할 수 없는 에러가 발생했다..
soft delete된 데이터를 조회하기 위해서 3가지의 방법이 있다.
- JPQL등에서 직접 처리하기
실무에서는 다양한 상황들이 나타나기 때문에 모든 상황을 직접 다룰 수 있게 JPQL을 사용하는 것을 권장드립니다. 참고로 실무에서는 대부분의 조회 쿼리가 단순하지 않기 때문에 JPQL을 자주 사용하게 됩니다.
- 하이버네이트 @Filter
대안으로는 하이버네이트 @Filter를 사용할 수 있는데, 이 기능을 사용하면 원하는 시점에 @Where와 같은 기능을 적용할 수 있습니다. 하지만 제대로 사용하기가 매우 복잡하고, 실수로 필터를 적용하지 않으면 또 버그가 발생하기 때문에 저는 권장하지는 않습니다. 또한 하이버네이트 전용 기능이어서 하이버네이트 session으로 전환하고 사용해야 하는데 이런 부분을 구현하기도 까다롭습니다.
- 조회 전용 엔티티
조회 전용 엔티티를 만들어서 특별한 곳에서만 사용할 수 있습니다. 하지만 같은 엔티티가 2개가 되기 때문에 엔티티를 중복으로 관리해야 하는 문제가 있습니다.
출처: https://www.inflearn.com/questions/1138673/comment/310404
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인 값도 같이 조회할 수 없을까?
'내일배움캠프 프로젝트' 카테고리의 다른 글
BuySell - 최종 프로젝트 종료 (0) | 2024.04.06 |
---|---|
BuySell - S3 이미지업로드 (2) (1) | 2024.03.29 |
BuySell - S3 이미지 업로드 (0) | 2024.03.28 |
BuySell - 선착순 쿠폰 발급기능 (3) (0) | 2024.03.24 |
BuySell - 선착순 쿠폰발급 (2) (0) | 2024.03.20 |