Skip to content

[Chat] Redis Stream 기반 채팅 메세지 저장&조회#204

Merged
Creamcheesepie merged 8 commits into
mainfrom
feat/#185
Dec 29, 2025
Merged

[Chat] Redis Stream 기반 채팅 메세지 저장&조회#204
Creamcheesepie merged 8 commits into
mainfrom
feat/#185

Conversation

@heygeeji
Copy link
Copy Markdown
Collaborator

🔗 관련 이슈

관련된 이슈 번호를 연결해주세요.
Close #이슈번호 를 쓰면 PR merge 시 자동으로 close 됩니다.

🚀 PR 개요

이 PR이 어떤 변경을 포함하고 있는지 간단히 설명해주세요.

  • Redis Stream 기반 채팅 메세지 저장
  • Redis Stream 기반 채팅 메세지 조회
  • 채팅하는 유저 캐싱 처리

📌 변경 사항

주요 변경 내용을 체크리스트 형태로 정리해주세요.

  • 기능 추가
  • 버그 수정
  • 리팩터링
  • 문서 업데이트
  • 테스트 추가/수정

🧪 테스트 방법

변경된 내용을 어떻게 테스트했는지 구체적으로 적어주세요.

📸 스크린샷 (선택)

UI 변경 또는 시각적으로 확인할 수 있는 변경이 있다면 첨부해주세요.

스크린샷 2025-12-29 021942 스크린샷 2025-12-29 021955 스크린샷 2025-12-29 022020

⚠️ 참고 사항

리뷰어가 알아야 할 사항이 있다면 자유롭게 작성해주세요.

@heygeeji heygeeji linked an issue Dec 28, 2025 that may be closed by this pull request
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Dec 28, 2025

Test Results

6 tests  ±0   6 ✅ ±0   0s ⏱️ ±0s
3 suites ±0   0 💤 ±0 
3 files   ±0   0 ❌ ±0 

Results for commit 99980b6. ± Comparison against base commit ddce6fe.

♻️ This comment has been updated with latest results.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Dec 28, 2025

⭐ JaCoCo Coverage

Line Coverage: 5.30%

📄 Coverage Details

Overall Line Coverage: 5.27% (204 covered / 3872 lines)

Package Summary (lowest first)
Package Line % Covered Missed
com/back/web7_9_codecrete_be/domain/plans/controller 0.00% 0 49
com/back/web7_9_codecrete_be/domain/location/controller 0.00% 0 54
com/back/web7_9_codecrete_be/domain/community/post/service 0.00% 0 45
com/back/web7_9_codecrete_be/global/rsData 0.00% 0 11
com/back/web7_9_codecrete_be/domain/chats/entity 0.00% 0 4
com/back/web7_9_codecrete_be/domain/location/entity 0.00% 0 15
com/back/web7_9_codecrete_be/global/scheduler 0.00% 0 11
com/back/web7_9_codecrete_be/domain/auth/entity 0.00% 0 0
com/back/web7_9_codecrete_be/global/websocket 0.00% 0 10
com/back/web7_9_codecrete_be/domain/auth/service 0.00% 0 135
com/back/web7_9_codecrete_be/domain/plans/service 0.00% 0 362
com/back/web7_9_codecrete_be/global/initData 0.00% 0 54
com/back/web7_9_codecrete_be/domain/users/controller 0.00% 0 26
com/back/web7_9_codecrete_be/domain/email/entity 0.00% 0 6
com/back/web7_9_codecrete_be/domain/community/comment/service 0.00% 0 17
com/back/web7_9_codecrete_be/domain/auth/controller 0.00% 0 24
com/back/web7_9_codecrete_be/domain/community/comment/controller 0.00% 0 7
com/back/web7_9_codecrete_be/domain/artists/controller 0.00% 0 34
com/back/web7_9_codecrete_be/domain/community/comment/entity 0.00% 0 12
com/back/web7_9_codecrete_be/domain/community/post/controller 0.00% 0 20
com/back/web7_9_codecrete_be/global/aspect 0.00% 0 4
com/back/web7_9_codecrete_be/global/wikidata 0.27% 1 374
com/back/web7_9_codecrete_be/global/musicbrainz 0.46% 1 215
com/back/web7_9_codecrete_be/domain/artists/service 0.54% 4 740
com/back/web7_9_codecrete_be/domain/users/service 0.96% 1 103
com/back/web7_9_codecrete_be/domain/email/service 1.61% 1 61
com/back/web7_9_codecrete_be/global/flo 1.85% 1 53
com/back/web7_9_codecrete_be/domain/chats/service 2.27% 2 86
com/back/web7_9_codecrete_be/domain/concerts/controller 2.50% 1 39
com/back/web7_9_codecrete_be/domain/concerts/entity 3.26% 3 89
com/back/web7_9_codecrete_be/domain/concerts/repository 3.45% 1 28
com/back/web7_9_codecrete_be/global/storage 3.57% 2 54
com/back/web7_9_codecrete_be/domain/concerts/service 4.78% 25 498
com/back/web7_9_codecrete_be/domain/artists/entity 6.45% 4 58
com/back/web7_9_codecrete_be/global/rq 9.80% 5 46
com/back/web7_9_codecrete_be/domain/users/util 14.29% 1 6
com/back/web7_9_codecrete_be/domain/chats/controller 16.67% 2 10
com/back/web7_9_codecrete_be/domain/community/post/entity 16.67% 6 30
com/back/web7_9_codecrete_be/domain/plans/entity 21.88% 21 75
com/back/web7_9_codecrete_be/domain/users/entity 23.08% 12 40
com/back/web7_9_codecrete_be/global/security 27.62% 29 76
com/back/web7_9_codecrete_be/global/spotify 35.71% 5 9
com/back/web7_9_codecrete_be/domain/location/service 43.07% 59 78
com/back/web7_9_codecrete_be/global/doc 100.00% 17 0
Lowest Covered Classes (Top 20)
Class Line % Covered Missed
com.back.web7_9_codecrete_be.domain.plans.service.PlanService 0.00% 0 362
com.back.web7_9_codecrete_be.domain.artists.service.EnrichStepExecutor 0.00% 0 130
com.back.web7_9_codecrete_be.domain.artists.service.ArtistService 0.00% 0 98
com.back.web7_9_codecrete_be.domain.artists.service.WikidataEnrichHelper 0.00% 0 78
com.back.web7_9_codecrete_be.domain.auth.service.AuthService 0.00% 0 73
com.back.web7_9_codecrete_be.global.initData.BaseInitData 0.00% 0 54
com.back.web7_9_codecrete_be.domain.plans.controller.PlanController 0.00% 0 49
com.back.web7_9_codecrete_be.domain.location.controller.KakaoApiController 0.00% 0 43
com.back.web7_9_codecrete_be.domain.concerts.entity.Concert 0.00% 0 42
com.back.web7_9_codecrete_be.domain.artists.entity.Artist 0.00% 0 40
com.back.web7_9_codecrete_be.domain.chats.service.ChatPolicyService 0.00% 0 38
com.back.web7_9_codecrete_be.domain.plans.entity.Schedule 0.00% 0 37
com.back.web7_9_codecrete_be.global.security.JwtTokenProvider 0.00% 0 37
com.back.web7_9_codecrete_be.domain.community.post.service.PostService 0.00% 0 36
com.back.web7_9_codecrete_be.domain.users.entity.User 0.00% 0 31
com.back.web7_9_codecrete_be.domain.location.service.LocationService 0.00% 0 30
com.back.web7_9_codecrete_be.domain.concerts.entity.ConcertPlace 0.00% 0 29
com.back.web7_9_codecrete_be.domain.plans.entity.Plan 0.00% 0 27
com.back.web7_9_codecrete_be.domain.artists.controller.ArtistsController 0.00% 0 27
com.back.web7_9_codecrete_be.domain.auth.service.TokenService 0.00% 0 26
Changed Classes (from this PR)
Source (PR) Class Prefix Line % Covered Missed
src/main/java/com/back/web7_9_codecrete_be/domain/chats/service/ChatPolicyService.java com.back.web7_9_codecrete_be.domain.chats.service.ChatPolicyService 0.00% 0 38
src/main/java/com/back/web7_9_codecrete_be/domain/chats/service/ChatRoomService.java com.back.web7_9_codecrete_be.domain.chats.service.ChatRoomService 0.00% 0 15
src/main/java/com/back/web7_9_codecrete_be/domain/chats/service/ChatMessageReadService.java com.back.web7_9_codecrete_be.domain.chats.service.ChatMessageReadService 0.00% 0 5
src/main/java/com/back/web7_9_codecrete_be/domain/chats/controller/ChatMessageReadController.java com.back.web7_9_codecrete_be.domain.chats.controller.ChatMessageReadController 0.00% 0 2
src/main/java/com/back/web7_9_codecrete_be/domain/chats/controller/ChatRoomController.java com.back.web7_9_codecrete_be.domain.chats.controller.ChatRoomController 0.00% 0 2
src/main/java/com/back/web7_9_codecrete_be/domain/chats/dto/request/ChatMessageRequest.java com.back.web7_9_codecrete_be.domain.chats.dto.request.ChatMessageRequest 0.00% 0 0
src/main/java/com/back/web7_9_codecrete_be/domain/chats/dto/response/ChatMessageResponse.java com.back.web7_9_codecrete_be.domain.chats.dto.response.ChatMessageResponse 0.00% 0 0
src/main/java/com/back/web7_9_codecrete_be/domain/chats/dto/response/ChatReadResponse.java com.back.web7_9_codecrete_be.domain.chats.dto.response.ChatReadResponse 0.00% 0 0
src/main/java/com/back/web7_9_codecrete_be/domain/chats/dto/response/ChatUserCache.java com.back.web7_9_codecrete_be.domain.chats.dto.response.ChatUserCache 0.00% 0 0
src/main/java/com/back/web7_9_codecrete_be/domain/chats/repository/ChatStreamRepository.java com.back.web7_9_codecrete_be.domain.chats.repository.ChatStreamRepository 0.00% 0 0
src/main/java/com/back/web7_9_codecrete_be/domain/users/service/UserService.java com.back.web7_9_codecrete_be.domain.users.service.UserService 1.00% 1 99
src/main/java/com/back/web7_9_codecrete_be/domain/chats/service/ChatUserCacheService.java com.back.web7_9_codecrete_be.domain.chats.service.ChatUserCacheService 6.25% 1 15
src/main/java/com/back/web7_9_codecrete_be/domain/chats/service/ChatMessageService.java com.back.web7_9_codecrete_be.domain.chats.service.ChatMessageService 7.14% 1 13
src/main/java/com/back/web7_9_codecrete_be/domain/chats/controller/ChatMessageController.java com.back.web7_9_codecrete_be.domain.chats.controller.ChatMessageController 20.00% 1 4
src/main/java/com/back/web7_9_codecrete_be/domain/chats/controller/ChatStompDocsController.java com.back.web7_9_codecrete_be.domain.chats.controller.ChatStompDocsController 33.33% 1 2
src/main/java/com/back/web7_9_codecrete_be/global/security/SecurityConfig.java com.back.web7_9_codecrete_be.global.security.SecurityConfig 100.00% 25 0

🔗 Full HTML report: See artifact jacoco-full-html on this run → https://github.com/prgrms-web-devcourse-final-project/WEB7_9_codecrete_BE/actions/runs/20558018198

LocalDateTime ticketTime = concert.getTicketTime();
if (ticketTime == null) {
return Duration.ofMinutes(0);
return Duration.ofMinutes(10);
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

티켓 타임이 존재하지 않는 경우 왜 10분을 반환하는지 알 수 있을까요?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

ticketTime이 없는 경우 TTL을 0으로 두면 매 요청마다 DB 조회가 발생하므로,
불필요한 DB 부하를 방지하고 추후 ticketTime 저장 시 정책이 반영되도록 TTL을 10분으로 했습니다!

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

아하 그런 이유였군요 감사합니다!

private final UserRepository userRepository;

private String cacheKey(String email) {
return "chat:user:" + email;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

email외에 짧은 식별값을 쓰는 것도 좋을 것 같습니다!

private String exclusiveBefore(String messageId) {
String[] parts = messageId.split("-");
long time = Long.parseLong(parts[0]); // 밀리초 타임스탬프
long seq = Long.parseLong(parts[1]); // 같은 밀리초 내 순번
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

같은 시간 내에서도 순번을 정하신것 좋은 방법인 것 같습니다

Copy link
Copy Markdown
Collaborator

@Creamcheesepie Creamcheesepie 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
Copy Markdown
Collaborator

@ys0221 ys0221 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
Copy Markdown
Collaborator

@kms152000 kms152000 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
Copy Markdown
Collaborator

@tobbot16 tobbot16 left a comment

Choose a reason for hiding this comment

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

수고하셨습니다!

@Creamcheesepie Creamcheesepie merged commit cf3da3c into main Dec 29, 2025
2 checks passed
@Creamcheesepie Creamcheesepie deleted the feat/#185 branch December 29, 2025 08:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Chat] Redis Stream기반 채팅 메시지 관리

6 participants