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

fix: 출석체크 여러번 가능한 문제 해결 #745

Merged
merged 3 commits into from
Sep 3, 2024

Conversation

seulgi99
Copy link
Contributor

@seulgi99 seulgi99 commented Sep 3, 2024

🌱 관련 이슈

📌 작업 내용 및 특이사항

📝 참고사항

📚 기타

Summary by CodeRabbit

  • New Features

    • 출석 기록 확인을 위한 새로운 기능 추가: 사용자가 이미 출석한 경우 중복 출석을 방지합니다.
    • 출석 여부를 확인하는 새로운 메서드 추가로 출석 기록 관리 기능 강화.
  • Bug Fixes

    • 출석 중복 처리 로직 개선으로 잘못된 출석 기록 방지.
  • Tests

    • 출석 검증 로직에 대한 테스트 케이스 강화: 중복 출석 시 예외 처리 확인.

@seulgi99 seulgi99 added the 🐛 bug/error 버그 및 에러 픽스 label Sep 3, 2024
@seulgi99 seulgi99 self-assigned this Sep 3, 2024
@seulgi99 seulgi99 requested a review from a team as a code owner September 3, 2024 04:51
Copy link

coderabbitai bot commented Sep 3, 2024

Warning

Rate limit exceeded

@seulgi99 has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 6 minutes and 5 seconds before requesting another review.

How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

Commits

Files that changed from the base of the PR and between 22a3731 and 59854e7.

Walkthrough

변경 사항은 StudentStudyService 클래스의 attend 메서드와 관련된 출석 처리 로직을 개선하여, 사용자가 이미 출석한 경우를 확인하는 기능을 추가합니다. 이를 위해 새로운 메서드와 검증 로직이 도입되어 중복 출석을 방지하며, 관련된 예외 처리 및 테스트 케이스도 업데이트되었습니다.

Changes

파일 경로 변경 요약
src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyService.java attend 메서드에 isAlreadyAttended 변수를 추가하여 출석 여부를 확인하고, 이를 validateAttendance 메서드에 전달.
src/main/java/com/gdschongik/gdsc/domain/study/dao/AttendanceRepository.java existsByStudentIdAndStudyDetailId 메서드 추가로 출석 기록 존재 여부 확인 기능 강화.
src/main/java/com/gdschongik/gdsc/domain/study/domain/AttendanceValidator.java validateAttendance 메서드에 isAlreadyAttended 매개변수 추가로 중복 출석 방지 로직 강화.
src/main/java/com/gdschongik/gdsc/global/exception/ErrorCode.java ALREADY_ATTENDED_STUDY_DETAIL 상수 추가로 출석 중복 오류 처리.
src/test/java/com/gdschongik/gdsc/domain/study/domain/AttendanceValidatorTest.java 테스트 케이스 수정 및 추가로 출석 중복 처리 로직 검증.

Assessment against linked issues

Objective Addressed Explanation
출석체크 여러번 가능한 문제 해결 (#741)
출석 여부 확인 기능 추가 (#741)

🐰 변화의 기쁨을 노래해요,
출석 체크는 이제 한 번만 해요!
중복은 사라지고, 오류는 없어요,
모두 함께 즐거운 스터디 하세요!
🥕✨


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>.
    • 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 generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @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 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.

Tip

Early access features: enabled

We are currently testing the following features in early access:

  • Anthropic claude-3-5-sonnet for code reviews: Anthropic claims that the new Claude model has stronger code understanding and code generation capabilities than their previous models. Note: Our default code review model was also updated late last week. Please compare the quality of the reviews between the two models by toggling the early access feature.

Note:

  • You can enable or disable early access features from the CodeRabbit UI or by updating the CodeRabbit configuration file.
  • Please join our Discord Community to provide feedback and report issues on the discussion post.

Copy link

github-actions bot commented Sep 3, 2024

Job Summary for Gradle

Check Style and Test to Develop :: build-test
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
gdsc check 8.5 Build Scan published

Copy link
Member

@AlmondBreez3 AlmondBreez3 left a comment

Choose a reason for hiding this comment

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

lgtm 용어 하나만 바꿔주심 좋을것같아여

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: 1

Outside diff range, codebase verification and nitpick comments (4)
src/main/java/com/gdschongik/gdsc/domain/study/dao/AttendanceRepository.java (1)

6-8: 변경 사항이 적절해 보입니다.

새로운 메서드 existsByStudentIdAndStudyDetailId는 PR의 목적인 다중 출석 체크 문제를 해결하는 데 도움이 될 것 같습니다.

메서드의 목적을 명확히 하기 위해 다음과 같은 주석을 추가하는 것이 좋겠습니다:

 public interface AttendanceRepository extends JpaRepository<Attendance, Long>, AttendanceCustomRepository {
+    /**
+     * 특정 학생이 특정 스터디 세부 사항에 대해 이미 출석했는지 확인합니다.
+     * @param studentId 학생 ID
+     * @param studyDetailId 스터디 세부 사항 ID
+     * @return 출석 기록이 존재하면 true, 그렇지 않으면 false
+     */
     boolean existsByStudentIdAndStudyDetailId(Long studentId, Long studyDetailId);
 }
src/main/java/com/gdschongik/gdsc/domain/study/domain/AttendanceValidator.java (2)

11-12: 메서드 시그니처 변경이 적절합니다.

isAlreadyAttended 매개변수를 추가한 것은 중복 출석 체크 문제를 해결하는 데 도움이 됩니다.

메서드의 Javadoc을 업데이트하여 새로운 매개변수에 대한 설명을 추가하는 것이 좋겠습니다. 다음과 같이 Javadoc을 추가할 수 있습니다:

/**
 * 출석을 검증합니다.
 * @param studyDetail 학습 세부 정보
 * @param attendanceNumber 출석 번호
 * @param date 출석 날짜
 * @param isAlreadyAttended 이미 출석했는지 여부
 * @throws CustomException 출석 검증에 실패한 경우
 */
public void validateAttendance(
        StudyDetail studyDetail, String attendanceNumber, LocalDate date, boolean isAlreadyAttended) {
    // ... 메서드 본문 ...
}

23-27: 새로운 검증 로직이 적절히 추가되었습니다.

이미 출석한 경우에 대한 검증 로직이 잘 구현되었습니다.

주석을 더 명확하게 수정하는 것이 좋겠습니다. 다음과 같이 변경할 수 있습니다:

// 중복 출석 검증
if (isAlreadyAttended) {
    throw new CustomException(ALREADY_ATTENDED_STUDY_DETAIL);
}
src/main/java/com/gdschongik/gdsc/global/exception/ErrorCode.java (1)

133-133: 새로운 에러 코드 추가 승인

새로운 에러 코드 ALREADY_ATTENDED_STUDY_DETAIL가 적절하게 추가되었습니다. 이는 PR의 목적인 다중 출석 체크 문제 해결에 부합합니다.

가독성을 위해 에러 코드를 관련 그룹에 배치하는 것이 좋습니다. 예를 들어, ATTENDANCE_DATE_INVALIDATTENDANCE_NUMBER_MISMATCH 바로 다음에 배치하는 것을 고려해 보세요.

    ATTENDANCE_DATE_INVALID(HttpStatus.CONFLICT, "강의일이 아니면 출석체크할 수 없습니다."),
    ATTENDANCE_NUMBER_MISMATCH(HttpStatus.CONFLICT, "출석번호가 일치하지 않습니다."),
+   ALREADY_ATTENDED_STUDY_DETAIL(HttpStatus.CONFLICT, "이미 출석 처리된 스터디입니다."),

    // Order
    ORDER_NOT_FOUND(HttpStatus.NOT_FOUND, "주문이 존재하지 않습니다."),
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 171694c and 22a3731.

Files selected for processing (5)
  • src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyService.java (1 hunks)
  • src/main/java/com/gdschongik/gdsc/domain/study/dao/AttendanceRepository.java (1 hunks)
  • src/main/java/com/gdschongik/gdsc/domain/study/domain/AttendanceValidator.java (2 hunks)
  • src/main/java/com/gdschongik/gdsc/global/exception/ErrorCode.java (1 hunks)
  • src/test/java/com/gdschongik/gdsc/domain/study/domain/AttendanceValidatorTest.java (3 hunks)
Additional comments not posted (5)
src/test/java/com/gdschongik/gdsc/domain/study/domain/AttendanceValidatorTest.java (5)

4-4: 새로운 에러 코드 import 추가

ALREADY_ATTENDED_STUDY_DETAIL 에러 코드가 추가되었습니다. 이는 새로운 테스트 케이스와 관련이 있어 보입니다.


59-62: 기존 테스트 케이스 수정: 출석번호 검증

여기서도 validateAttendance 메서드 호출에 새로운 boolean 매개변수 false가 추가되었습니다. 이는 일관성 있는 변경으로 보입니다.


64-83: 새로운 테스트 케이스 추가: 중복 출석 검증

이 새로운 테스트 케이스는 사용자가 이미 출석한 경우를 검증합니다. 다음 사항들이 적절히 구현되었습니다:

  • 테스트 설정이 기존 테스트들과 일관성 있게 구성되었습니다.
  • validateAttendance 메서드 호출 시 마지막 인자로 true를 전달하여 이미 출석한 상태를 시뮬레이션합니다.
  • ALREADY_ATTENDED_STUDY_DETAIL 에러 코드를 사용하여 예외를 검증합니다.

이 테스트 케이스는 PR의 목적인 중복 출석 방지 기능을 직접적으로 검증하고 있어 매우 중요합니다.


Line range hint 1-83: 전반적인 변경 사항 검토

이 파일의 변경 사항들은 PR의 목적인 "출석체크 여러번 가능한 문제 해결"을 잘 반영하고 있습니다:

  1. validateAttendance 메서드에 새로운 boolean 매개변수가 추가되어 이미 출석했는지 여부를 확인할 수 있게 되었습니다.
  2. 기존 테스트 케이스들이 새로운 메서드 시그니처에 맞게 업데이트되었습니다.
  3. 중복 출석을 검증하는 새로운 테스트 케이스가 추가되었습니다.

이러한 변경 사항들은 출석 체크 시스템의 견고성을 향상시키고, 중복 출석 문제를 효과적으로 해결할 것으로 보입니다.


40-42: 기존 테스트 케이스 수정: 출석일자 검증

validateAttendance 메서드 호출에 새로운 boolean 매개변수 false가 추가되었습니다. 이는 아직 출석하지 않은 상태를 나타내는 것으로 보입니다.

다음 스크립트를 실행하여 validateAttendance 메서드의 새로운 시그니처가 일관되게 적용되었는지 확인하세요:

Verification successful

validateAttendance 메서드 시그니처 일관성 확인 완료

validateAttendance 메서드가 모든 호출에서 새로운 시그니처(4개의 인자)를 사용하고 있음을 확인했습니다. 코드베이스 전반에 걸쳐 일관성이 유지되고 있습니다.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: validateAttendance 메서드의 새로운 시그니처 확인

# Test: validateAttendance 메서드 호출 검색. 예상: 모든 호출이 4개의 인자를 가짐
rg --type java -A 5 $'validateAttendance\('

Length of output: 4026

Comment on lines +93 to +100
final boolean isAlreadyAttended =
attendanceRepository.existsByStudentIdAndStudyDetailId(currentMember.getId(), studyDetailId);
final StudyHistory studyHistory = studyHistoryRepository
.findByStudentAndStudy(currentMember, study)
.orElseThrow(() -> new CustomException(STUDY_HISTORY_NOT_FOUND));

attendanceValidator.validateAttendance(studyDetail, request.attendanceNumber(), LocalDate.now());
attendanceValidator.validateAttendance(
studyDetail, request.attendanceNumber(), LocalDate.now(), isAlreadyAttended);
Copy link

Choose a reason for hiding this comment

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

출석 중복 체크 로직이 잘 구현되었습니다.

변경사항이 이슈 #741을 해결하는 데 효과적으로 보입니다. 다음과 같은 개선 사항을 고려해 보시기 바랍니다:

  1. 에러 처리: 이미 출석한 경우에 대한 명확한 예외를 추가하는 것이 좋겠습니다.
  2. 코드 구조: isAlreadyAttended 체크 로직을 별도의 메서드로 분리하여 가독성을 높일 수 있습니다.

다음과 같은 리팩토링을 제안합니다:

@Transactional
public void attend(Long studyDetailId, StudyAttendCreateRequest request) {
    final StudyDetail studyDetail = studyDetailRepository
            .findById(studyDetailId)
            .orElseThrow(() -> new CustomException(STUDY_DETAIL_NOT_FOUND));
    final Member currentMember = memberUtil.getCurrentMember();
    final Study study = studyDetail.getStudy();
-   final boolean isAlreadyAttended =
-           attendanceRepository.existsByStudentIdAndStudyDetailId(currentMember.getId(), studyDetailId);
+   final boolean isAlreadyAttended = checkAlreadyAttended(currentMember.getId(), studyDetailId);
    final StudyHistory studyHistory = studyHistoryRepository
            .findByStudentAndStudy(currentMember, study)
            .orElseThrow(() -> new CustomException(STUDY_HISTORY_NOT_FOUND));

    attendanceValidator.validateAttendance(
            studyDetail, request.attendanceNumber(), LocalDate.now(), isAlreadyAttended);

+   if (isAlreadyAttended) {
+       throw new CustomException(ALREADY_ATTENDED);
+   }

    Attendance attendance = Attendance.create(currentMember, studyDetail);
    attendanceRepository.save(attendance);

    log.info("[StudyService] 스터디 출석: attendanceId={}", attendance.getId());
}

+private boolean checkAlreadyAttended(Long memberId, Long studyDetailId) {
+    return attendanceRepository.existsByStudentIdAndStudyDetailId(memberId, studyDetailId);
+}

이렇게 하면 코드의 가독성이 향상되고 에러 처리가 더 명확해집니다.

Committable suggestion was skipped due to low confidence.

Copy link
Member

@Sangwook02 Sangwook02 left a comment

Choose a reason for hiding this comment

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

미리 어푸루브 해둘게요!

Copy link

github-actions bot commented Sep 3, 2024

Job Summary for Gradle

Check Style and Test to Develop :: build-test
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
gdsc check 8.5 Build Scan published

@seulgi99 seulgi99 merged commit b355bf2 into develop Sep 3, 2024
1 check passed
@seulgi99 seulgi99 deleted the fix/741-attendance-duplicate branch September 3, 2024 05:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🐛 bug/error 버그 및 에러 픽스
Projects
None yet
Development

Successfully merging this pull request may close these issues.

🐛 출석체크 여러번 가능한 문제
3 participants