Skip to content

Commit cfa8a0e

Browse files
authored
refactor: RoomMember 엔티티에서 실시간 상태 필드 제거, redis로 이관 (#143)
1 parent 564b0e6 commit cfa8a0e

File tree

11 files changed

+103
-274
lines changed

11 files changed

+103
-274
lines changed

src/main/java/com/back/domain/studyroom/dto/RoomMemberResponse.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@ public class RoomMemberResponse {
1313
private Long userId;
1414
private String nickname;
1515
private RoomRole role;
16-
private boolean isOnline;
1716
private LocalDateTime joinedAt;
18-
private LocalDateTime lastActiveAt;
17+
private LocalDateTime promotedAt;
18+
19+
// TODO: isOnline은 Redis에서 조회하여 추가 예정
1920

2021
public static RoomMemberResponse from(RoomMember member) {
2122
return RoomMemberResponse.builder()
2223
.userId(member.getUser().getId())
2324
.nickname(member.getUser().getNickname())
2425
.role(member.getRole())
25-
.isOnline(member.isOnline())
2626
.joinedAt(member.getJoinedAt())
27-
.lastActiveAt(member.getLastActiveAt() != null ? member.getLastActiveAt() : member.getJoinedAt())
27+
.promotedAt(member.getPromotedAt())
2828
.build();
2929
}
3030
}

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

Lines changed: 23 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,9 @@ public class RoomMember extends BaseEntity {
4141

4242
// 멤버십 기본 정보
4343
@Column(nullable = false)
44-
private LocalDateTime joinedAt; // 방에 처음 입장한 시간
45-
private LocalDateTime lastActiveAt; // 마지막으로 활동한 시간
46-
47-
// 실시간 상태 관리 필드들
48-
@Column(nullable = false)
49-
private boolean isOnline = false; // 현재 방에 온라인 상태인지
50-
51-
private String connectionId; // WebSocket 연결 ID (실시간 통신용)
52-
53-
private LocalDateTime lastHeartbeat; // 마지막 heartbeat 시간 (연결 상태 확인용)
44+
private LocalDateTime joinedAt; // MEMBER 이상으로 승격된 시간
45+
46+
private LocalDateTime promotedAt; // 권한이 변경된 시간
5447

5548
// 💡 권한 확인 메서드들 (RoomRole enum의 메서드를 위임)
5649

@@ -95,28 +88,28 @@ public boolean isMember() {
9588
}
9689

9790
/**
98-
* 현재 활성 상태인지 확인
99-
온라인 멤버 목록 표시, 비활성 사용자 정리 등
100-
온라인 상태이고 최근 설정된 시간 이내에 heartbeat가 있었던 경우
91+
* 현재 활성 상태인지 확인 (Redis 기반으로 변경 예정)
92+
* 임시로 항상 true 반환
93+
* TODO: Redis에서 실시간 상태 확인하도록 변경
10194
*/
95+
@Deprecated
10296
public boolean isActive(int timeoutMinutes) {
103-
return isOnline && lastHeartbeat != null &&
104-
lastHeartbeat.isAfter(LocalDateTime.now().minusMinutes(timeoutMinutes));
97+
// 실시간 상태는 Redis에서 관리
98+
return true;
10599
}
106100

107101

108102
/**
109-
기본 멤버 생성 메서드, 처음 입장 시 사용
103+
기본 멤버 생성 메서드
104+
MEMBER 이상 등급 생성 시 사용 (DB 저장용)
110105
*/
111106
public static RoomMember create(Room room, User user, RoomRole role) {
112107
RoomMember member = new RoomMember();
113108
member.room = room;
114109
member.user = user;
115110
member.role = role;
116111
member.joinedAt = LocalDateTime.now();
117-
member.lastActiveAt = LocalDateTime.now();
118-
member.isOnline = true; // 생성 시 온라인 상태
119-
member.lastHeartbeat = LocalDateTime.now();
112+
member.promotedAt = LocalDateTime.now();
120113

121114
return member;
122115
}
@@ -128,18 +121,24 @@ public static RoomMember createHost(Room room, User user) {
128121

129122
/**
130123
* 일반 멤버 생성, 권한 자동 변경
131-
- 비공개 방에서 초대받은 사용자를 정식 멤버로 등록할 때 (로직 검토 중)
124+
* 비공개 방에서 초대받은 사용자를 정식 멤버로 등록할 때
132125
*/
133126
public static RoomMember createMember(Room room, User user) {
134127
return create(room, user, RoomRole.MEMBER);
135128
}
136129

137130
/**
138-
* 방문객 생성
139-
* 사용 상황: 공개 방에 처음 입장하는 사용자를 임시 방문객으로 등록
131+
* 방문객 생성 (메모리상으로만 존재, DB 저장 안함)
132+
* 공개 방에 처음 입장하는 사용자용
133+
* Redis에서 실시간 상태 관리
140134
*/
141135
public static RoomMember createVisitor(Room room, User user) {
142-
return create(room, user, RoomRole.VISITOR);
136+
RoomMember member = new RoomMember();
137+
member.room = room;
138+
member.user = user;
139+
member.role = RoomRole.VISITOR;
140+
member.joinedAt = LocalDateTime.now();
141+
return member;
143142
}
144143

145144
/**
@@ -148,47 +147,6 @@ public static RoomMember createVisitor(Room room, User user) {
148147
*/
149148
public void updateRole(RoomRole newRole) {
150149
this.role = newRole;
151-
}
152-
153-
/**
154-
* 온라인 상태 변경
155-
* 사용 상황: 멤버가 방에 입장하거나 퇴장할 때
156-
활동 시간도 함께 업데이트, 온라인이 되면 heartbeat도 갱신
157-
*/
158-
public void updateOnlineStatus(boolean online) {
159-
this.isOnline = online;
160-
this.lastActiveAt = LocalDateTime.now();
161-
if (online) {
162-
this.lastHeartbeat = LocalDateTime.now();
163-
}
164-
}
165-
166-
/**
167-
* WebSocket 연결 ID 업데이트
168-
* 사용 상황: 멤버가 웹소켓으로 방에 연결될 때
169-
+ heartbeat도 함께 갱신
170-
*/
171-
public void updateConnectionId(String connectionId) {
172-
this.connectionId = connectionId;
173-
this.lastHeartbeat = LocalDateTime.now();
174-
}
175-
176-
/**
177-
* 사용 : 클라이언트에서 주기적으로 서버에 연결 상태를 알릴 때
178-
* 목적: 연결이 끊어진 멤버를 자동으로 감지하기 위해 사용, 별도의 다른 것으로 변경 가능
179-
*/
180-
public void heartbeat() {
181-
this.lastHeartbeat = LocalDateTime.now();
182-
this.lastActiveAt = LocalDateTime.now();
183-
this.isOnline = true;
184-
}
185-
186-
/**
187-
* 방 퇴장 처리 (명시적 퇴장과 연결 끊김 상태 로직 분할 예정임.. 일단은 임시로 통합 상태)
188-
멤버가 방을 나가거나 연결이 끊어졌을 때, 오프라인 상태로 변경하고 연결 ID 제거
189-
*/
190-
public void leave() {
191-
this.isOnline = false;
192-
this.connectionId = null;
150+
this.promotedAt = LocalDateTime.now();
193151
}
194152
}

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,5 @@
88

99
@Repository
1010
public interface RoomMemberRepository extends JpaRepository<RoomMember, Long>, RoomMemberRepositoryCustom {
11-
/**
12-
* WebSocket 연결 ID로 멤버 조회
13-
*/
14-
Optional<RoomMember> findByConnectionId(String connectionId);
11+
// 모든 메서드는 RoomMemberRepositoryCustom 인터페이스로 이동
1512
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,22 @@ public interface RoomMemberRepositoryCustom {
2020

2121
/**
2222
* 방의 온라인 멤버 조회
23+
* TODO: Redis 기반으로 변경 예정
24+
* 현재는 DB에 저장된 모든 멤버 반환 (임시)
2325
*/
26+
@Deprecated
2427
List<RoomMember> findOnlineMembersByRoomId(Long roomId);
2528

2629
/**
2730
* 방의 활성 멤버 수 조회
31+
* TODO: Redis 기반으로 변경 예정
2832
*/
33+
@Deprecated
2934
int countActiveMembersByRoomId(Long roomId);
3035

3136
/**
3237
* 사용자가 참여 중인 모든 방의 멤버십 조회
38+
* DB에 저장된 멤버십만 조회 (MEMBER 이상)
3339
*/
3440
List<RoomMember> findActiveByUserId(Long userId);
3541

@@ -60,16 +66,22 @@ public interface RoomMemberRepositoryCustom {
6066

6167
/**
6268
* 특정 역할의 멤버 수 조회
69+
* TODO: Redis 기반으로 변경 예정
6370
*/
71+
@Deprecated
6472
int countByRoomIdAndRole(Long roomId, RoomRole role);
6573

6674
/**
6775
* 방 퇴장 처리 (벌크 업데이트)
76+
* TODO: Redis로 이관 예정, DB에는 멤버십만 유지
6877
*/
78+
@Deprecated
6979
void leaveRoom(Long roomId, Long userId);
7080

7181
/**
7282
* 방의 모든 멤버를 오프라인 처리 (방 종료 시)
83+
* TODO: Redis로 이관 예정
7384
*/
85+
@Deprecated
7486
void disconnectAllMembers(Long roomId);
7587
}

0 commit comments

Comments
 (0)