Skip to content

Conversation

@HyemIin
Copy link
Member

@HyemIin HyemIin commented Jul 18, 2025

작업 요약

  • 사용자 주문 조회 응답 구조 변경
  • redis 기반 사용자 예약 생성 기능 구현

Issue Link

#121

문제점 및 어려움

해결 방안

Reference

Summary by CodeRabbit

  • 신규 기능

    • 주문 항목을 상태별로 그룹화하여 조회할 수 있는 기능이 추가되었습니다.
    • 대기 예약(웨이팅) 기능이 도입되어, 사용자는 매장별로 대기열에 등록하고 자신의 순위와 파티 인원 정보를 확인할 수 있습니다.
    • Redis 기반 대기열 관리가 적용되어, 대기 등록, 순위 조회, 취소 등이 가능합니다.
    • 대기 예약을 위한 새로운 API 엔드포인트가 추가되었습니다.
  • 버그 수정

    • 회원가입 시 닉네임 중복 검증이 제거되었습니다.
  • 기타

    • Redis 연동을 위한 설정이 추가되었습니다.

- 사용자 주문 조회 응답 구조 변경
- redis 기반 사용자 예약 생성 기능 구현
@HyemIin HyemIin self-assigned this Jul 18, 2025
@coderabbitai
Copy link

coderabbitai bot commented Jul 18, 2025

## Walkthrough

이 변경 사항은 Redis 기반 대기열(웨이팅) 기능을 예약 시스템에 추가하며, 주문 항목을 상태별로 그룹화하여 반환하는 API 구조를 도입합니다. 또한, 닉네임 중복 검증 로직 제거, Redis 의존성 및 유틸리티 추가, 관련 DTO/Repository/Service/Controller를 확장 및 신설하는 작업이 포함되어 있습니다.

## Changes

| 파일/경로 요약 | 변경 내용 요약 |
|---|---|
| .../MenuImageService.java | 불필요한 공백 라인 제거(기능 변화 없음) |
| .../UserService.java | 닉네임 중복 검사 메서드 및 호출 제거 |
| .../build.gradle | Redis 연동을 위한 domain-redis 모듈 및 spring-boot-starter-data-redis 의존성 추가 |
| .../order/controller/OrderController.java | 주문 항목 조회 API의 반환 타입을 상태별 그룹화된 DTO로 변경 및 서비스 메서드 호출 변경 |
| .../order/dto/OrderItemGroupByStatusResponseDto.java | 주문 상태별 그룹화 응답 DTO 신설 |
| .../order/dto/OrderItemListGetResponseDto.java | fromEntity 메서드에서 status 필드 세팅 제거 |
| .../order/service/OrderService.java | 주문 항목 조회 메서드를 상태별 그룹화 반환 방식으로 리팩터링 및 메서드명 변경 |
| .../reservation/controller/ReservationController.java | Redis 기반 대기열 등록을 위한 신규 POST 엔드포인트(/reservations/create/redis/{storeId}) 추가 |
| .../reservation/dto/WaitingResponseDto.java | 대기열 응답용 DTO 신설(rank, reserved, partySize 포함) |
| .../reservation/repository/WaitingRedisRepository.java | Redis 기반 대기열 관리 리포지토리 신설(추가, 조회, 삭제 등 메서드 포함) |
| .../reservation/service/ReservationService.java | Redis 대기열 등록/조회/취소 기능 추가 및 WaitingRedisRepository 의존성 주입 |
| .../domaincoreredis/common/util/RedisKeyUtils.java | 대기열 관련 Redis 키 프리픽스 상수 및 getter 메서드 추가 |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant Client
    participant ReservationController
    participant ReservationService
    participant WaitingRedisRepository
    participant Redis

    Client->>ReservationController: POST /reservations/create/redis/{storeId}
    ReservationController->>ReservationService: registerWaiting(storeId, user, requestDto)
    ReservationService->>WaitingRedisRepository: getRank(storeId, userId)
    WaitingRedisRepository->>Redis: ZRANK waiting:{storeId} {userId}
    WaitingRedisRepository-->>ReservationService: rank/null
    alt 신규 등록
        ReservationService->>WaitingRedisRepository: addToWaitingQueue(storeId, userId, partySize, timestamp)
        WaitingRedisRepository->>Redis: ZADD, HSET
        WaitingRedisRepository-->>ReservationService: true/false
        ReservationService->>WaitingRedisRepository: getRank(storeId, userId)
        WaitingRedisRepository->>Redis: ZRANK
        WaitingRedisRepository-->>ReservationService: rank
        ReservationService-->>ReservationController: WaitingResponseDto(rank, false, partySize)
    else 이미 등록됨
        ReservationService-->>ReservationController: throw IllegalArgumentException
    end
    ReservationController-->>Client: HTTP 201 + WaitingResponseDto
sequenceDiagram
    participant Client
    participant OrderController
    participant OrderService

    Client->>OrderController: GET /order-items
    OrderController->>OrderService: getOrderItemsGroupByStatus(storeId, tableId, sessionId)
    OrderService->>OrderService: 주문/주문항목 조회 및 상태별 그룹화
    OrderService-->>OrderController: List<OrderItemGroupByStatusResponseDto>
    OrderController-->>Client: HTTP 200 + 그룹화된 주문 항목 리스트
Loading

Possibly related PRs

Suggested labels

enhancement, refactor


<!-- walkthrough_end -->


---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between d5aae49fcd318890ccdf07bc3d58a5e1de4f99e0 and 6fb5a1c26e0d08b1452cc2656bc66f2fb5b2ecad.

</details>

<details>
<summary>📒 Files selected for processing (3)</summary>

* `nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/controller/ReservationController.java` (2 hunks)
* `nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/repository/WaitingRedisRepository.java` (1 hunks)
* `nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/service/ReservationService.java` (2 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (3)</summary>

* nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/controller/ReservationController.java
* nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/repository/WaitingRedisRepository.java
* nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/service/ReservationService.java

</details>

</details>
<!-- internal state start -->


<!-- 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= -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=GTable/NoWait_BE_MultiModule&utm_content=122):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

@github-actions github-actions bot requested a review from Jjiggu July 18, 2025 08:24
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Nitpick comments (1)
nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/service/ReservationService.java (1)

37-66: 아키텍처 관점에서 이중 저장소 전략에 대한 고려사항

현재 구현에서 데이터베이스 기반 예약 시스템과 Redis 기반 대기열 시스템이 공존하고 있습니다. 다음 사항들을 고려해보세요:

  1. 데이터 일관성: 두 저장소 간 데이터 동기화 전략이 필요합니다.
  2. 비즈니스 로직 분리: 예약 생성 로직이 두 곳에 분산되어 있어 유지보수가 복잡할 수 있습니다.
  3. 장애 처리: Redis 장애 시 대기열 시스템의 fallback 전략이 필요합니다.

다음과 같은 개선 방안을 제안합니다:

  1. 통합 인터페이스: 예약 생성의 진입점을 하나로 통합하여 내부적으로 저장소를 선택하도록 구현
  2. 이벤트 기반 동기화: 도메인 이벤트를 활용하여 두 저장소 간 데이터 동기화
  3. Circuit Breaker 패턴: Redis 장애 시 데이터베이스로 fallback하는 메커니즘 구현

이런 구조적 개선을 통해 시스템의 안정성과 유지보수성을 향상시킬 수 있습니다.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 99e31e2 and d5aae49.

📒 Files selected for processing (12)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/service/MenuImageService.java (0 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/user/serivce/UserService.java (0 hunks)
  • nowait-app-user-api/build.gradle (2 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/controller/OrderController.java (2 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/dto/OrderItemGroupByStatusResponseDto.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/dto/OrderItemListGetResponseDto.java (0 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/service/OrderService.java (2 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/controller/ReservationController.java (2 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/dto/WaitingResponseDto.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/repository/WaitingRedisRepository.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/service/ReservationService.java (2 hunks)
  • nowait-domain/domain-redis/src/main/java/com/nowait/domaincoreredis/common/util/RedisKeyUtils.java (2 hunks)
💤 Files with no reviewable changes (3)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/service/MenuImageService.java
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/user/serivce/UserService.java
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/dto/OrderItemListGetResponseDto.java
🧰 Additional context used
🧬 Code Graph Analysis (1)
nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/dto/OrderItemGroupByStatusResponseDto.java (1)
nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/dto/OrderItemListGetResponseDto.java (1)
  • Getter (12-32)
🔇 Additional comments (12)
nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/dto/OrderItemGroupByStatusResponseDto.java (1)

16-19: 구현이 깔끔하고 목적에 부합합니다.

상태별로 주문 항목을 그룹화하는 DTO 구조가 명확하고 간결합니다. Lombok 어노테이션을 적절히 사용하여 보일러플레이트 코드를 줄였습니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/controller/OrderController.java (2)

16-16: 새로운 DTO 임포트가 적절합니다.

OrderItemGroupByStatusResponseDto 임포트가 새로운 그룹화 기능에 맞게 추가되었습니다.


62-62: 서비스 메서드 호출이 새로운 그룹화 기능에 맞게 업데이트되었습니다.

getOrderItemsGroupByStatus 메서드 호출로 변경되어 상태별 그룹화된 응답을 반환하도록 개선되었습니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/service/OrderService.java (3)

17-17: 새로운 DTO 임포트가 적절합니다.

OrderItemGroupByStatusResponseDto 임포트가 새로운 그룹화 기능에 맞게 추가되었습니다.


97-97: 메서드명 변경이 기능을 명확히 나타냅니다.

getOrderItemsGroupByStatus로 메서드명이 변경되어 상태별 그룹화 기능을 명확히 표현합니다.


107-112: 그룹화 로직이 효율적으로 구현되었습니다.

Map.entrySet().stream()을 사용하여 상태별로 그룹화된 데이터를 OrderItemGroupByStatusResponseDto 리스트로 변환하는 로직이 깔끔하게 구현되었습니다.

nowait-app-user-api/build.gradle (1)

25-25: Redis 의존성 추가가 적절합니다.

Redis 통합을 위한 의존성들이 올바르게 추가되었습니다. 도메인 모듈과 Spring Boot Redis 스타터가 적절히 포함되어 있습니다.

Also applies to: 52-53

nowait-domain/domain-redis/src/main/java/com/nowait/domaincoreredis/common/util/RedisKeyUtils.java (1)

16-18: 대기열 Redis 키 유틸리티가 잘 구현되었습니다.

새로운 Redis 키 상수들이 기존 패턴을 따르고 있으며, 명확한 네이밍 컨벤션을 사용하고 있습니다. Redis 키 구조가 적절하게 설계되어 있습니다.

Also applies to: 41-42

nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/dto/WaitingResponseDto.java (1)

1-12: 잘 설계된 응답 DTO입니다.

불변 필드와 적절한 Lombok 어노테이션을 사용하여 깔끔하게 구현되었습니다. reserved 필드의 주석이 명확하게 의미를 설명하고 있습니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/repository/WaitingRedisRepository.java (1)

17-26: Redis 연결 예외 처리 및 트랜잭션 고려사항을 검토하세요.

현재 구현에서 Redis 연결 실패나 부분적 실패에 대한 예외 처리가 없습니다. 또한 sorted set과 hash 업데이트 간의 원자성이 보장되지 않습니다.

다음 사항들을 검토해보세요:

  1. Redis 연결 실패 시 예외 처리 전략
  2. 트랜잭션 또는 pipeline 사용 고려
  3. 부분 실패 시 롤백 전략

Redis 트랜잭션 사용 예시:

public boolean addToWaitingQueue(Long storeId, String userId, Integer partySize, long timestamp) {
    String queueKey = RedisKeyUtils.buildWaitingKeyPrefix() + storeId;
    String partyKey = RedisKeyUtils.buildWaitingPartySizeKeyPrefix() + storeId;
    
    return redisTemplate.execute(new SessionCallback<Boolean>() {
        @Override
        public Boolean execute(RedisOperations operations) throws DataAccessException {
            operations.multi();
            Boolean added = operations.opsForZSet().addIfAbsent(queueKey, userId, timestamp);
            if (Boolean.TRUE.equals(added)) {
                operations.opsForHash().put(partyKey, userId, partySize.toString());
            }
            operations.exec();
            return added;
        }
    });
}
nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/service/ReservationService.java (2)

11-12: 새로운 Redis 관련 import 추가가 적절합니다.

Redis 대기열 기능을 위한 필요한 클래스들이 올바르게 import되었습니다.


35-35: Redis 저장소 의존성 주입이 올바르게 구현되었습니다.

생성자 주입을 통한 의존성 관리가 Spring 모범 사례를 따르고 있습니다.

Comment on lines +101 to +104
Map<OrderStatus, List<OrderItemListGetResponseDto>> grouped = userOrders.stream()
.flatMap(order -> order.getOrderItems().stream()
.map(orderItem -> OrderItemListGetResponseDto.fromEntity(orderItem, order.getStatus())))
.collect(Collectors.groupingBy(OrderItemListGetResponseDto::getStatus));
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

OrderItemListGetResponseDto.fromEntity 메서드의 status 필드 설정을 확인해야 합니다.

관련 코드 스니펫에 따르면 fromEntity 메서드가 status 파라미터를 받지만 실제로는 status 필드를 설정하지 않는 것으로 보입니다. 이후 104번 줄에서 getStatus()를 호출하면 null이 반환되어 그룹화 로직이 올바르게 작동하지 않을 수 있습니다.

다음 스크립트를 실행하여 fromEntity 메서드 구현을 확인해 주세요:


🏁 Script executed:

#!/bin/bash
# Description: OrderItemListGetResponseDto.fromEntity 메서드의 status 필드 설정 확인

# fromEntity 메서드 구현 확인
ast-grep --pattern 'public static OrderItemListGetResponseDto fromEntity($_, $_) {
  $$$
}'

Length of output: 93


다음 스크립트로 DTO 클래스 위치와 fromEntity 메서드 구현을 다시 확인해 주세요.


🏁 Script executed:

#!/bin/bash
# 1. OrderItemListGetResponseDto 클래스 파일 위치 확인
echo "=== DTO 클래스 위치 ==="
fd OrderItemListGetResponseDto.java

# 2. 클래스 선언부 확인
echo "=== 클래스 선언부 스니펫 ==="
rg -n "class OrderItemListGetResponseDto" -A 5

# 3. fromEntity 메서드 구현 검색
echo "=== fromEntity 구현 ==="
rg -n "fromEntity" -A 20

Length of output: 102188


OrderItemListGetResponseDto.fromEntity에 status가 설정되지 않습니다

fromEntity 메서드가 전달받은 status 파라미터를 빌더에 반영하지 않아, getStatus()가 null을 반환해 그룹화 로직이 올바르게 동작하지 않습니다.

수정이 필요한 위치:

  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/dto/OrderItemListGetResponseDto.java
    fromEntity 메서드의 빌더 체인에 .status(status)를 추가해야 합니다.

예시 수정(diff):

 public static OrderItemListGetResponseDto fromEntity(OrderItem orderItem, OrderStatus status) {
     return OrderItemListGetResponseDto.builder()
         .orderId(orderItem.getUserOrder().getId())
         .menuName(orderItem.getMenu().getName())
         .quantity(orderItem.getQuantity())
         .price(orderItem.getMenu().getPrice())
+        .status(status)
         .build();
 }
🤖 Prompt for AI Agents
In
nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/dto/OrderItemListGetResponseDto.java
inside the fromEntity method, the passed status parameter is not set on the
builder, causing getStatus() to return null and breaking the grouping logic. Fix
this by adding .status(status) to the builder chain in fromEntity so the status
field is properly initialized.

- 파라미터 유효성 검사 로직
- Store 예약 비활성화 여부 체크 로직
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants