Skip to content

[debug/#575] 동시 알림이 같은 알림 삭제하려는 경쟁조건 해결#576

Merged
kanghana1 merged 1 commit into
developfrom
debug/#575
May 17, 2026
Merged

[debug/#575] 동시 알림이 같은 알림 삭제하려는 경쟁조건 해결#576
kanghana1 merged 1 commit into
developfrom
debug/#575

Conversation

@kanghana1
Copy link
Copy Markdown
Contributor

❤️ 기능 설명

기존에 알림 50개를 유지하기 위해서 걸어두었던 예외가 동시에 여러 알림이 들어올 때, 같은 알림을 삭제하려는 race condition으로 인해 이미 없는 알림을 삭제하려는 오류가 발생

50개라는 제한이 사실 ux를 위한 soft limit이기 때문에 락을 걸기보다는 예외를 무시하게 두고, 추후 스케줄러를 구현하는 방식으로 해결합니다.


연결된 issue

연결된 issue를 자동으로 닫기 위해 아래 {이슈넘버}를 입력해주세요.

close #575



🩷 Approve 하기 전 확인해주세요!

  • 리뷰어가 확인해줬으면 하는 사항 적어주세요.
  • [ ]

✅ 체크리스트

  • PR 제목 규칙 잘 지켰는가?
  • 추가/수정사항을 설명하였는가?
  • 테스트 결과 사진을 넣었는가?
  • 이슈넘버를 적었는가?

@kanghana1 kanghana1 self-assigned this May 17, 2026
@kanghana1 kanghana1 added the 🕷️ BUG Something isn't working label May 17, 2026
@kanghana1 kanghana1 merged commit 0beeb08 into develop May 17, 2026
1 check passed
@kanghana1 kanghana1 mentioned this pull request May 18, 2026
kanghana1 added a commit that referenced this pull request May 18, 2026
* [chore/#528] 서브도메인 명시 (#529)

* [chore/#531] Nginx 설정 파일 수정 (#532)

* chore: Nginx 프로토콜 설정을 Cloudflare에서 전달받아 설정하도록 변경

* chore: Nginx 웹소켓 타임아웃의 기본값이 1분이므로 60분으로 변경

* chore: Nginx gzip 설정을 통해 json 응답은 압축해서 보내도록 변경

* [Fix/#521] 채팅 이미지/파일 API 통합 및 테스트 코드 작성 (#526)

* refact: image -> file로 통합

* refact: S3 -> GCS로 예외 코드 명칭 변경

* refact: 채팅 이미지 업로드/다운로드 코드 제거

* refact: 채팅 이미지 관련 코드 수정

* feat: 채팅 파일 통합테스트

* feat: 채팅 파일 단위테스트

* feat: 파일 도메인 통합테스트

* feat: 파일 도메인 단위테스트

* fix: dto의 필드명은 바뀌지 않도록 롤뱁

* chore: 사용하지 않는 ChatImageRepository 제거

* test: 채팅 도메인 통합 테스트 및 단위 테스트에 이미지 필드 테스트 추가

* fix: 기존 images dto 유지를 위해 필드명 롤백

* fix: 기존 필드명이 imageOrder가 아닌 imgOrder였으므로 롤백

---------

Co-authored-by: dmori <chosehoon2@naver.com>

* [docs/#534] 이슈 템플릿 추가 (#535)

* [chore/#536] FCM 구현을 위한 firebase 의존성 추가 (#537)

* chore: firebase account 설정파일 주입

* chore: ci, cd에 firebase 주입 경로 추가

* chore: build.gradle에 의존성 추가

* fix: 테스트 이슈 라벨링 파싱 문제 해결

* [test/#516] Member 테스트코드 작성 (#533)

* feat: Member 통합테스트 구현

* feat: Member 통합테스트 구현

* feat: 모든 필드를 커버하는 통합테스트 추가

* feat: 모든 필드를 커버하는 통합테스트 추가

* test: 중복되는 프로필 테스트 제거

* [test/#538] 운동 신청/취소, 게스트 초대/취소 API 테스트 작성 (#539)

* test: 기존에 ExerciseParticipationService에서 Builder 대신 Fixture를 사용하도록 하여 가독성 향상

* test: 나이 조건 테스트를 위해 관련 MemberFixture 추가

* test: 운동 신청 API 단위 테스트 및 통합 테스트 코드 작성

* test: ExerciseCommandService에서 Builder를 쓰던 걸 Fixture를 사용하도록 변경

* test: 운동 신청 API에서 파사드 패턴의 CommandService의 단위 테스트 구현

* test: 운동 신청 취소 API의 통합 테스트 및 단위 테스트 코드 작성

* refactor: 운동 신청, 운동 신청 취소, 게스트 초대, 게스트 초대 취소 API를 ResponseEntity로 응답을 감싸 status도 정상적으로 반환할 수 있도록 변경

* chore: 불필요한 의존성 제거 및 줄바꿈 변경

* test: 게스트 초대 API 통합 테스트 및 CommandService 단위 테스트 코드, GusetService 단위 테스트 코드 작성

* test: 게스트 초대 취소 API 통합 테스트, CommandService 단위 테스트, GuestService 단위 테스트 코드 작성

* [feat/#540] FCM 의존성 추가 및 알림 기능 구현 (#541)

* [feat/#540] Firebase 주입방식 변경 (#542)

* chore: firebase 주입방식 변경

* chore: 설정파일 추가

* chore: firebase 키 재발급

* feat: firebaseConfig파일 생성

* feat: 설정파일 추가

* feat: FCM 알림 기능 구현

* test: 단위테스트 작성

* chore: valid추가

* test: 통합테스트 config에 mock 추가

* chore: 환경변수 주입 방식으로 변경

* [feat/#540] firebase 환경변수 주입방식으로 변경, docker-compose파일 수정 (#543)

* chore: firebase 주입방식 변경

* chore: 설정파일 추가

* chore: firebase 키 재발급

* feat: firebaseConfig파일 생성

* feat: 설정파일 추가

* feat: FCM 알림 기능 구현

* test: 단위테스트 작성

* chore: valid추가

* test: 통합테스트 config에 mock 추가

* chore: 환경변수 주입 방식으로 변경

* chore: docker-compose 파일 수정

* [debug/#544] 모임 추천 조회 (콕플 추천 모드) 검색 기능 누락 해결

* [debug/#547] 프로필 이름 변경 시 내 채팅방 목록이 전부 내 이름으로 변경되는 버그 (#548)

* debug: 프로필 이름 변경 시 상대방의 채팅방 목록에서 내 이름이 변경되도록 버그 수정

* test: 프로필 수정 메서드에서 채팅방 이름 변경 로직 단위 테스트 작성

* improve: 통합 테스트에서 실제 스토리지에 데이터를 넣는 건 적절하지 않으므로 mock과 stub으로 대체

* test: 프로필 수정 API 통합 테스트 작성

* [feat/#546] Flyway 도입을 위한 설정 추가 (#549)

* chore: flyway설정파일 추가

* chore: flyway 설정 추가

* chore: test에서도 flyway설정이 되도록 수정

* [fix/#552] 모임 채팅방 멤버 누락 데이터 보정 (#553)

* chore: MySQL 메모리가 database 두 개를 커버하기에는 부족하므로 1gb로 증가

* fix: 모임 채팅방 멤버 누락 마이그레이션 sql 쿼리 작성

* docs: 오픈코드 사용을 위한 .md 파일 추가 (#555)

* [test/#518] Bookmark 테스트코드 작성 (#556)

* test: 찜 통합테스트 테스트코드 작성

* test: 찜 단위테스트 작성

* test: 찜 목록 조회 누락된 부분추가

* test: order도 테스트 할 수 있도록 수정

* [test/#551] 운동 Query 테스트 코드 작성 (#557)

* chore: opencode 사용을 위해서 AGENTS.md 파일은 gitignore 처리

* test: ExerciseQuery getExerciseDetail 테스트 정리

* test: 운동 수정용 상세 조회 테스트 코드 작성

* test: 내가 초대한 게스트 조회 API 테스트 코드 작성

* test: 모임 운동 캘린더 조회 API 테스트 코드 작성

* test: 모임 운동 캘린더 조회 API에서 기본 기간 테스트도 추가

* test: 내 운동 캘린더 조회 API 테스트 코드 작성

* chore: 테스트 환경의 시간 존을 Asia로 설정

* test: 내 모임 운동 조회 API 테스트 코드 작성

* chore: claude code와 omc 사용을 위해 깃 이그노어 처리

* test: 내 모임 운동 캘린더 조회 API 테스트 코드 작성

* test: 사용자 추천 운동 조회 API 테스트 코드 작성

* test: ExerciseFixture에서 오버로딩 호출 방식으로 구조 변경

* fix: 기존 모임 운동 캘린더 조회 통합 테스트에서 날짜가 같아 깨지던 테스트를 수정

* test: 내 참여 운동 조회 API 테스트 코드 작성

* test: 건물 운동 상세 조회 API 테스트 코드 작성

* test: 월간 운동 건물 지도 데이터 조회 API 테스트 코드 작성

* test: 추천 운동 캘린더 조회 API 테스트 코드 작성

* [test/#517] Notification 단위테스트 및 통합테스트 코드 작성 (#559)

* test: 통합테스트 구현

* test: 단위테스트 코드 작성

* test: fcm 통합테스트코드 작성

* fix: 통합테스트 피드백 반영

* chore: 중복테스트 제거

* [test/#519] 모임 도메인 테스트코드 작성 (#558)

* debug: 모임 추천 조회 (콕플 추천 모드) 검색 기능 누락 해결

* test: 내 모임 조회(/api/my/parties) API 테스트 코드 작성

* test: 내 모임 간략화 조회(/api/my/parties/simple) API 테스트 코드 작성

* test: 모임 추천 조회(/api/my/parties/suggestions) API 테스트 코드 작성

* test: 모임 상세조회(/api/parties/{partyId}) API 테스트 코드 작성

* test: 모임 멤버 조회(/api/parties/{partyId}/members) API 테스트 코드 작성

* test: 모임 탈퇴(/api/parties/{partyId}/members/my) API 테스트 코드 작성

* test: @DisplayName 컨벤션 맞추기

* test: 모임 가입 신청 (/api/parties/{partyId}/join-requests) API 테스트 코드 작성

* test: 모임 생성 (/api/parties) API 테스트 코드 작성

* test: 모임 통합/단위테스트 컨벤션 맞추기 및 정리

* test: 모임 정보 수정 (/api/parties/{partyId}) API 테스트 코드 작성

* test: 멤버 역할(부모임장) 설정 (/api/parties/{partyId}/members/{memberId}/role) API 테스트 코드 작성

* test: 메서드명 수정

* test: 모임 삭제 (/api/parties/{partyId}/status) API 테스트 코드 작성

* test: 모임 멤버 삭제(/api/parties/{partyId}/members/{memberId}) API 테스트 코드 작성

* test: 가입신청 멤버 조회 (/api/parties/{partyId}/join-requests) API 테스트 코드 작성

* test: 가입 신청 처리 (/api/parties/{partyId}/join-requests/{requestId}) API 테스트 코드 작성

* test: 가입 승인 멤버 조회 (/api/parties/{partyId}/join-requests) API 테스트 코드 작성

* test: 신규 멤버 추천받기 (/api/parties/{partyId}/members/suggestions) API 테스트 코드 작성

* test: 신규 멤버 초대 보내기(/api/parties/{partyId}/invitations) API 테스트 코드 작성

* test: 모임 초대 처리(/api/parties/invitations/{invitationId}) API 테스트 코드 작성

* test: 키워드 추가(/api/parties/{partyId}/keywords) API 테스트 코드 작성

* chore: 모임 역할 enum 대문자로 통일

* chore: import문 정리 및 줄맞춤

* TEST: 내 모임 조회 API 정렬 기준에 따른 테스트 케이스 추가

* TEST: 멤버 역할 설정 API 실패, 성공 테스트 케이스 추가

* test: 모임 가입 신청 처리 API 실패 케이스 추가 및 enum 수정

* test: 모임 상세조회 API 필드 추가

* test: 모임 멤버 삭제 API 성공, 실패 테스트 케이스 추가

* test: MEMBER_NOT_FOUND, PARTY_NOT_FOUND 실패 테스트 케이스 추가

* test: 내 모임 조회(/api/my/parties) API 테스트 코드 작성

* test: 내 모임 간략화 조회(/api/my/parties/simple) API 테스트 코드 작성

* test: 모임 추천 조회(/api/my/parties/suggestions) API 테스트 코드 작성

* test: 모임 상세조회(/api/parties/{partyId}) API 테스트 코드 작성

* test: 모임 멤버 조회(/api/parties/{partyId}/members) API 테스트 코드 작성

* test: 모임 탈퇴(/api/parties/{partyId}/members/my) API 테스트 코드 작성

* test: @DisplayName 컨벤션 맞추기

* test: 모임 가입 신청 (/api/parties/{partyId}/join-requests) API 테스트 코드 작성

* test: 모임 생성 (/api/parties) API 테스트 코드 작성

* test: 모임 통합/단위테스트 컨벤션 맞추기 및 정리

* test: 모임 정보 수정 (/api/parties/{partyId}) API 테스트 코드 작성

* test: 멤버 역할(부모임장) 설정 (/api/parties/{partyId}/members/{memberId}/role) API 테스트 코드 작성

* test: 메서드명 수정

* test: 모임 삭제 (/api/parties/{partyId}/status) API 테스트 코드 작성

* test: 모임 멤버 삭제(/api/parties/{partyId}/members/{memberId}) API 테스트 코드 작성

* test: 가입신청 멤버 조회 (/api/parties/{partyId}/join-requests) API 테스트 코드 작성

* test: 가입 신청 처리 (/api/parties/{partyId}/join-requests/{requestId}) API 테스트 코드 작성

* test: 가입 승인 멤버 조회 (/api/parties/{partyId}/join-requests) API 테스트 코드 작성

* test: 신규 멤버 추천받기 (/api/parties/{partyId}/members/suggestions) API 테스트 코드 작성

* test: 신규 멤버 초대 보내기(/api/parties/{partyId}/invitations) API 테스트 코드 작성

* test: 모임 초대 처리(/api/parties/invitations/{invitationId}) API 테스트 코드 작성

* test: 키워드 추가(/api/parties/{partyId}/keywords) API 테스트 코드 작성

* chore: 모임 역할 enum 대문자로 통일

* chore: import문 정리 및 줄맞춤

* TEST: 내 모임 조회 API 정렬 기준에 따른 테스트 케이스 추가

* TEST: 멤버 역할 설정 API 실패, 성공 테스트 케이스 추가

* test: 모임 가입 신청 처리 API 실패 케이스 추가 및 enum 수정

* test: 모임 상세조회 API 필드 추가

* test: 모임 멤버 삭제 API 성공, 실패 테스트 케이스 추가

* test: MEMBER_NOT_FOUND, PARTY_NOT_FOUND 실패 테스트 케이스 추가

* test: 내 모임 조회 API 정렬 기준 검증 수정, 추천 모임 조회 API 정렬 기준 및 검색 기능 검증 추가

* test: import 수행

* [chore/#563] flyway 파일 추가 (#564)

* chore: flyway 파일 추가 (role 업데이트)

* chore: 컬럼의 정렬 규칙을 BINARY로 변경 (대문자 인식 못하는 이슈로 인하여 추가)

* [test/#565] Contest 도메인 테스트 코드 작성 (#566)

* test: Contest 통합테스트 작성

* test: Contest 단위테스트 코드 작성

* chore: 코드 일부 수정

* fix: 불필요한 검증로직 제거

* chore: 카멜케이스로 수정

* [Test] 채팅 API 테스트 코드 작성 (#567)

* test: 모임 채팅방 목록 조회 API 통합 테스트 및 서비스 단위 테스트 작성

* test: 모임 채팅방 이름 검색 API 통합 테스트 및 단위 테스트 작성

* test: 개인 채팅방 생성 및 참여 API 통합 테스트 및 서비스 단위 테스트 작성

* chore: .omx 및 dump 파일을 깃 이그노어 처리

* debug: ENUM 값 변경에 따른 테스트 코드 수정

* test: 개인 채팅방 목록 조회 API 통합 테스트 및 단위 테스트 작성

* test: 개인 채팅방 이름 검색 API 통합 테스트 및 단위 테스트 코드 작성

* debug: 통합 테스트에서 redis를 ServiceConnection이 아닌 RedisConfig 값을 사용하던 문제를 해결

* chore: static 컨테이너를 사용하므로 스프링이 빈을 종료하지 않도록 변경

* chore: 테스트 종료 후 Redis 연결 시도 관련 에러는 로깅 레벨을 낮춰서 제거

* [feat/#569] 채팅 푸시알림 기능 추가 및 테스트코드 작성 (#570)

* feat: 채팅 알림 추가에 따른 ENUM 추가

* feat: 채팅용 알림로직 추가

* feat: 채팅용 푸시알림 service단 추가 및 채팅로직에 의존성 추가

* test: 단위 테스트 추가

* feat: 알림 enum 제거

* feat: 채팅 알림 비동기 이벤트 발행

* test: 코드 수정에 따른 테스트코드 수정

* [chore/#572] 알림 성능 측정용 로그 추가 (#573)

* [chore/#572] 알림 테스트용 컨트롤러 추가 (#574)

* chore: 로그추가

* chore: 테스트용 컨트롤러 추가

* [debug/#575] 동시 알림이 같은 알림 삭제하려는 경쟁조건 해결 (#576)

* [chore/#572] FIrebase 직접 호출 대신 timesleep으로 대체 (#577)

* chore: 로그추가

* chore: 테스트용 컨트롤러 추가

* [debug/#575] 동시 알림이 같은 알림 삭제하려는 경쟁조건 문제 해결 (#578)

* debug: 동시 알림이 같은 알림 삭제하려는 경쟁조건 문제 해결

* test: 스레드 분리로 인한 테스트코드 수정

* [refactor/#571] 일반 알림 FCM 비동기 처리 전환 (#579)

* feat: NotificationEvent 추가

* feat: 트랜잭션 분리

* test: 테스트코드 수정

* fix: Event에서 id로 받아오도록 수정 및 관련 테스트코드 추가

---------

Co-authored-by: Dmori <83327857+Dimo-2562@users.noreply.github.com>
Co-authored-by: Yumin Kwon <dbalsrltk@naver.com>
Co-authored-by: dmori <chosehoon2@naver.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🕷️ BUG Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[DEBUG] 동시 요청이 같은 알림을 동시에 삭제하려는 오류 해결

1 participant