Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

임시저장 시 필드값이나 게임 갯수가 모자라도 저장되도록 구현 #798

Merged
merged 4 commits into from
Dec 11, 2024

Conversation

jschoi-96
Copy link
Contributor

@jschoi-96 jschoi-96 commented Dec 10, 2024

💡 작업 내용

  • 필드 제약조건 삭제
  • 저장하려는 게임이 공백인 경우, 파일 재배치 로직을 거치지 않도록 예외처리
  • 기존에 게임 수가 10개가 되어야 임시저장이 가능했으나, 예외처리 삭제
  • 선택지를 하나만 저장할 때 예외처리

💡 자세한 설명

필드 제약 조건 삭제

필드 제약 조건을 삭제하여 제목, 선택지와 같은 값들이 공백이여도 저장되도록 구현했습니다. 또한, 기존에 게임 숫자가 10개가 되는지 체크하는 예외처리 로직이 있었는데 삭제했습니다.

게임이 비어있는 경우 예외처리

스크린샷 2024-12-11 오전 2 14 52

Cannot invoke "java.util.List.stream()" because "tempGames" is null 과 같은 NPE 에러가 발생하기 때문에 예외처리를 해줬습니다.

선택지를 1개만 저장했을 때 예외처리

{
    "title": "결정사",
    "isLoaded": false,
    "tempGames": [
        {
            "description": "500만원주고 가입한 결정사. 이제 마지막 남은 주선 기회는 1번. 당신은 누굴 택할것인가",
            "tempGameOptions": [
                {
                    "name": "1000억 부자 유병재",
                    "description": "어쩌고 저쩌고 저쩌고",
                    "optionType": "A"
                }
            ]
        }
    ]
}

이런식으로 선택지를 하나만 저장하고, 새롭게 불러와서 선택지를 추가할 때 Index 1 out of bounds for length 1 문제가 발생했습니다.

{
    "title": "결정사",
    "isLoaded": false,
    "tempGames": [
        {
            "description": "500만원주고 가입한 결정사. 이제 마지막 남은 주선 기회는 1번. 당신은 누굴 택할것인가",
            "tempGameOptions": [
                {
                    "name": "1000억 부자 유병재",
                    "description": "어쩌고 저쩌고 저쩌고",
                    "optionType": "A"
                },
                {
                    "name": "무일푼 차은우",
                    "description": "어쩌고 저쩌고 저쩌고",
                    "optionType": "B"
                }
            ]
        }
    ]
}

따라서, else문을 통해서 사이즈가 다른 경우엔, 추가되는 게임 옵션만 추가해주도록 구현했습니다.

스크린샷 2024-12-11 오전 2 17 02

📗 참고 자료 (선택)

📢 리뷰 요구 사항 (선택)

🚩 후속 작업 (선택)

✅ 셀프 체크리스트

  • PR 제목을 형식에 맞게 작성했나요?
  • 브랜치 전략에 맞는 브랜치에 PR을 올리고 있나요?
  • 이슈는 close 했나요?
  • Reviewers, Labels, Projects를 등록했나요?
  • 작업 도중 문서 수정이 필요한 경우 잘 수정했나요?
  • 테스트는 잘 통과했나요?
  • 불필요한 코드는 제거했나요?

closes #791

Summary by CodeRabbit

  • New Features

    • 새로운 임시 게임 생성 로직 추가: 비어 있거나 null인 게임 목록을 처리하는 조건 추가.
    • TempGame 클래스에 게임 옵션 추가 기능 추가.
  • Bug Fixes

    • 게임 세트 요청 시 기존 파일 삭제 및 파일 이동 로직 개선.
  • Documentation

    • 불필요한 예외 처리 및 검증 로직 제거로 코드 간소화.
  • Refactor

    • 게임 옵션 업데이트 로직 개선 및 구조 조정.
  • Style

    • 불필요한 공백 제거 및 주석 정리.

@jschoi-96 jschoi-96 added ✨ feature 구현, 개선 사항 관련 부분 D-0 긴급 이슈에 대한 작업 labels Dec 10, 2024
@jschoi-96 jschoi-96 self-assigned this Dec 10, 2024
@jschoi-96 jschoi-96 linked an issue Dec 10, 2024 that may be closed by this pull request
Copy link
Contributor

coderabbitai bot commented Dec 10, 2024

Walkthrough

TempGameService.javacreateTempGame 메서드에 대한 주요 수정이 이루어졌습니다. 요청의 tempGames 리스트가 null이거나 비어있을 경우, 새로운 TempGameSet이 생성되어 저장됩니다. 기존의 게임 세트가 있을 경우, 새로운 요청으로 판단되면 이전 파일을 삭제하고 파일을 재배치합니다. TempGame.java에서는 새로운 메서드가 추가되고 기존 메서드가 수정되었습니다. TempGameOption.javaTempGameSet.java에서는 @NotBlank 어노테이션이 제거되어 유효성 검사 로직에 변화가 있습니다. TempGameSetDto.java에서는 GAME_SIZE 상수가 제거되었습니다.

Changes

파일 경로 변경 요약
src/main/java/balancetalk/game/application/TempGameService.java createTempGame 메서드에 조건문 추가 및 기존 게임 세트 관리 로직 수정.
src/main/java/balancetalk/game/domain/TempGame.java addTempGameOption 메서드 추가, updateTempGame 메서드 수정, getGameOptionIds 메서드 제거.
src/main/java/balancetalk/game/domain/TempGameOption.java name 필드에서 @NotBlank 어노테이션 제거.
src/main/java/balancetalk/game/domain/TempGameSet.java title 필드에서 @NotBlank 어노테이션 제거.
src/main/java/balancetalk/game/dto/TempGameSetDto.java GAME_SIZE 상수 및 관련 유효성 검사 로직 제거.

Assessment against linked issues

Objective Addressed Explanation
임시 저장 시 일부 항목만 기입이 되어도 저장하고, 불러오기가 되어야 함 (#791)

Possibly related PRs

Suggested labels

🛠️ fix

Suggested reviewers

  • Hanjaemo
  • gywns0417

🐇 변화의 순간에 기뻐하며,
임시 게임이 쉽게 저장되네.
빈 리스트도 이제 괜찮아,
새로운 시작을 함께하자!
🥕✨


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • 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 generate unit testing code for this file.
    • @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 generate unit testing code.
    • @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.

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 for this PR. (Experiment)
  • @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 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 for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@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: 0

🧹 Outside diff range and nitpick comments (2)
src/main/java/balancetalk/game/domain/TempGame.java (1)

57-64: 옵션 업데이트 로직이 개선되었습니다.

기존 옵션 업데이트와 새 옵션 추가를 명확하게 구분하여 처리하고 있습니다. 다만, 다음 사항을 고려해보시기 바랍니다:

  1. 기존 옵션이 새 옵션보다 많은 경우 처리가 필요할 수 있습니다.
  2. 불필요한 옵션을 제거하는 로직 추가를 고려해보세요.
 public void updateTempGame(TempGame newTempGame) {
     this.description = newTempGame.getDescription();
+    // 불필요한 옵션 제거
+    while (this.tempGameOptions.size() > newTempGame.getTempGameOptions().size()) {
+        this.tempGameOptions.remove(this.tempGameOptions.size() - 1);
+    }
     IntStream.range(0, newTempGame.getTempGameOptions().size()).forEach(i -> {
         if (i < this.tempGameOptions.size()) {
             TempGameOption currentOption = this.tempGameOptions.get(i);
             TempGameOption newOption = newTempGame.getTempGameOptions().get(i);
             currentOption.updateTempGameOption(newOption);
         } else {
             TempGameOption newOption = newTempGame.getTempGameOptions().get(i);
             this.addTempGameOption(newOption);
         }
     });
 }
src/main/java/balancetalk/game/application/TempGameService.java (1)

47-51: 임시 저장 시 빈 게임 목록 처리가 추가되었습니다.

빈 게임 목록 처리가 잘 구현되었습니다. 다만, 다음 사항들을 고려해보시기 바랍니다:

  1. 로깅 추가를 통한 모니터링 개선
  2. 빈 게임 목록으로 저장되는 경우에 대한 사용자 피드백
 if (request.getTempGames() == null || request.getTempGames().isEmpty()) {
+    log.info("임시 저장: 빈 게임 목록으로 저장됨 - 회원 ID: {}", member.getId());
     TempGameSet tempGameSet = request.toEntity(member);
     tempGameSetRepository.save(tempGameSet);
     return;
 }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 7a07f0b and e2fe7f0.

📒 Files selected for processing (5)
  • src/main/java/balancetalk/game/application/TempGameService.java (1 hunks)
  • src/main/java/balancetalk/game/domain/TempGame.java (1 hunks)
  • src/main/java/balancetalk/game/domain/TempGameOption.java (0 hunks)
  • src/main/java/balancetalk/game/domain/TempGameSet.java (0 hunks)
  • src/main/java/balancetalk/game/dto/TempGameSetDto.java (1 hunks)
💤 Files with no reviewable changes (2)
  • src/main/java/balancetalk/game/domain/TempGameOption.java
  • src/main/java/balancetalk/game/domain/TempGameSet.java
🧰 Additional context used
📓 Learnings (2)
src/main/java/balancetalk/game/dto/TempGameSetDto.java (1)
Learnt from: jschoi-96
PR: JECT-Study/PICK-O-Server#713
File: src/main/java/balancetalk/game/domain/TempGameSet.java:65-71
Timestamp: 2024-11-19T13:42:37.389Z
Learning: `TempGameSet.java`의 `updateTempGameSet` 메서드에서 `tempGames`의 크기에 대한 추가 검증은 불필요하다. 이 크기 검사는 이미 메서드 호출 전에 수행되고 있다.
src/main/java/balancetalk/game/domain/TempGame.java (1)
Learnt from: jschoi-96
PR: JECT-Study/PICK-O-Server#713
File: src/main/java/balancetalk/game/domain/TempGame.java:52-55
Timestamp: 2024-11-14T15:21:06.978Z
Learning: In `TempGame.java`, the `updateTempGame` method already checks the array size before iteration, preventing `IndexOutOfBoundsException`.
🔇 Additional comments (2)
src/main/java/balancetalk/game/domain/TempGame.java (1)

49-52: 새로운 도우미 메서드가 잘 구현되었습니다.

양방향 연관관계 설정이 올바르게 구현되어 있습니다.

src/main/java/balancetalk/game/dto/TempGameSetDto.java (1)

18-18: 임시 저장 시 게임 수 제한이 제거되었습니다.

PR의 목적에 맞게 게임 수 제한이 제거되었습니다. 하지만 다음 사항을 검토해주세요:

  1. 프론트엔드에서도 관련 제한이 제거되었는지 확인이 필요합니다.
  2. 향후 게임 수 제한이 필요할 수 있으므로, 설정 값으로 관리하는 것을 고려해보세요.

@jschoi-96 jschoi-96 merged commit f7043e0 into main Dec 11, 2024
4 checks passed
@jschoi-96 jschoi-96 deleted the feat/791-temp-games-save branch December 11, 2024 16:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
D-0 긴급 이슈에 대한 작업 ✨ feature 구현, 개선 사항 관련 부분
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

임시 저장 시 데이터가 누락되어도 저장되도록 구현
2 participants