Skip to content

Commit 829369b

Browse files
authored
Refactor: Redis 로직 최적화 및 중복 검증 로직 제거 (#193) (#209)
* refactor: 스더티룸 권한에 대한 로직 개선 * fix: ci에서 통과 못한 테스트코드 수정 * fix:rest api와 웹소켓 중간 경로 통합 * fix:rest api와 웹소켓 중간 경로 통합 * fix: 에러 확인을 위한 통합테스트 추가, Room.create()메서드 수정 * refactor, feat : 조회 분할 * refactor: redis 로직 최적화 및 중복 검증 로직 제거 * fix: 에러 번호 수정
1 parent 2004fd1 commit 829369b

File tree

15 files changed

+247
-411
lines changed

15 files changed

+247
-411
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.back.domain.studyroom.dto;
2+
3+
import com.back.domain.studyroom.entity.RoomRole;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
7+
import java.time.LocalDateTime;
8+
9+
/**
10+
* 멤버 입장 알림 DTO
11+
* WebSocket을 통해 방 참가자들에게 브로드캐스트
12+
*/
13+
@Getter
14+
@Builder
15+
public class MemberJoinedNotification {
16+
private Long roomId;
17+
private Long userId;
18+
private String nickname;
19+
private String profileImageUrl;
20+
private RoomRole role; // 입장 시 역할 (보통 VISITOR)
21+
private LocalDateTime timestamp;
22+
23+
public static MemberJoinedNotification of(Long roomId, Long userId, String nickname,
24+
String profileImageUrl, RoomRole role) {
25+
return MemberJoinedNotification.builder()
26+
.roomId(roomId)
27+
.userId(userId)
28+
.nickname(nickname)
29+
.profileImageUrl(profileImageUrl)
30+
.role(role)
31+
.timestamp(LocalDateTime.now())
32+
.build();
33+
}
34+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.back.domain.studyroom.dto;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
6+
import java.time.LocalDateTime;
7+
8+
/**
9+
* 멤버 퇴장 알림 DTO
10+
* WebSocket을 통해 방 참가자들에게 브로드캐스트
11+
*/
12+
@Getter
13+
@Builder
14+
public class MemberLeftNotification {
15+
private Long roomId;
16+
private Long userId;
17+
private String nickname;
18+
private LocalDateTime timestamp;
19+
20+
public static MemberLeftNotification of(Long roomId, Long userId, String nickname) {
21+
return MemberLeftNotification.builder()
22+
.roomId(roomId)
23+
.userId(userId)
24+
.nickname(nickname)
25+
.timestamp(LocalDateTime.now())
26+
.build();
27+
}
28+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.back.domain.studyroom.dto;
2+
3+
import com.back.domain.studyroom.entity.RoomStatus;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
7+
import java.time.LocalDateTime;
8+
9+
/**
10+
* 방 상태 변경 알림 DTO
11+
* WebSocket을 통해 방 참가자들에게 브로드캐스트
12+
*/
13+
@Getter
14+
@Builder
15+
public class RoomStatusChangedNotification {
16+
private Long roomId;
17+
private RoomStatus oldStatus;
18+
private RoomStatus newStatus;
19+
private String changedBy; // 변경한 사용자 닉네임
20+
private LocalDateTime timestamp;
21+
22+
public static RoomStatusChangedNotification of(Long roomId, RoomStatus oldStatus,
23+
RoomStatus newStatus, String changedBy) {
24+
return RoomStatusChangedNotification.builder()
25+
.roomId(roomId)
26+
.oldStatus(oldStatus)
27+
.newStatus(newStatus)
28+
.changedBy(changedBy)
29+
.timestamp(LocalDateTime.now())
30+
.build();
31+
}
32+
}

src/main/java/com/back/domain/studyroom/entity/Room.java

Lines changed: 9 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,6 @@ public class Room extends BaseEntity {
3535
@Column(nullable = false)
3636
private RoomStatus status = RoomStatus.WAITING;
3737

38-
// 현재 참여자
39-
@Builder.Default
40-
@Column(nullable = false)
41-
private int currentParticipants = 0;
42-
4338
// 방장
4439
@ManyToOne(fetch = FetchType.LAZY)
4540
@JoinColumn(name = "created_by")
@@ -74,40 +69,22 @@ public class Room extends BaseEntity {
7469
/**
7570
* 방에 입장할 수 있는지 확인
7671
* 사용 상황: 사용자가 방 입장을 시도할 때 입장 가능 여부를 미리 체크
77-
방이 활성화되어 있고, 입장 가능한 상태이며, 정원이 초과되지 않은 경우
72+
* 방이 활성화되어 있고, 입장 가능한 상태인 경우
73+
*
74+
* 정원 체크는 Redis에서 실시간으로 수행 (RoomService에서 처리)
7875
*/
7976
public boolean canJoin() {
80-
return isActive && status.isJoinable() && currentParticipants < maxParticipants;
77+
return isActive && status.isJoinable();
8178
}
8279

8380
/**
8481
* 방의 정원이 가득 찼는지 확인
85-
방 목록에서 "만석" 표시하거나, 입장 제한할 때
86-
*/
87-
public boolean isFull() {
88-
return currentParticipants >= maxParticipants;
89-
}
90-
91-
/**
92-
* 참가자 수 증가 (최대 정원까지만)
93-
누군가 방에 입장했을 때 참가자 수를 1 증가시킴
94-
최대 정원을 초과하지 않도록 체크
82+
*
83+
* 실제 정원 체크는 Redis 기반으로 RoomService에서 수행
84+
* 이 메서드는 UI 표시용으로만 사용 (최대 정원 반환)
9585
*/
96-
public void incrementParticipant() {
97-
if (currentParticipants < maxParticipants) {
98-
this.currentParticipants++;
99-
}
100-
}
101-
102-
/**
103-
* 참가자 수 감소 (0 이하로는 감소하지 않음)
104-
누군가 방에서 나갔을 때 참가자 수를 1 감소시킴
105-
음수가 되지 않도록 체크
106-
*/
107-
public void decrementParticipant() {
108-
if (this.currentParticipants > 0) {
109-
this.currentParticipants--;
110-
}
86+
public int getMaxCapacity() {
87+
return maxParticipants;
11188
}
11289

11390
/**
@@ -184,7 +161,6 @@ public static Room create(String title, String description, boolean isPrivate,
184161
room.allowAudio = useWebRTC; // WebRTC 사용 여부에 따라 설정
185162
room.allowScreenShare = useWebRTC; // WebRTC 사용 여부에 따라 설정
186163
room.status = RoomStatus.WAITING; // 생성 시 대기 상태
187-
room.currentParticipants = 0; // 생성 시 참가자 0명
188164
room.createdBy = creator;
189165
room.theme = theme;
190166

src/main/java/com/back/domain/studyroom/repository/RoomMemberRepositoryCustom.java

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,6 @@ public interface RoomMemberRepositoryCustom {
1818
*/
1919
List<RoomMember> findByRoomIdOrderByRole(Long roomId);
2020

21-
/**
22-
* 방의 온라인 멤버 조회
23-
* TODO: Redis 기반으로 변경 예정
24-
* 현재는 DB에 저장된 모든 멤버 반환 (임시)
25-
*/
26-
@Deprecated
27-
List<RoomMember> findOnlineMembersByRoomId(Long roomId);
28-
29-
/**
30-
* 방의 활성 멤버 수 조회
31-
* TODO: Redis 기반으로 변경 예정
32-
*/
33-
@Deprecated
34-
int countActiveMembersByRoomId(Long roomId);
35-
3621
/**
3722
* 사용자가 참여 중인 모든 방의 멤버십 조회
3823
* DB에 저장된 멤버십만 조회 (MEMBER 이상)
@@ -72,30 +57,4 @@ public interface RoomMemberRepositoryCustom {
7257
* @return 멤버십 목록 (MEMBER 이상만 DB에 있음)
7358
*/
7459
List<RoomMember> findByRoomIdAndUserIdIn(Long roomId, java.util.Set<Long> userIds);
75-
76-
/**
77-
* 특정 역할의 멤버 수 조회
78-
* TODO: Redis 기반으로 변경 예정
79-
*/
80-
@Deprecated
81-
int countByRoomIdAndRole(Long roomId, RoomRole role);
82-
83-
/**
84-
* 방 퇴장 처리 (벌크 업데이트)
85-
* TODO: Redis로 이관 예정, DB에는 멤버십만 유지
86-
*/
87-
@Deprecated
88-
void leaveRoom(Long roomId, Long userId);
89-
90-
/**
91-
* 방의 모든 멤버를 오프라인 처리 (방 종료 시)
92-
* TODO: Redis로 이관 예정
93-
*/
94-
@Deprecated
95-
void disconnectAllMembers(Long roomId);
96-
97-
/**
98-
* 스터디룸의 모든 멤버 User ID 조회 (알림 전송용)
99-
*/
100-
List<Long> findUserIdsByRoomId(Long roomId);
10160
}

0 commit comments

Comments
 (0)