From 4cf2807bcc4ba73bc574935cb231685a5e598326 Mon Sep 17 00:00:00 2001 From: hseong3243 Date: Tue, 13 Aug 2024 20:12:20 +0900 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20=EB=8C=80=EA=B8=B0=EC=97=B4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=B3=B4=EA=B4=80=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20?= =?UTF-8?q?=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 이영민 --- .../thirdparty/ticketing/domain/waitingroom/UserInfo.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/com/thirdparty/ticketing/domain/waitingroom/UserInfo.java diff --git a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/UserInfo.java b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/UserInfo.java new file mode 100644 index 00000000..39a26ff9 --- /dev/null +++ b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/UserInfo.java @@ -0,0 +1,8 @@ +package com.thirdparty.ticketing.domain.waitingroom; + +import lombok.Data; + +@Data +public class UserInfo { + private final String email; +} From 6f77bc865e9cee5b11acf00772866e85c5021074 Mon Sep 17 00:00:00 2001 From: hseong3243 Date: Tue, 13 Aug 2024 20:14:45 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20=EB=8C=80=EA=B8=B0=EC=97=B4=20?= =?UTF-8?q?=EC=B9=B4=EC=9A=B4=ED=84=B0=20=EC=9D=B8=ED=84=B0=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=EB=A5=BC=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 대기열에 보관되는 사용자의 고유한 카운트 값을 반환하는 인터페이스를 정의함. Co-authored-by: 이영민 --- .../ticketing/domain/waitingroom/WaitingCounter.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingCounter.java diff --git a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingCounter.java b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingCounter.java new file mode 100644 index 00000000..d45374db --- /dev/null +++ b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingCounter.java @@ -0,0 +1,9 @@ +package com.thirdparty.ticketing.domain.waitingroom; + +public interface WaitingCounter { + + /** + * @return 사용자에게 부여되는 고유한 카운트를 반환한다. + */ + long getNextCount(); +} From a48c4c2bf407c38cef61557204768bed01de35de Mon Sep 17 00:00:00 2001 From: hseong3243 Date: Tue, 13 Aug 2024 20:15:09 +0900 Subject: [PATCH 3/6] =?UTF-8?q?feat:=20=EB=8C=80=EA=B8=B0=EC=97=B4=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=A0=95?= =?UTF-8?q?=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 이영민 --- .../ticketing/domain/waitingroom/WaitingLine.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingLine.java diff --git a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingLine.java b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingLine.java new file mode 100644 index 00000000..1374de82 --- /dev/null +++ b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingLine.java @@ -0,0 +1,11 @@ +package com.thirdparty.ticketing.domain.waitingroom; + +public interface WaitingLine { + + /** + * 사용자를 대기열에 넣는다. + * @param userInfo 사용자의 정보 + * @param waitingCounter 사용자의 고유한 카운트 값 + */ + void enter(UserInfo userInfo, long waitingCounter); +} From a05b488701703bf63e9d47f4b3ca3d86bcd91a06 Mon Sep 17 00:00:00 2001 From: hseong3243 Date: Tue, 13 Aug 2024 20:21:52 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat:=20=EB=8C=80=EA=B8=B0=EC=97=B4=20?= =?UTF-8?q?=EB=A7=A4=EB=8B=88=EC=A0=80=EB=A5=BC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사용자의 대기 정보를 관리하는 웨이팅 룸과 사용자의 작업 가능 정보를 관리하는 러닝룸을 구현함. 웨이팅 룸과 러닝룸을 사용해 대기열을 관리하는 대기열 매니저를 구현함. Co-authored-by: 이영민 --- .../domain/waitingroom/RunningRoom.java | 5 +++++ .../domain/waitingroom/WaitingManager.java | 18 ++++++++++++++++++ .../domain/waitingroom/WaitingRoom.java | 17 +++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 src/main/java/com/thirdparty/ticketing/domain/waitingroom/RunningRoom.java create mode 100644 src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingManager.java create mode 100644 src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingRoom.java diff --git a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/RunningRoom.java b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/RunningRoom.java new file mode 100644 index 00000000..259cf690 --- /dev/null +++ b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/RunningRoom.java @@ -0,0 +1,5 @@ +package com.thirdparty.ticketing.domain.waitingroom; + +public interface RunningRoom { + boolean contains(UserInfo userInfo); +} diff --git a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingManager.java b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingManager.java new file mode 100644 index 00000000..07e31811 --- /dev/null +++ b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingManager.java @@ -0,0 +1,18 @@ +package com.thirdparty.ticketing.domain.waitingroom; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class WaitingManager { + + private final RunningRoom runningRoom; + private final WaitingRoom waitingRoom; + + public boolean isReadyToHandle(UserInfo userInfo) { + return runningRoom.contains(userInfo); + } + + public long enterWaitingRoom(UserInfo userInfo) { + return waitingRoom.enter(userInfo); + } +} diff --git a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingRoom.java b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingRoom.java new file mode 100644 index 00000000..d650f14c --- /dev/null +++ b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingRoom.java @@ -0,0 +1,17 @@ +package com.thirdparty.ticketing.domain.waitingroom; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public abstract class WaitingRoom { + + private final WaitingLine waitingLine; + private final WaitingCounter waitingCounter; + + /** + * 사용자를 대기열에 넣고, 대기공간에 보관한다. + * @param userInfo 사용자의 정보 + * @return 사용자의 남은 순번을 반환한다. + */ + public abstract long enter(UserInfo userInfo); +} From abf8a536388bb0998074f3d136824c19c7d9510d Mon Sep 17 00:00:00 2001 From: hseong3243 Date: Tue, 13 Aug 2024 20:27:47 +0900 Subject: [PATCH 5/6] =?UTF-8?q?feat:=20=EB=8C=80=EA=B8=B0=EC=97=B4=20?= =?UTF-8?q?=EA=B3=B5=ED=86=B5=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 스프링 aop를 활용하는 대기열 공통 로직을 구현함. Co-authored-by: 이영민 --- .../domain/waitingroom/WaitingAspect.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingAspect.java diff --git a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingAspect.java b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingAspect.java new file mode 100644 index 00000000..9ed180d5 --- /dev/null +++ b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingAspect.java @@ -0,0 +1,26 @@ +package com.thirdparty.ticketing.domain.waitingroom; + +import lombok.RequiredArgsConstructor; +import org.aspectj.lang.ProceedingJoinPoint; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +@RequiredArgsConstructor +public class WaitingAspect { + + private final WaitingManager waitingManager; + + private Object waitingRequest(ProceedingJoinPoint joinPoint) throws Throwable { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String email = (String)authentication.getPrincipal(); + UserInfo userInfo = new UserInfo(email); + if(waitingManager.isReadyToHandle(userInfo)){ + return joinPoint.proceed(); + } else { + long waitingNumber = waitingManager.enterWaitingRoom(userInfo); + return ResponseEntity.status(HttpStatus.TEMPORARY_REDIRECT).body(waitingNumber); + } + } +} From 73e5ea37c5ae537bf619fede07a081c3cba22c5f Mon Sep 17 00:00:00 2001 From: hseong3243 Date: Tue, 13 Aug 2024 20:29:45 +0900 Subject: [PATCH 6/6] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ticketing/domain/waitingroom/WaitingAspect.java | 7 ++++--- .../ticketing/domain/waitingroom/WaitingLine.java | 1 + .../ticketing/domain/waitingroom/WaitingRoom.java | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingAspect.java b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingAspect.java index 9ed180d5..0708c607 100644 --- a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingAspect.java +++ b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingAspect.java @@ -1,12 +1,13 @@ package com.thirdparty.ticketing.domain.waitingroom; -import lombok.RequiredArgsConstructor; import org.aspectj.lang.ProceedingJoinPoint; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; +import lombok.RequiredArgsConstructor; + @RequiredArgsConstructor public class WaitingAspect { @@ -14,9 +15,9 @@ public class WaitingAspect { private Object waitingRequest(ProceedingJoinPoint joinPoint) throws Throwable { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - String email = (String)authentication.getPrincipal(); + String email = (String) authentication.getPrincipal(); UserInfo userInfo = new UserInfo(email); - if(waitingManager.isReadyToHandle(userInfo)){ + if (waitingManager.isReadyToHandle(userInfo)) { return joinPoint.proceed(); } else { long waitingNumber = waitingManager.enterWaitingRoom(userInfo); diff --git a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingLine.java b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingLine.java index 1374de82..dcf007f5 100644 --- a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingLine.java +++ b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingLine.java @@ -4,6 +4,7 @@ public interface WaitingLine { /** * 사용자를 대기열에 넣는다. + * * @param userInfo 사용자의 정보 * @param waitingCounter 사용자의 고유한 카운트 값 */ diff --git a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingRoom.java b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingRoom.java index d650f14c..6580c680 100644 --- a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingRoom.java +++ b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingRoom.java @@ -10,6 +10,7 @@ public abstract class WaitingRoom { /** * 사용자를 대기열에 넣고, 대기공간에 보관한다. + * * @param userInfo 사용자의 정보 * @return 사용자의 남은 순번을 반환한다. */