From fe7fc783869b379448531c33a19ccd9f1b0e5110 Mon Sep 17 00:00:00 2001
From: dlswns2480 <dlswns2480@naver.com>
Date: Wed, 10 Jan 2024 15:05:33 +0900
Subject: [PATCH 01/14] =?UTF-8?q?feat=20:=20owner=20=EC=97=94=ED=8B=B0?=
 =?UTF-8?q?=ED=8B=B0=EC=97=90=20=EC=95=8C=EB=A6=BC=20=ED=99=9C=EC=84=B1?=
 =?UTF-8?q?=ED=99=94=20=EC=97=AC=EB=B6=80=20=ED=95=84=EB=93=9C=20=EC=B6=94?=
 =?UTF-8?q?=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/com/prgrms/catchtable/owner/domain/Owner.java | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/main/java/com/prgrms/catchtable/owner/domain/Owner.java b/src/main/java/com/prgrms/catchtable/owner/domain/Owner.java
index 8e748ae3..d5a06b1a 100644
--- a/src/main/java/com/prgrms/catchtable/owner/domain/Owner.java
+++ b/src/main/java/com/prgrms/catchtable/owner/domain/Owner.java
@@ -61,6 +61,9 @@ public class Owner extends BaseEntity implements UserDetails {
     @Column(name = "date_birth")
     private LocalDate dateBirth;
 
+    @Column(name = "notification_activated")
+    private boolean notification_activated;
+
     @OneToOne(fetch = LAZY)
     @JoinColumn(name = "shop_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
     private Shop shop;
@@ -75,6 +78,7 @@ public Owner(String name, String email, String password, String phoneNumber, Gen
         this.gender = gender;
         this.dateBirth = dateBirth;
         this.role = Role.OWNER;
+        this.notification_activated = true;
     }
 
     @Override

From a98ec849aa66dbca6848da3f71801f62210b6b23 Mon Sep 17 00:00:00 2001
From: dlswns2480 <dlswns2480@naver.com>
Date: Wed, 10 Jan 2024 15:05:52 +0900
Subject: [PATCH 02/14] =?UTF-8?q?feat=20:=20=EC=95=8C=EB=A6=BC=EB=B3=B4?=
 =?UTF-8?q?=EB=82=B4=EB=8A=94=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A6=AC?=
 =?UTF-8?q?=EC=8A=A4=EB=84=88=EC=97=90=20=EC=A1=B0=EA=B1=B4=20=EC=B6=94?=
 =?UTF-8?q?=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../common/notification/NotificationEvent.java       | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/main/java/com/prgrms/catchtable/common/notification/NotificationEvent.java b/src/main/java/com/prgrms/catchtable/common/notification/NotificationEvent.java
index eba2c6e1..5ff260cf 100644
--- a/src/main/java/com/prgrms/catchtable/common/notification/NotificationEvent.java
+++ b/src/main/java/com/prgrms/catchtable/common/notification/NotificationEvent.java
@@ -2,9 +2,11 @@
 
 import static org.springframework.transaction.event.TransactionPhase.AFTER_COMMIT;
 
+import com.prgrms.catchtable.member.domain.Member;
 import com.prgrms.catchtable.notification.dto.request.SendMessageToMemberRequest;
 import com.prgrms.catchtable.notification.dto.request.SendMessageToOwnerRequest;
 import com.prgrms.catchtable.notification.service.NotificationService;
+import com.prgrms.catchtable.owner.domain.Owner;
 import lombok.RequiredArgsConstructor;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
@@ -19,12 +21,18 @@ public class NotificationEvent {
     @Async
     @TransactionalEventListener(phase = AFTER_COMMIT) // 호출한쪽의 트랜잭션이 커밋 된 후 이벤트 발생
     public void sendMessage(SendMessageToMemberRequest request) {
-        notificationService.sendMessageAndSave(request.member(), request.content());
+        Member member = request.member();
+        if(member.isNotification_activated()){
+            notificationService.sendMessageAndSave(member, request.content());
+        }
     }
 
     @Async
     @TransactionalEventListener(phase = AFTER_COMMIT) // 호출한쪽의 트랜잭션이 커밋 된 후 이벤트 발생
     public void sendMessage(SendMessageToOwnerRequest request) {
-        notificationService.sendMessageAndSave(request.owner(), request.content());
+        Owner owner = request.owner();
+        if(owner.isNotification_activated()){
+            notificationService.sendMessageAndSave(request.owner(), request.content());
+        }
     }
 }

From 60b6bdb8d8c031da57d95f4dd1a9e3005d50df35 Mon Sep 17 00:00:00 2001
From: dlswns2480 <dlswns2480@naver.com>
Date: Wed, 10 Jan 2024 15:06:07 +0900
Subject: [PATCH 03/14] =?UTF-8?q?feat=20:=20=EC=98=88=EC=95=BD=20=EB=93=B1?=
 =?UTF-8?q?=EB=A1=9D=20=EC=8B=9C=20=EC=95=8C=EB=A6=BC=20=EC=A0=84=EC=86=A1?=
 =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../service/MemberReservationService.java            | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java b/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
index ee07abdc..18b42aab 100644
--- a/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
+++ b/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
@@ -4,6 +4,7 @@
 import static com.prgrms.catchtable.common.exception.ErrorCode.ALREADY_PREOCCUPIED_RESERVATION_TIME;
 import static com.prgrms.catchtable.common.exception.ErrorCode.NOT_EXIST_RESERVATION;
 import static com.prgrms.catchtable.common.exception.ErrorCode.NOT_EXIST_TIME;
+import static com.prgrms.catchtable.common.notification.NotificationContent.*;
 import static com.prgrms.catchtable.reservation.domain.ReservationStatus.CANCELLED;
 import static com.prgrms.catchtable.reservation.domain.ReservationStatus.COMPLETED;
 import static com.prgrms.catchtable.reservation.dto.mapper.ReservationMapper.toCancelReservationResponse;
@@ -13,7 +14,9 @@
 
 import com.prgrms.catchtable.common.exception.custom.BadRequestCustomException;
 import com.prgrms.catchtable.common.exception.custom.NotFoundCustomException;
+import com.prgrms.catchtable.common.notification.NotificationContent;
 import com.prgrms.catchtable.member.domain.Member;
+import com.prgrms.catchtable.notification.dto.request.SendMessageToMemberRequest;
 import com.prgrms.catchtable.reservation.domain.Reservation;
 import com.prgrms.catchtable.reservation.domain.ReservationTime;
 import com.prgrms.catchtable.reservation.dto.mapper.ReservationMapper;
@@ -29,6 +32,7 @@
 import com.prgrms.catchtable.shop.domain.Shop;
 import java.util.List;
 import lombok.RequiredArgsConstructor;
+import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -40,6 +44,7 @@ public class MemberReservationService {
     private final ReservationRepository reservationRepository;
     private final ReservationAsync reservationAsync;
     private final ReservationLockRepository reservationLockRepository;
+    private final ApplicationEventPublisher publisher;
 
     @Transactional
     public CreateReservationResponse preOccupyReservation(Member member,
@@ -91,6 +96,13 @@ public CreateReservationResponse registerReservation(Member member,
             .member(member)
             .build();
         Reservation savedReservation = reservationRepository.save(reservation);
+
+        SendMessageToMemberRequest sendMessage = new SendMessageToMemberRequest(
+            member,
+            RESERVATION_COMPLETED
+        );
+
+        publisher.publishEvent(sendMessage);
         return toCreateReservationResponse(savedReservation);
     }
 

From 67ccba1b96bc447780d04c26766e20bc35801d52 Mon Sep 17 00:00:00 2001
From: dlswns2480 <dlswns2480@naver.com>
Date: Wed, 10 Jan 2024 17:48:41 +0900
Subject: [PATCH 04/14] =?UTF-8?q?feat=20:=20shop=EC=9D=84=20=ED=86=B5?=
 =?UTF-8?q?=ED=95=B4=20=EC=A0=90=EC=A3=BC=20=EC=A1=B0=ED=9A=8C=20=EC=BF=BC?=
 =?UTF-8?q?=EB=A6=AC=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4?=
 =?UTF-8?q?=ED=8A=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../owner/repository/OwnerRepository.java     |  3 ++
 .../owner/repository/OwnerRepositoryTest.java | 38 +++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 src/test/java/com/prgrms/catchtable/owner/repository/OwnerRepositoryTest.java

diff --git a/src/main/java/com/prgrms/catchtable/owner/repository/OwnerRepository.java b/src/main/java/com/prgrms/catchtable/owner/repository/OwnerRepository.java
index 5e783c0e..26443879 100644
--- a/src/main/java/com/prgrms/catchtable/owner/repository/OwnerRepository.java
+++ b/src/main/java/com/prgrms/catchtable/owner/repository/OwnerRepository.java
@@ -1,6 +1,7 @@
 package com.prgrms.catchtable.owner.repository;
 
 import com.prgrms.catchtable.owner.domain.Owner;
+import com.prgrms.catchtable.shop.domain.Shop;
 import java.util.Optional;
 import org.springframework.data.jpa.repository.JpaRepository;
 
@@ -10,4 +11,6 @@ public interface OwnerRepository extends JpaRepository<Owner, Long> {
 
     Optional<Owner> findOwnerByEmail(String email);
 
+    Optional<Owner> findOwnerByShop(Shop shop);
+
 }
diff --git a/src/test/java/com/prgrms/catchtable/owner/repository/OwnerRepositoryTest.java b/src/test/java/com/prgrms/catchtable/owner/repository/OwnerRepositoryTest.java
new file mode 100644
index 00000000..fd62b110
--- /dev/null
+++ b/src/test/java/com/prgrms/catchtable/owner/repository/OwnerRepositoryTest.java
@@ -0,0 +1,38 @@
+package com.prgrms.catchtable.owner.repository;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace.NONE;
+
+import com.prgrms.catchtable.owner.domain.Owner;
+import com.prgrms.catchtable.owner.fixture.OwnerFixture;
+import com.prgrms.catchtable.shop.domain.Shop;
+import com.prgrms.catchtable.shop.fixture.ShopFixture;
+import com.prgrms.catchtable.shop.repository.ShopRepository;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+
+@DataJpaTest
+@AutoConfigureTestDatabase(replace = NONE)
+class OwnerRepositoryTest {
+    @Autowired
+    private OwnerRepository ownerRepository;
+    @Autowired
+    private ShopRepository shopRepository;
+
+    @Test
+    @DisplayName("매장을 통해 점주를 찾을 수 있다")
+    void findByShop(){
+        Shop shop = ShopFixture.shop();
+        Shop savedShop = shopRepository.save(shop);
+
+        Owner owner = OwnerFixture.getOwner(savedShop);
+        Owner savedOwner = ownerRepository.save(owner);
+
+        Owner findOwner = ownerRepository.findOwnerByShop(savedShop).orElseThrow();
+
+        assertThat(findOwner).isEqualTo(savedOwner);
+    }
+}
\ No newline at end of file

From edf5848d7afa16d40365e6473fadffc65c6b0243 Mon Sep 17 00:00:00 2001
From: dlswns2480 <dlswns2480@naver.com>
Date: Wed, 10 Jan 2024 17:49:30 +0900
Subject: [PATCH 05/14] =?UTF-8?q?feat=20:=20NotificationContent=20Function?=
 =?UTF-8?q?=ED=99=9C=EC=9A=A9=ED=95=B4=20=EC=95=8C=EB=A6=BC=20=EB=A9=94?=
 =?UTF-8?q?=EC=84=B8=EC=A7=80=20=EB=A6=AC=ED=84=B4=ED=95=98=EB=8A=94=20?=
 =?UTF-8?q?=EA=B2=83=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95=20(=EC=8B=9C?=
 =?UTF-8?q?=EA=B0=84=20=EB=B0=9B=EC=95=84=EC=84=9C=20=ED=95=B4=EB=8B=B9=20?=
 =?UTF-8?q?=EC=8B=9C=EA=B0=84=EB=8C=80=20=EA=B4=80=EB=A0=A8=EB=90=9C=20?=
 =?UTF-8?q?=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=83=9D=EC=84=B1)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../notification/NotificationContent.java     | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/src/main/java/com/prgrms/catchtable/common/notification/NotificationContent.java b/src/main/java/com/prgrms/catchtable/common/notification/NotificationContent.java
index 54b616eb..0f612ade 100644
--- a/src/main/java/com/prgrms/catchtable/common/notification/NotificationContent.java
+++ b/src/main/java/com/prgrms/catchtable/common/notification/NotificationContent.java
@@ -1,20 +1,23 @@
 package com.prgrms.catchtable.common.notification;
 
+import java.util.function.BiFunction;
+import java.util.function.Function;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 
 @RequiredArgsConstructor
 @Getter
 public enum NotificationContent {
-    RESERVATION_COMPLETED("예약이 완료되었습니다"),
-    RESERVATION_ONE_HOUR_LEFT("예약 시간 1시간 전입니다."),
-    RESERVATION_TIME_TO_ENTER("예약시간이 되었습니다"),
-    WAITING_REGISTER_COMPLETED("웨이팅 등록이 완료되었습니다"),
-    WAITING_RANK_THIRD("웨이팅 순서가 3번째가 되었습니다"),
-    WAITING_TIME_TO_ENTER("웨이팅이 끝났습니다. 입장 부탁드립니다."),
-    WAITING_CANCELLED_AUTOMATICALLY("웨이팅이 자동으로 취소되었습니다.");
+    RESERVATION_COMPLETED(time -> time.concat(" 시간의 예약이 완료 되었습니다.")),
+    RESERVATION_CANCELLED(time -> time.concat(" 시간의 예약이 취소 되었습니다")),
+    RESERVATION_ONE_HOUR_LEFT(time -> time.concat(" 시간 예약까지 한시간 남았습니다")),
+    RESERVATION_TIME_OUT(time -> "예약 시간이 되었습니다. 입장해주세요.");
 
-    private final String message;
 
+    private final Function<String, String> expression;
+
+    public String apply(String time){
+        return expression.apply(time);
+    }
 
 }

From 32da933e664dc82d6a06eb9b6de9b6c94425e6ac Mon Sep 17 00:00:00 2001
From: dlswns2480 <dlswns2480@naver.com>
Date: Wed, 10 Jan 2024 17:50:12 +0900
Subject: [PATCH 06/14] =?UTF-8?q?feat=20:=20=EC=95=8C=EB=A6=BC=20=EB=82=B4?=
 =?UTF-8?q?=EC=9A=A9=20String=20=EC=9D=B8=EC=9E=90=20=EB=B0=9B=EB=8A=94=20?=
 =?UTF-8?q?=EA=B2=83=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../dto/request/SendMessageToMemberRequest.java           | 2 +-
 .../dto/request/SendMessageToOwnerRequest.java            | 2 +-
 .../notification/service/NotificationService.java         | 8 ++++----
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/main/java/com/prgrms/catchtable/notification/dto/request/SendMessageToMemberRequest.java b/src/main/java/com/prgrms/catchtable/notification/dto/request/SendMessageToMemberRequest.java
index 4e9fb6f7..71c977cd 100644
--- a/src/main/java/com/prgrms/catchtable/notification/dto/request/SendMessageToMemberRequest.java
+++ b/src/main/java/com/prgrms/catchtable/notification/dto/request/SendMessageToMemberRequest.java
@@ -6,6 +6,6 @@
 
 @Builder
 public record SendMessageToMemberRequest(Member member,
-                                         NotificationContent content) {
+                                         String content) {
 
 }
diff --git a/src/main/java/com/prgrms/catchtable/notification/dto/request/SendMessageToOwnerRequest.java b/src/main/java/com/prgrms/catchtable/notification/dto/request/SendMessageToOwnerRequest.java
index ae80ddef..9e0cefba 100644
--- a/src/main/java/com/prgrms/catchtable/notification/dto/request/SendMessageToOwnerRequest.java
+++ b/src/main/java/com/prgrms/catchtable/notification/dto/request/SendMessageToOwnerRequest.java
@@ -6,6 +6,6 @@
 
 @Builder
 public record SendMessageToOwnerRequest(Owner owner,
-                                        NotificationContent content) {
+                                        String content) {
 
 }
diff --git a/src/main/java/com/prgrms/catchtable/notification/service/NotificationService.java b/src/main/java/com/prgrms/catchtable/notification/service/NotificationService.java
index 5e298cd1..f6601caa 100644
--- a/src/main/java/com/prgrms/catchtable/notification/service/NotificationService.java
+++ b/src/main/java/com/prgrms/catchtable/notification/service/NotificationService.java
@@ -38,11 +38,11 @@ public class NotificationService {
     private final OwnerRepository ownerRepository; // 추후 삭제 예정
     private JSONObject jsonObject;
 
-    public void sendMessageAndSave(Member member, NotificationContent content) {
+    public void sendMessageAndSave(Member member, String content) {
         String url = "https://slack.com/api/chat.postMessage"; // slack 메세지를 보내도록 요청하는 Slack API
 
         String email = member.getEmail();
-        String message = content.getMessage();
+        String message = content;
         String slackId = getSlackIdByEmail(email); // 이메일을 통해 사용자의 슬랙 고유 ID 추출
 
         requestToSendMessage(slackId, message); // 알림 요청 보내는 함수 호출
@@ -56,11 +56,11 @@ public void sendMessageAndSave(Member member, NotificationContent content) {
 
     }
 
-    public void sendMessageAndSave(Owner owner, NotificationContent content) {
+    public void sendMessageAndSave(Owner owner, String content) {
         String url = "https://slack.com/api/chat.postMessage"; // slack 메세지를 보내도록 요청하는 Slack API
 
         String email = owner.getEmail();
-        String message = content.getMessage();
+        String message = content;
         String slackId = getSlackIdByEmail(email);
 
         requestToSendMessage(slackId, message);

From 07b872063cdffc48c453e5150bd97628264e0b18 Mon Sep 17 00:00:00 2001
From: dlswns2480 <dlswns2480@naver.com>
Date: Wed, 10 Jan 2024 17:50:34 +0900
Subject: [PATCH 07/14] =?UTF-8?q?feat=20:=20=EC=95=8C=EB=A6=BC=20=EB=B3=B4?=
 =?UTF-8?q?=EB=82=B4=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80(?=
 =?UTF-8?q?=EC=98=88=EC=95=BD=20=EB=93=B1=EB=A1=9D,=20=EC=B7=A8=EC=86=8C)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../service/MemberReservationService.java     | 35 +++++++++++++++----
 1 file changed, 29 insertions(+), 6 deletions(-)

diff --git a/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java b/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
index 18b42aab..4eb3dd53 100644
--- a/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
+++ b/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
@@ -2,9 +2,11 @@
 
 import static com.prgrms.catchtable.common.exception.ErrorCode.ALREADY_OCCUPIED_RESERVATION_TIME;
 import static com.prgrms.catchtable.common.exception.ErrorCode.ALREADY_PREOCCUPIED_RESERVATION_TIME;
+import static com.prgrms.catchtable.common.exception.ErrorCode.NOT_EXIST_OWNER;
 import static com.prgrms.catchtable.common.exception.ErrorCode.NOT_EXIST_RESERVATION;
 import static com.prgrms.catchtable.common.exception.ErrorCode.NOT_EXIST_TIME;
-import static com.prgrms.catchtable.common.notification.NotificationContent.*;
+import static com.prgrms.catchtable.common.notification.NotificationContent.RESERVATION_CANCELLED;
+import static com.prgrms.catchtable.common.notification.NotificationContent.RESERVATION_COMPLETED;
 import static com.prgrms.catchtable.reservation.domain.ReservationStatus.CANCELLED;
 import static com.prgrms.catchtable.reservation.domain.ReservationStatus.COMPLETED;
 import static com.prgrms.catchtable.reservation.dto.mapper.ReservationMapper.toCancelReservationResponse;
@@ -14,9 +16,11 @@
 
 import com.prgrms.catchtable.common.exception.custom.BadRequestCustomException;
 import com.prgrms.catchtable.common.exception.custom.NotFoundCustomException;
-import com.prgrms.catchtable.common.notification.NotificationContent;
 import com.prgrms.catchtable.member.domain.Member;
 import com.prgrms.catchtable.notification.dto.request.SendMessageToMemberRequest;
+import com.prgrms.catchtable.notification.dto.request.SendMessageToOwnerRequest;
+import com.prgrms.catchtable.owner.domain.Owner;
+import com.prgrms.catchtable.owner.repository.OwnerRepository;
 import com.prgrms.catchtable.reservation.domain.Reservation;
 import com.prgrms.catchtable.reservation.domain.ReservationTime;
 import com.prgrms.catchtable.reservation.dto.mapper.ReservationMapper;
@@ -44,6 +48,7 @@ public class MemberReservationService {
     private final ReservationRepository reservationRepository;
     private final ReservationAsync reservationAsync;
     private final ReservationLockRepository reservationLockRepository;
+    private final OwnerRepository ownerRepository;
     private final ApplicationEventPublisher publisher;
 
     @Transactional
@@ -97,12 +102,22 @@ public CreateReservationResponse registerReservation(Member member,
             .build();
         Reservation savedReservation = reservationRepository.save(reservation);
 
-        SendMessageToMemberRequest sendMessage = new SendMessageToMemberRequest(
+        Owner owner = ownerRepository.findOwnerByShop(reservationTime.getShop())
+            .orElseThrow(() -> new NotFoundCustomException(NOT_EXIST_OWNER));
+
+        SendMessageToMemberRequest sendMessageToMember = new SendMessageToMemberRequest(
             member,
-            RESERVATION_COMPLETED
-        );
+            RESERVATION_COMPLETED.apply(reservationTime.getTime().toString())
+        ); // 회원에게 보낼 해당 시간대의 예약 완료 알림 생성
+
+        SendMessageToOwnerRequest sendMessageToOwner = new SendMessageToOwnerRequest(
+            owner,
+            RESERVATION_COMPLETED.apply(reservationTime.getTime().toString())
+        ); // 점주에게 보낼 보낼 해당 시간대의 예약 완료 알림 생성
+
+        publisher.publishEvent(sendMessageToMember); // 회원에게 예약등록 알림 발송
+        publisher.publishEvent(sendMessageToOwner); // 점주에게 예약등록 알림 발송
 
-        publisher.publishEvent(sendMessage);
         return toCreateReservationResponse(savedReservation);
     }
 
@@ -152,6 +167,14 @@ public CancelReservationResponse cancelReservation(Long reservationId) {
 
         reservationTime.setOccupiedFalse();
 
+        Owner owner = ownerRepository.findOwnerByShop(reservationTime.getShop())
+            .orElseThrow(() -> new NotFoundCustomException(NOT_EXIST_OWNER));
+
+        SendMessageToOwnerRequest sendMessageToOwner = new SendMessageToOwnerRequest(owner,
+            RESERVATION_CANCELLED.apply(reservationTime.getTime().toString())); // 해당 시간의 예약 취소 메세지 dto 생성
+
+        publisher.publishEvent(sendMessageToOwner); // 취소한 예약의 매장 점주에게 예약 취소 알림 발송
+
         return toCancelReservationResponse(reservation);
     }
 

From 4f64b6adce7a574546a0bec057fa1fd08b545091 Mon Sep 17 00:00:00 2001
From: dlswns2480 <dlswns2480@naver.com>
Date: Wed, 10 Jan 2024 17:51:07 +0900
Subject: [PATCH 08/14] =?UTF-8?q?style=20:=20=EC=BD=94=EB=93=9C=20?=
 =?UTF-8?q?=ED=8F=AC=EB=A7=B7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../catchtable/common/notification/NotificationContent.java   | 3 +--
 .../catchtable/common/notification/NotificationEvent.java     | 4 ++--
 .../notification/dto/request/SendMessageToMemberRequest.java  | 1 -
 .../notification/dto/request/SendMessageToOwnerRequest.java   | 1 -
 .../catchtable/notification/service/NotificationService.java  | 1 -
 .../reservation/service/MemberReservationService.java         | 3 ++-
 .../catchtable/owner/repository/OwnerRepositoryTest.java      | 3 ++-
 .../controller/MemberReservationControllerTest.java           | 1 -
 8 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/src/main/java/com/prgrms/catchtable/common/notification/NotificationContent.java b/src/main/java/com/prgrms/catchtable/common/notification/NotificationContent.java
index 0f612ade..6d63e0ec 100644
--- a/src/main/java/com/prgrms/catchtable/common/notification/NotificationContent.java
+++ b/src/main/java/com/prgrms/catchtable/common/notification/NotificationContent.java
@@ -1,6 +1,5 @@
 package com.prgrms.catchtable.common.notification;
 
-import java.util.function.BiFunction;
 import java.util.function.Function;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
@@ -16,7 +15,7 @@ public enum NotificationContent {
 
     private final Function<String, String> expression;
 
-    public String apply(String time){
+    public String apply(String time) {
         return expression.apply(time);
     }
 
diff --git a/src/main/java/com/prgrms/catchtable/common/notification/NotificationEvent.java b/src/main/java/com/prgrms/catchtable/common/notification/NotificationEvent.java
index 5ff260cf..e8254a04 100644
--- a/src/main/java/com/prgrms/catchtable/common/notification/NotificationEvent.java
+++ b/src/main/java/com/prgrms/catchtable/common/notification/NotificationEvent.java
@@ -22,7 +22,7 @@ public class NotificationEvent {
     @TransactionalEventListener(phase = AFTER_COMMIT) // 호출한쪽의 트랜잭션이 커밋 된 후 이벤트 발생
     public void sendMessage(SendMessageToMemberRequest request) {
         Member member = request.member();
-        if(member.isNotification_activated()){
+        if (member.isNotification_activated()) {
             notificationService.sendMessageAndSave(member, request.content());
         }
     }
@@ -31,7 +31,7 @@ public void sendMessage(SendMessageToMemberRequest request) {
     @TransactionalEventListener(phase = AFTER_COMMIT) // 호출한쪽의 트랜잭션이 커밋 된 후 이벤트 발생
     public void sendMessage(SendMessageToOwnerRequest request) {
         Owner owner = request.owner();
-        if(owner.isNotification_activated()){
+        if (owner.isNotification_activated()) {
             notificationService.sendMessageAndSave(request.owner(), request.content());
         }
     }
diff --git a/src/main/java/com/prgrms/catchtable/notification/dto/request/SendMessageToMemberRequest.java b/src/main/java/com/prgrms/catchtable/notification/dto/request/SendMessageToMemberRequest.java
index 71c977cd..53fc5072 100644
--- a/src/main/java/com/prgrms/catchtable/notification/dto/request/SendMessageToMemberRequest.java
+++ b/src/main/java/com/prgrms/catchtable/notification/dto/request/SendMessageToMemberRequest.java
@@ -1,6 +1,5 @@
 package com.prgrms.catchtable.notification.dto.request;
 
-import com.prgrms.catchtable.common.notification.NotificationContent;
 import com.prgrms.catchtable.member.domain.Member;
 import lombok.Builder;
 
diff --git a/src/main/java/com/prgrms/catchtable/notification/dto/request/SendMessageToOwnerRequest.java b/src/main/java/com/prgrms/catchtable/notification/dto/request/SendMessageToOwnerRequest.java
index 9e0cefba..e6e0e42e 100644
--- a/src/main/java/com/prgrms/catchtable/notification/dto/request/SendMessageToOwnerRequest.java
+++ b/src/main/java/com/prgrms/catchtable/notification/dto/request/SendMessageToOwnerRequest.java
@@ -1,6 +1,5 @@
 package com.prgrms.catchtable.notification.dto.request;
 
-import com.prgrms.catchtable.common.notification.NotificationContent;
 import com.prgrms.catchtable.owner.domain.Owner;
 import lombok.Builder;
 
diff --git a/src/main/java/com/prgrms/catchtable/notification/service/NotificationService.java b/src/main/java/com/prgrms/catchtable/notification/service/NotificationService.java
index f6601caa..2d5a8bb3 100644
--- a/src/main/java/com/prgrms/catchtable/notification/service/NotificationService.java
+++ b/src/main/java/com/prgrms/catchtable/notification/service/NotificationService.java
@@ -5,7 +5,6 @@
 import static org.springframework.http.HttpMethod.POST;
 
 import com.prgrms.catchtable.common.exception.custom.BadRequestCustomException;
-import com.prgrms.catchtable.common.notification.NotificationContent;
 import com.prgrms.catchtable.member.domain.Member;
 import com.prgrms.catchtable.member.repository.MemberRepository;
 import com.prgrms.catchtable.notification.domain.NotificationMember;
diff --git a/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java b/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
index 4eb3dd53..15cc3a37 100644
--- a/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
+++ b/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
@@ -171,7 +171,8 @@ public CancelReservationResponse cancelReservation(Long reservationId) {
             .orElseThrow(() -> new NotFoundCustomException(NOT_EXIST_OWNER));
 
         SendMessageToOwnerRequest sendMessageToOwner = new SendMessageToOwnerRequest(owner,
-            RESERVATION_CANCELLED.apply(reservationTime.getTime().toString())); // 해당 시간의 예약 취소 메세지 dto 생성
+            RESERVATION_CANCELLED.apply(
+                reservationTime.getTime().toString())); // 해당 시간의 예약 취소 메세지 dto 생성
 
         publisher.publishEvent(sendMessageToOwner); // 취소한 예약의 매장 점주에게 예약 취소 알림 발송
 
diff --git a/src/test/java/com/prgrms/catchtable/owner/repository/OwnerRepositoryTest.java b/src/test/java/com/prgrms/catchtable/owner/repository/OwnerRepositoryTest.java
index fd62b110..d201f730 100644
--- a/src/test/java/com/prgrms/catchtable/owner/repository/OwnerRepositoryTest.java
+++ b/src/test/java/com/prgrms/catchtable/owner/repository/OwnerRepositoryTest.java
@@ -17,6 +17,7 @@
 @DataJpaTest
 @AutoConfigureTestDatabase(replace = NONE)
 class OwnerRepositoryTest {
+
     @Autowired
     private OwnerRepository ownerRepository;
     @Autowired
@@ -24,7 +25,7 @@ class OwnerRepositoryTest {
 
     @Test
     @DisplayName("매장을 통해 점주를 찾을 수 있다")
-    void findByShop(){
+    void findByShop() {
         Shop shop = ShopFixture.shop();
         Shop savedShop = shopRepository.save(shop);
 
diff --git a/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerTest.java b/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerTest.java
index e9f0e0a2..9e7916cb 100644
--- a/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerTest.java
+++ b/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerTest.java
@@ -54,7 +54,6 @@ void setUp() {
         Shop shop = ShopData.getShop();
         Shop savedShop = shopRepository.save(shop);
 
-
         Member savedMember = memberRepository.save(member);
 
         ReservationTime reservationTime = ReservationFixture.getReservationTimeNotPreOccupied();

From 6ced9aa62dba5ed161aa96ae0c56cb16b8f53aea Mon Sep 17 00:00:00 2001
From: dlswns2480 <dlswns2480@naver.com>
Date: Wed, 10 Jan 2024 19:21:49 +0900
Subject: [PATCH 09/14] =?UTF-8?q?fix=20:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?=
 =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../service/MemberReservationService.java      |  2 +-
 .../owner/repository/OwnerRepositoryTest.java  |  3 ++-
 .../MemberReservationControllerTest.java       | 15 +++++++++++++++
 .../service/MemberReservationServiceTest.java  | 18 +++++++++++++++---
 4 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java b/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
index 15cc3a37..1ba62f3c 100644
--- a/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
+++ b/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
@@ -62,7 +62,7 @@ public CreateReservationResponse preOccupyReservation(Member member,
                 Thread.currentThread().interrupt();
             }
         }
-        ReservationTime reservationTime = reservationTimeRepository.findById(reservationTimeId)
+        ReservationTime reservationTime = reservationTimeRepository.findByIdWithShop(reservationTimeId)
             .orElseThrow(() -> {
                     reservationLockRepository.unlock(reservationTimeId);
                     return new NotFoundCustomException(NOT_EXIST_TIME);
diff --git a/src/test/java/com/prgrms/catchtable/owner/repository/OwnerRepositoryTest.java b/src/test/java/com/prgrms/catchtable/owner/repository/OwnerRepositoryTest.java
index d201f730..6aae1a1f 100644
--- a/src/test/java/com/prgrms/catchtable/owner/repository/OwnerRepositoryTest.java
+++ b/src/test/java/com/prgrms/catchtable/owner/repository/OwnerRepositoryTest.java
@@ -29,7 +29,8 @@ void findByShop() {
         Shop shop = ShopFixture.shop();
         Shop savedShop = shopRepository.save(shop);
 
-        Owner owner = OwnerFixture.getOwner(savedShop);
+        Owner owner = OwnerFixture.getOwner("injun", "injun2480");
+        owner.insertShop(savedShop);
         Owner savedOwner = ownerRepository.save(owner);
 
         Owner findOwner = ownerRepository.findOwnerByShop(savedShop).orElseThrow();
diff --git a/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerTest.java b/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerTest.java
index 9e7916cb..72a0d97d 100644
--- a/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerTest.java
+++ b/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerTest.java
@@ -18,6 +18,9 @@
 import com.prgrms.catchtable.member.MemberFixture;
 import com.prgrms.catchtable.member.domain.Member;
 import com.prgrms.catchtable.member.repository.MemberRepository;
+import com.prgrms.catchtable.owner.domain.Owner;
+import com.prgrms.catchtable.owner.fixture.OwnerFixture;
+import com.prgrms.catchtable.owner.repository.OwnerRepository;
 import com.prgrms.catchtable.reservation.domain.Reservation;
 import com.prgrms.catchtable.reservation.domain.ReservationTime;
 import com.prgrms.catchtable.reservation.dto.request.CreateReservationRequest;
@@ -28,6 +31,7 @@
 import com.prgrms.catchtable.shop.domain.Shop;
 import com.prgrms.catchtable.shop.repository.ShopRepository;
 import java.util.List;
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.DisplayName;
@@ -47,6 +51,8 @@ class MemberReservationControllerTest extends BaseIntegrationTest {
     private ReservationRepository reservationRepository;
     @Autowired
     private MemberRepository memberRepository;
+    @Autowired
+    private OwnerRepository ownerRepository;
     private Member member = MemberFixture.member("dlswns661035@gmail.com");
 
     @BeforeEach
@@ -54,6 +60,10 @@ void setUp() {
         Shop shop = ShopData.getShop();
         Shop savedShop = shopRepository.save(shop);
 
+        Owner owner = OwnerFixture.getOwner("injun", "injun2480");
+        owner.insertShop(savedShop);
+        ownerRepository.save(owner);
+
         Member savedMember = memberRepository.save(member);
 
         ReservationTime reservationTime = ReservationFixture.getReservationTimeNotPreOccupied();
@@ -65,6 +75,11 @@ void setUp() {
         httpHeaders.add("RefreshToken", token.getRefreshToken());
     }
 
+    @AfterEach
+    void tearDown(){
+        shopRepository.deleteAll();
+    }
+
     @Test
     @DisplayName("예약 선점 api 호출에 성공한다.")
     void preOccupyReservation() throws Exception {
diff --git a/src/test/java/com/prgrms/catchtable/reservation/service/MemberReservationServiceTest.java b/src/test/java/com/prgrms/catchtable/reservation/service/MemberReservationServiceTest.java
index cf3ead87..3eb25ac9 100644
--- a/src/test/java/com/prgrms/catchtable/reservation/service/MemberReservationServiceTest.java
+++ b/src/test/java/com/prgrms/catchtable/reservation/service/MemberReservationServiceTest.java
@@ -15,6 +15,9 @@
 import com.prgrms.catchtable.common.exception.custom.NotFoundCustomException;
 import com.prgrms.catchtable.member.MemberFixture;
 import com.prgrms.catchtable.member.domain.Member;
+import com.prgrms.catchtable.owner.domain.Owner;
+import com.prgrms.catchtable.owner.fixture.OwnerFixture;
+import com.prgrms.catchtable.owner.repository.OwnerRepository;
 import com.prgrms.catchtable.reservation.domain.Reservation;
 import com.prgrms.catchtable.reservation.domain.ReservationTime;
 import com.prgrms.catchtable.reservation.dto.request.CreateReservationRequest;
@@ -36,6 +39,7 @@
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.test.util.ReflectionTestUtils;
 
 @ExtendWith(MockitoExtension.class)
@@ -49,6 +53,10 @@ class MemberReservationServiceTest {
     private ReservationAsync reservationAsync;
     @Mock
     private ReservationTimeRepository reservationTimeRepository;
+    @Mock
+    private OwnerRepository ownerRepository;
+    @Mock
+    private ApplicationEventPublisher publisher;
     @InjectMocks
     private MemberReservationService memberReservationService;
     private final String email = "dlswns661035@gmail.com";
@@ -63,7 +71,7 @@ void validateReservation() {
         CreateReservationRequest request = ReservationFixture.getCreateReservationRequestWithId(
             reservationTime.getId());
 
-        when(reservationTimeRepository.findById(1L)).thenReturn(Optional.of(reservationTime));
+        when(reservationTimeRepository.findByIdWithShop(1L)).thenReturn(Optional.of(reservationTime));
         when(reservationLockRepository.lock(1L)).thenReturn(TRUE);
         when(reservationLockRepository.unlock(1L)).thenReturn(TRUE);
         doNothing().when(reservationAsync).setPreOcuppied(reservationTime);
@@ -91,7 +99,7 @@ void alreadyPreOccupied() {
         CreateReservationRequest request = ReservationFixture.getCreateReservationRequestWithId(
             reservationTime.getId());
 
-        when(reservationTimeRepository.findById(1L)).thenReturn(Optional.of(reservationTime));
+        when(reservationTimeRepository.findByIdWithShop(1L)).thenReturn(Optional.of(reservationTime));
         when(reservationLockRepository.lock(1L)).thenReturn(TRUE);
 
         //when
@@ -106,6 +114,7 @@ void alreadyPreOccupied() {
     void registerReservation() {
         Member member = MemberFixture.member(email);
         ReservationTime reservationTime = ReservationFixture.getReservationTimePreOccupied();
+        Owner owner = OwnerFixture.getOwner("dlswns661035@gmail.com", "injun2480");
         CreateReservationRequest request = ReservationFixture.getCreateReservationRequest();
         Reservation reservation = Reservation.builder()
             .status(COMPLETED)
@@ -117,6 +126,8 @@ void registerReservation() {
         when(reservationTimeRepository.findByIdWithShop(any(Long.class))).thenReturn(
             Optional.of(reservationTime));
         when(reservationRepository.save(any(Reservation.class))).thenReturn(reservation);
+        when(ownerRepository.findOwnerByShop(any(Shop.class))).thenReturn(Optional.of(owner));
+//        doNothing().when(publisher.publishEvent(any(Object.class)));
 
         CreateReservationResponse response = memberReservationService.registerReservation(member,
             request);
@@ -265,10 +276,11 @@ void cancelReservation() {
         ModifyReservationRequest request = ReservationFixture.getModifyReservationRequest(1L);
         Reservation reservation = ReservationFixture.getReservation(reservationTime);
         ReflectionTestUtils.setField(reservation, "id", 1L);
+        Owner owner = OwnerFixture.getOwner("dlswns661035@gmail.com", "injun2480");
 
         when(reservationRepository.findByIdWithReservationTimeAndShop(1L)).thenReturn(
             Optional.of(reservation));
-
+        when(ownerRepository.findOwnerByShop(any(Shop.class))).thenReturn(Optional.of(owner));
         //when
         CancelReservationResponse response = memberReservationService.cancelReservation(
             reservation.getId());

From 2c3982e820a65ff61553a4f5174c82c249abbbdb Mon Sep 17 00:00:00 2001
From: dlswns2480 <dlswns2480@naver.com>
Date: Thu, 11 Jan 2024 14:36:16 +0900
Subject: [PATCH 10/14] =?UTF-8?q?feat=20:=20=EC=98=88=EC=95=BD=20=EC=B7=A8?=
 =?UTF-8?q?=EC=86=8C=20api=EC=97=90=20=EB=A9=A4=EB=B2=84=20=EC=B6=94?=
 =?UTF-8?q?=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../reservation/controller/MemberReservationController.java    | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/main/java/com/prgrms/catchtable/reservation/controller/MemberReservationController.java b/src/main/java/com/prgrms/catchtable/reservation/controller/MemberReservationController.java
index 3cbaa1a9..de49cee6 100644
--- a/src/main/java/com/prgrms/catchtable/reservation/controller/MemberReservationController.java
+++ b/src/main/java/com/prgrms/catchtable/reservation/controller/MemberReservationController.java
@@ -52,8 +52,9 @@ public ResponseEntity<ModifyReservationResponse> modifyReservation(
 
     @DeleteMapping("/{reservationId}")
     public ResponseEntity<CancelReservationResponse> cancelReservation(
+        @LogIn Member member,
         @PathVariable("reservationId") Long reservationId) {
-        return ResponseEntity.ok(memberReservationService.cancelReservation(reservationId));
+        return ResponseEntity.ok(memberReservationService.cancelReservation(member, reservationId));
     }
 
     @GetMapping

From 161e00eb5e2455e3ed647754a132eb5c9be9def4 Mon Sep 17 00:00:00 2001
From: dlswns2480 <dlswns2480@naver.com>
Date: Thu, 11 Jan 2024 14:36:52 +0900
Subject: [PATCH 11/14] =?UTF-8?q?feat=20:=20=EC=95=8C=EB=A6=BC=20=EB=B3=B4?=
 =?UTF-8?q?=EB=82=B4=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EB=A9=94=EC=86=8C?=
 =?UTF-8?q?=EB=93=9C=EB=A1=9C=20=EC=B6=94=EC=B6=9C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../service/MemberReservationService.java     | 36 +++++++++----------
 1 file changed, 17 insertions(+), 19 deletions(-)

diff --git a/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java b/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
index 1ba62f3c..c3d19e9a 100644
--- a/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
+++ b/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
@@ -16,6 +16,7 @@
 
 import com.prgrms.catchtable.common.exception.custom.BadRequestCustomException;
 import com.prgrms.catchtable.common.exception.custom.NotFoundCustomException;
+import com.prgrms.catchtable.common.notification.NotificationContent;
 import com.prgrms.catchtable.member.domain.Member;
 import com.prgrms.catchtable.notification.dto.request.SendMessageToMemberRequest;
 import com.prgrms.catchtable.notification.dto.request.SendMessageToOwnerRequest;
@@ -102,21 +103,7 @@ public CreateReservationResponse registerReservation(Member member,
             .build();
         Reservation savedReservation = reservationRepository.save(reservation);
 
-        Owner owner = ownerRepository.findOwnerByShop(reservationTime.getShop())
-            .orElseThrow(() -> new NotFoundCustomException(NOT_EXIST_OWNER));
-
-        SendMessageToMemberRequest sendMessageToMember = new SendMessageToMemberRequest(
-            member,
-            RESERVATION_COMPLETED.apply(reservationTime.getTime().toString())
-        ); // 회원에게 보낼 해당 시간대의 예약 완료 알림 생성
-
-        SendMessageToOwnerRequest sendMessageToOwner = new SendMessageToOwnerRequest(
-            owner,
-            RESERVATION_COMPLETED.apply(reservationTime.getTime().toString())
-        ); // 점주에게 보낼 보낼 해당 시간대의 예약 완료 알림 생성
-
-        publisher.publishEvent(sendMessageToMember); // 회원에게 예약등록 알림 발송
-        publisher.publishEvent(sendMessageToOwner); // 점주에게 예약등록 알림 발송
+        sendMessageToMemberAndOwner(member, reservationTime, RESERVATION_COMPLETED); //점주와 회원에게 알림 발송
 
         return toCreateReservationResponse(savedReservation);
     }
@@ -156,7 +143,7 @@ public ModifyReservationResponse modifyReservation(Long reservavtionId,
     }
 
     @Transactional
-    public CancelReservationResponse cancelReservation(Long reservationId) {
+    public CancelReservationResponse cancelReservation(Member member, Long reservationId) {
         Reservation reservation = reservationRepository.findByIdWithReservationTimeAndShop(
                 reservationId)
             .orElseThrow(() -> new NotFoundCustomException(NOT_EXIST_RESERVATION));
@@ -167,16 +154,27 @@ public CancelReservationResponse cancelReservation(Long reservationId) {
 
         reservationTime.setOccupiedFalse();
 
+        sendMessageToMemberAndOwner(member, reservationTime, RESERVATION_CANCELLED);
+
+        return toCancelReservationResponse(reservation);
+    }
+
+    private void sendMessageToMemberAndOwner(Member member, ReservationTime reservationTime, NotificationContent content) {
+
         Owner owner = ownerRepository.findOwnerByShop(reservationTime.getShop())
             .orElseThrow(() -> new NotFoundCustomException(NOT_EXIST_OWNER));
 
+        SendMessageToMemberRequest sendMessageToMember = new SendMessageToMemberRequest(
+            member,
+            content.apply(reservationTime.getTime().toString())
+        ); // 회원에게 보낼 해당 시간대의 예약 완료 알림 생성
+
         SendMessageToOwnerRequest sendMessageToOwner = new SendMessageToOwnerRequest(owner,
-            RESERVATION_CANCELLED.apply(
+            content.apply(
                 reservationTime.getTime().toString())); // 해당 시간의 예약 취소 메세지 dto 생성
 
+        publisher.publishEvent(sendMessageToMember);
         publisher.publishEvent(sendMessageToOwner); // 취소한 예약의 매장 점주에게 예약 취소 알림 발송
-
-        return toCancelReservationResponse(reservation);
     }
 
     private void validateIsPreOccupied(ReservationTime reservationTime) {

From 8efb45ff0e149471df3a1aa21c44b9e5dbc0c78d Mon Sep 17 00:00:00 2001
From: dlswns2480 <dlswns2480@naver.com>
Date: Thu, 11 Jan 2024 14:37:05 +0900
Subject: [PATCH 12/14] =?UTF-8?q?feat=20:=20=EC=95=8C=EB=A6=BC=20=EB=A1=9C?=
 =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95=EC=97=90=20=EB=94=B0=EB=A5=B8=20?=
 =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../controller/MemberReservationControllerTest.java          | 1 +
 .../reservation/service/MemberReservationServiceTest.java    | 5 ++++-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerTest.java b/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerTest.java
index 72a0d97d..2f5e9014 100644
--- a/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerTest.java
+++ b/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerTest.java
@@ -207,6 +207,7 @@ void cancelReservation() throws Exception {
         Reservation savedReservation = reservationRepository.save(reservation);
 
         mockMvc.perform(delete("/reservations/{reservationId}", savedReservation.getId())
+                .headers(httpHeaders)
                 .contentType(APPLICATION_JSON))
             .andExpect(status().isOk())
             .andExpect(jsonPath("$.status").value(CANCELLED.toString()));
diff --git a/src/test/java/com/prgrms/catchtable/reservation/service/MemberReservationServiceTest.java b/src/test/java/com/prgrms/catchtable/reservation/service/MemberReservationServiceTest.java
index 3eb25ac9..6128a207 100644
--- a/src/test/java/com/prgrms/catchtable/reservation/service/MemberReservationServiceTest.java
+++ b/src/test/java/com/prgrms/catchtable/reservation/service/MemberReservationServiceTest.java
@@ -272,6 +272,7 @@ void modifyReservationOccupied() {
     @DisplayName("예약을 취소할 수 있다")
     void cancelReservation() {
         //given
+        Member member = MemberFixture.member("dlswns661035@gmail.com");
         ReservationTime reservationTime = ReservationFixture.getReservationTimeOccupied();
         ModifyReservationRequest request = ReservationFixture.getModifyReservationRequest(1L);
         Reservation reservation = ReservationFixture.getReservation(reservationTime);
@@ -283,6 +284,7 @@ void cancelReservation() {
         when(ownerRepository.findOwnerByShop(any(Shop.class))).thenReturn(Optional.of(owner));
         //when
         CancelReservationResponse response = memberReservationService.cancelReservation(
+            member,
             reservation.getId());
 
         //then
@@ -297,11 +299,12 @@ void cancelReservation() {
     @Test
     @DisplayName("존재하지 않는 예약에 대한 삭제 요청 시 예외가 발생한다")
     void cancelReservationNotExist() {
+        Member member = MemberFixture.member("asd@gmail.com");
         when(reservationRepository.findByIdWithReservationTimeAndShop(1L)).thenReturn(
             Optional.empty());
 
         assertThrows(NotFoundCustomException.class,
-            () -> memberReservationService.cancelReservation(1L));
+            () -> memberReservationService.cancelReservation(member, 1L));
     }
 
 }
\ No newline at end of file

From 7a0abb161a3059ecfe7dd8a4336f20dc5f6903e2 Mon Sep 17 00:00:00 2001
From: dlswns2480 <dlswns2480@naver.com>
Date: Thu, 11 Jan 2024 14:37:24 +0900
Subject: [PATCH 13/14] =?UTF-8?q?style=20:=20=EC=BD=94=EB=93=9C=20?=
 =?UTF-8?q?=ED=8F=AC=EB=A7=B7=ED=8C=85?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../reservation/service/MemberReservationService.java    | 9 ++++++---
 .../controller/MemberReservationControllerTest.java      | 2 +-
 .../service/MemberReservationServiceTest.java            | 6 ++++--
 3 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java b/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
index c3d19e9a..ef39649b 100644
--- a/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
+++ b/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
@@ -63,7 +63,8 @@ public CreateReservationResponse preOccupyReservation(Member member,
                 Thread.currentThread().interrupt();
             }
         }
-        ReservationTime reservationTime = reservationTimeRepository.findByIdWithShop(reservationTimeId)
+        ReservationTime reservationTime = reservationTimeRepository.findByIdWithShop(
+                reservationTimeId)
             .orElseThrow(() -> {
                     reservationLockRepository.unlock(reservationTimeId);
                     return new NotFoundCustomException(NOT_EXIST_TIME);
@@ -103,7 +104,8 @@ public CreateReservationResponse registerReservation(Member member,
             .build();
         Reservation savedReservation = reservationRepository.save(reservation);
 
-        sendMessageToMemberAndOwner(member, reservationTime, RESERVATION_COMPLETED); //점주와 회원에게 알림 발송
+        sendMessageToMemberAndOwner(member, reservationTime,
+            RESERVATION_COMPLETED); //점주와 회원에게 알림 발송
 
         return toCreateReservationResponse(savedReservation);
     }
@@ -159,7 +161,8 @@ public CancelReservationResponse cancelReservation(Member member, Long reservati
         return toCancelReservationResponse(reservation);
     }
 
-    private void sendMessageToMemberAndOwner(Member member, ReservationTime reservationTime, NotificationContent content) {
+    private void sendMessageToMemberAndOwner(Member member, ReservationTime reservationTime,
+        NotificationContent content) {
 
         Owner owner = ownerRepository.findOwnerByShop(reservationTime.getShop())
             .orElseThrow(() -> new NotFoundCustomException(NOT_EXIST_OWNER));
diff --git a/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerTest.java b/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerTest.java
index 2f5e9014..a4f288f2 100644
--- a/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerTest.java
+++ b/src/test/java/com/prgrms/catchtable/reservation/controller/MemberReservationControllerTest.java
@@ -76,7 +76,7 @@ void setUp() {
     }
 
     @AfterEach
-    void tearDown(){
+    void tearDown() {
         shopRepository.deleteAll();
     }
 
diff --git a/src/test/java/com/prgrms/catchtable/reservation/service/MemberReservationServiceTest.java b/src/test/java/com/prgrms/catchtable/reservation/service/MemberReservationServiceTest.java
index 6128a207..438fe518 100644
--- a/src/test/java/com/prgrms/catchtable/reservation/service/MemberReservationServiceTest.java
+++ b/src/test/java/com/prgrms/catchtable/reservation/service/MemberReservationServiceTest.java
@@ -71,7 +71,8 @@ void validateReservation() {
         CreateReservationRequest request = ReservationFixture.getCreateReservationRequestWithId(
             reservationTime.getId());
 
-        when(reservationTimeRepository.findByIdWithShop(1L)).thenReturn(Optional.of(reservationTime));
+        when(reservationTimeRepository.findByIdWithShop(1L)).thenReturn(
+            Optional.of(reservationTime));
         when(reservationLockRepository.lock(1L)).thenReturn(TRUE);
         when(reservationLockRepository.unlock(1L)).thenReturn(TRUE);
         doNothing().when(reservationAsync).setPreOcuppied(reservationTime);
@@ -99,7 +100,8 @@ void alreadyPreOccupied() {
         CreateReservationRequest request = ReservationFixture.getCreateReservationRequestWithId(
             reservationTime.getId());
 
-        when(reservationTimeRepository.findByIdWithShop(1L)).thenReturn(Optional.of(reservationTime));
+        when(reservationTimeRepository.findByIdWithShop(1L)).thenReturn(
+            Optional.of(reservationTime));
         when(reservationLockRepository.lock(1L)).thenReturn(TRUE);
 
         //when

From ae82272745f9219fcdc6c2fcde9c7350b3fecd98 Mon Sep 17 00:00:00 2001
From: dlswns2480 <dlswns2480@naver.com>
Date: Thu, 11 Jan 2024 14:39:47 +0900
Subject: [PATCH 14/14] =?UTF-8?q?enum=20=ED=91=9C=ED=98=84=EC=8B=9D=20?=
 =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=EB=AA=85=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../catchtable/common/notification/NotificationContent.java   | 2 +-
 .../reservation/service/MemberReservationService.java         | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/prgrms/catchtable/common/notification/NotificationContent.java b/src/main/java/com/prgrms/catchtable/common/notification/NotificationContent.java
index 6d63e0ec..63c028b8 100644
--- a/src/main/java/com/prgrms/catchtable/common/notification/NotificationContent.java
+++ b/src/main/java/com/prgrms/catchtable/common/notification/NotificationContent.java
@@ -15,7 +15,7 @@ public enum NotificationContent {
 
     private final Function<String, String> expression;
 
-    public String apply(String time) {
+    public String getMessage(String time) {
         return expression.apply(time);
     }
 
diff --git a/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java b/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
index ef39649b..f27b601e 100644
--- a/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
+++ b/src/main/java/com/prgrms/catchtable/reservation/service/MemberReservationService.java
@@ -169,11 +169,11 @@ private void sendMessageToMemberAndOwner(Member member, ReservationTime reservat
 
         SendMessageToMemberRequest sendMessageToMember = new SendMessageToMemberRequest(
             member,
-            content.apply(reservationTime.getTime().toString())
+            content.getMessage(reservationTime.getTime().toString())
         ); // 회원에게 보낼 해당 시간대의 예약 완료 알림 생성
 
         SendMessageToOwnerRequest sendMessageToOwner = new SendMessageToOwnerRequest(owner,
-            content.apply(
+            content.getMessage(
                 reservationTime.getTime().toString())); // 해당 시간의 예약 취소 메세지 dto 생성
 
         publisher.publishEvent(sendMessageToMember);