Open
Conversation
Soundbar91
approved these changes
Feb 13, 2026
Comment on lines
23
to
25
| if (!callvanPost.getAuthor().getId().equals(userId)) { | ||
| throw CustomException.of(ApiResponseCode.FORBIDDEN_AUTHOR); | ||
| } |
Collaborator
There was a problem hiding this comment.
C
콜벤 게시글 작성자 검증 로직을 CallvanPost 내부에 넣어도 괜찮을 거 같아요 !
Collaborator
BaeJinho4028
left a comment
There was a problem hiding this comment.
feat: 콜벤 게시글 상세 정보 조회 GET API
feat: 콜벤 채팅 전송 및 조회 API
feat: 콜벤 알림 API
에 대한 간단 리뷰 남깁니다.
| ) { | ||
| public static CallvanPostDetailResponse from(CallvanPost post, Integer userId) { | ||
| String departureName = post.getDepartureType().getName(); | ||
| if (post.getDepartureCustomName() != null && !post.getDepartureCustomName().isBlank()) { |
Collaborator
There was a problem hiding this comment.
StringUtils.hasText() 써도 좋을거 같아요 1
| } | ||
|
|
||
| String arrivalName = post.getArrivalType().getName(); | ||
| if (post.getArrivalCustomName() != null && !post.getArrivalCustomName().isBlank()) { |
Collaborator
There was a problem hiding this comment.
StringUtils.hasText() 써도 좋을거 같아요 2
Comment on lines
52
to
53
| ) { | ||
| public static CallvanPostDetailResponse from(CallvanPost post, Integer userId) { |
Comment on lines
90
to
91
| ) { | ||
| public static CallvanParticipantResponse from(CallvanParticipant participant, Integer userId) { |
Comment on lines
23
to
24
| ) { | ||
| public static CallvanChatMessageResponse of(CallvanPost post, List<CallvanChatMessage> messages, Integer userId) { |
| @Schema(description = "내 메시지 여부", example = "true") | ||
| Boolean isMine | ||
| ) { | ||
| public static CallvanMessageDto from(CallvanChatMessage message, Integer currentUserId) { |
Comment on lines
56
to
64
| if(this.isDeleted) { | ||
| this.isDeleted = false; | ||
| } | ||
| } | ||
|
|
||
| public void leaveCallvan() { | ||
| if(!this.isDeleted) { | ||
| this.isDeleted = true; | ||
| } |
Comment on lines
68
to
73
| if (user.getNickname() != null) { | ||
| return user.getNickname(); | ||
| } | ||
| if (user.getAnonymousNickname() != null) { | ||
| return user.getAnonymousNickname(); | ||
| } |
Collaborator
There was a problem hiding this comment.
중복되어서 이게 모델에서 공통으로 처리를 해주거나, 근본적으로 해결할 수 있는 방법이 있을 거 같아요.
Comment on lines
98
to
103
| if (user.getNickname() != null) { | ||
| return user.getNickname(); | ||
| } | ||
| if (user.getAnonymousNickname() != null) { | ||
| return user.getAnonymousNickname(); | ||
| } |
Comment on lines
62
to
69
| if (notification.getDepartureCustomName() != null && !notification.getDepartureCustomName().isBlank()) { | ||
| departureName = notification.getDepartureCustomName(); | ||
| } | ||
|
|
||
| String arrivalName = notification.getArrivalType().getName(); | ||
| if (notification.getArrivalCustomName() != null && !notification.getArrivalCustomName().isBlank()) { | ||
| arrivalName = notification.getArrivalCustomName(); | ||
| } |
dh2906
reviewed
Feb 13, 2026
| #### 비즈니스 로직 | ||
| 1. 출발지/도착지 필터링 시, 선택된 장소 타입들에 해당하는 게시글을 조회합니다. | ||
| 2. `CUSTOM` 타입이 선택되고 키워드가 입력된 경우, 사용자가 직접 입력한 장소명에서 해당 키워드를 포함하는 게시글도 결과에 포함됩니다. | ||
| 3. 정렬 기준이 `DEPARTURE`인 경우, 출발 날짜와 시간 순으로 내림차순(최신 순) 정렬됩니다. |
Contributor
There was a problem hiding this comment.
명세에서는 내림차순 정렬로 되어있는데, CallvanPostQueryRepository에서 135번째 줄 메소드는 오름차순으로 정렬 되어있는 것 같으로 보여요!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🔍 개요
🚀 주요 변경 내용
비동기 이벤트 기반 알림 저장 구현
ApplicationEventPublisher와@TransactionalEventListener를 활용하여 도메인 이벤트 기반 알림 시스템을 구현sequenceDiagram participant Client participant Controller participant Service participant EventPublisher participant EventListener participant NotificationService participant DB Client->>Controller: POST /callvan/posts/{id}/participants Controller->>Service: join(postId, userId) Service->>DB: 참여자 저장 Service->>EventPublisher: publishEvent(ParticipantJoinedEvent) Service-->>Controller: 완료 Controller-->>Client: 201 Created Note over EventPublisher,EventListener: 트랜잭션 커밋 후 비동기 실행 EventPublisher->>EventListener: @TransactionalEventListener EventListener->>NotificationService: notifyParticipantJoined() NotificationService->>DB: 알림 저장 (다른 참여자들에게)Redis Sorted Set(ZSET) 기반 지연 작업 큐
sequenceDiagram participant PostCreate as 게시글 생성 participant Scheduler as CallvanNotificationScheduler participant Redis as Redis Sorted Set participant CronJob as @Scheduled (매분 실행) participant DB as Database PostCreate->>Scheduler: scheduleNotification(post) Scheduler->>Scheduler: 출발시간 - 30분 계산 Scheduler->>Redis: ZADD (score: timestamp) Note over Redis: Key: callvan:notification:queue<br/>Score: 알림 발송 시각 (epoch) loop 매분마다 CronJob->>Redis: ZRANGEBYSCORE (0, now) Redis-->>CronJob: 발송 시각 도래한 작업들 CronJob->>DB: 참여자들에게 알림 생성 CronJob->>Redis: ZREM (처리 완료된 작업 제거) end콜벤 가입 API 동시성 제어 적용
💬 참고 사항
✅ Checklist (완료 조건)