From a5b21c812977753f0c18ca7876befb042e09ef6d Mon Sep 17 00:00:00 2001 From: meohin Date: Mon, 22 Sep 2025 09:22:44 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20MyBarRepository=EC=97=90=20?= =?UTF-8?q?=EC=86=8C=ED=94=84=ED=8A=B8=20=EC=82=AD=EC=A0=9C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MyBar 엔티티를 삭제 시 실제 DB에서 삭제하는 대신, status를 'DELETED'로 변경하는 소프트 삭제 로직을 추가 --- .../domain/mybar/repository/MyBarRepository.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/com/back/domain/mybar/repository/MyBarRepository.java b/src/main/java/com/back/domain/mybar/repository/MyBarRepository.java index 34cd2ade..0ba75c50 100644 --- a/src/main/java/com/back/domain/mybar/repository/MyBarRepository.java +++ b/src/main/java/com/back/domain/mybar/repository/MyBarRepository.java @@ -5,6 +5,8 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import java.util.Optional; @@ -22,4 +24,14 @@ public interface MyBarRepository extends JpaRepository { /** 복원/재킵을 위해 status 무시하고 한 건 찾기 (없으면 Optional.empty) */ Optional findByUser_IdAndCocktail_CocktailId(Long userId, Long cocktailId); + + @Modifying(clearAutomatically = true, flushAutomatically = true) + @Query(""" + update MyBar m + set m.status = 'DELETED', m.deletedAt = CURRENT_TIMESTAMP + where m.user.id = :userId + and m.cocktail.cocktailId = :cocktailId + and m.status = 'ACTIVE' + """) + int softDeleteByUserAndCocktail(Long userId, Long cocktailId); } From 57a671086d03e21894da1186a7bd19809507b6c2 Mon Sep 17 00:00:00 2001 From: meohin Date: Mon, 22 Sep 2025 09:23:37 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=EB=A7=88=EC=9D=B4=EB=B0=94(MyBar)?= =?UTF-8?q?=20=ED=82=B5=20=ED=95=B4=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(=EC=86=8C=ED=94=84=ED=8A=B8=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/back/domain/mybar/service/MyBarService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/back/domain/mybar/service/MyBarService.java b/src/main/java/com/back/domain/mybar/service/MyBarService.java index e99330fa..aea90bdc 100644 --- a/src/main/java/com/back/domain/mybar/service/MyBarService.java +++ b/src/main/java/com/back/domain/mybar/service/MyBarService.java @@ -68,4 +68,10 @@ public void keep(Long userId, Long cocktailId) { myBarRepository.save(myBar); } + + /** 킵 해제(소프트 삭제) */ + @Transactional + public void unkeep(Long userId, Long cocktailId) { + myBarRepository.softDeleteByUserAndCocktail(userId, cocktailId); + } } From 3ba04976095890603e4ad5f7e78f8bbaaf5a241b Mon Sep 17 00:00:00 2001 From: meohin Date: Mon, 22 Sep 2025 09:23:59 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20MyBarController=EC=97=90=20?= =?UTF-8?q?=EC=B9=B5=ED=85=8C=EC=9D=BC=20=ED=82=B5(Keep)=20=ED=95=B4?= =?UTF-8?q?=EC=A0=9C=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/domain/mybar/controller/MyBarController.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/back/domain/mybar/controller/MyBarController.java b/src/main/java/com/back/domain/mybar/controller/MyBarController.java index 57b246e1..022c3e52 100644 --- a/src/main/java/com/back/domain/mybar/controller/MyBarController.java +++ b/src/main/java/com/back/domain/mybar/controller/MyBarController.java @@ -37,4 +37,14 @@ public RsData keep( myBarService.keep(userId, cocktailId); return RsData.of(201, "kept"); // Aspect가 HTTP 201로 설정 } + + /** 킵 해제(소프트 삭제) — 멱등 */ + @DeleteMapping("/{cocktailId}/keep") + public RsData unkeep( + @AuthenticationPrincipal(expression = "id") Long userId, + @PathVariable Long cocktailId + ) { + myBarService.unkeep(userId, cocktailId); + return RsData.of(200, "deleted"); + } }