React3분
상태 관리 중앙화
2025년 5월 8일
방 관리 시스템 개선
기존의 방 관리 시스템에서 발생한 중복 코드와 타입 안정성 문제를 해결하기 위해 리팩토링 적용
- 방 상태 관리 중앙화
- WebSocket 통신 로직 통합
- 타입 시스템 강화
- 이벤트 처리 시스템 개선
1. RoomManager 클래스 개선
💡 주요 변경사항
싱글톤 패턴 적용
WebSocket 통신 통합
이벤트 기반 상태 관리
타입 안정성 강화
주요 기능:
- 방 상태 관리(roomInfo)
- 사용자 상태 관리(users)
- 이벤트 처리(eventEmitter)
- WebSocket 통신 (webSocket)
2. 타입 시스템 개선
typescript// Room.ts 에 추가된 타입
export type RoomStatus = "OPEN" | "IN_PROGRESS" | "CLOSED";
export type UserStatusType ="READY" | "NOT_READY";
3. 이벤트 시스템 구현
typescript// EventEmitter.ts
export class EventEmitter {
private events : {[key: string] : Function[] } = {};
on(event: string, callback: Function) : void;
off(event: string, callback: Function) : void
emit(event: string, data?: any): void
removeAllListeners(event?: string): void
}
4. RoomPreparePage 컴포넌트 개선
💡 주요 변경 사항
RoomManager 통합
WebSocket 로직 제거
상태 관리 단순화
이벤트 기반 업데이트
5. 삭제된 코드
- useRoomSocket.ts
typescript//기존 WebSocket 관련 로직이 RoomManager로 통합됨
export const useRoomSocket = (roomId: number, handlers: {[key: string]: (data: any} => void}) => {
const { subscribe, unsubscribe, connected, topics } = useWebSocket();
}
//... 삭제
- RoomPreparePage.tsx의 WebSocket 관련 코드
typescript// 삭제된 부분
const { subscribe, unsubscribe, send, connected, topics, messageTypes } = useWebSocket();
// WebSocket 메시지 처리 로직 삭제
const handleWebSocketMessage = useCallback (
(message: RoomMessage) => {
switch (message.type) {
case messageTypes.ROOM.INFO:
// 삭제 된 코드
}
},
[currentUserId, navigate, fetchRoomInfo, messageTypes.ROOM]
)
6. 통합된 코드
- RoomManager로 통합된 WebSocket 로직
typescript// RoomManager.ts에 추가된 코드
private webSocket = useWebSocket();
private initializeWebSocket() {
const { subscribe, topics } = this.webSocket;
subscribe(topics.ROOM(""), (message) => {
try {
const data = JSON.parse(message.body) as RoomMessage;
this.handleWebSocketMessage(data);
} catch (error) {
console.error("WebSocket 메시지 처리 실패:", error);
}
});
}
- 이벤트 처리 통합
typescript// RoomManager.ts에 통합된 이벤트 처리
private eventEmitter = new EventEmitter();
// 이벤트 발생
this.eventEmitter.emit("roomInfoUpdated", info);
this.eventEmitter.emit("usersUpdated", users);
// 이벤트 구독
subscribe(event: string, callback: Function) {
this.eventEmitter.on(event, callback);
}
7. 타입 변경사항
- Room.ts의 타입 정의 개선
typescript// 변경 전
export interface RoomInfo {
status: "OPEN" | "IN_PROGRESS" | "CLOSED";
// ... 기타 필드
}
// 변경 후
export type RoomStatus = "OPEN" | "IN_PROGRESS" | "CLOSED";
export interface RoomInfo {
status: RoomStatus;
// ... 기타 필드
}
- UserStatus 관련 타입 변경
typescript// 변경 전
export interface RoomMember {
status: "READY" | "NOT_READY";
// ... 기타 필드
}
// 변경 후
export type UserStatusType = "READY" | "NOT_READY";
export interface RoomMember {
status: UserStatusType;
// ... 기타 필드
}
- RoomMessage 타입 개선
typescript// 변경 전
interface RoomMessage {
type: string;
roomId: number;
data?: any;
}
// 변경 후
export interface RoomMessage {
type: RoomMessageType;
roomId: number;
data?: {
roomInfo?: RoomInfo;
member?: RoomMember;
message?: string;
};
}
주요 변경 효과
- 코드 구조화
- 방 관리 로직이 RoomManager로 중앙화 됨
- 컴포넌트와 비즈니스 로직의 분리
- 재사용성 향상
- 타입 안정성
- 명확한 타입 정의
- 컴파일 시점 오류 감지
- 코드 품질 향상
- 이벤트 처리
- 이벤트 기반 상태 관리
- 느슨한 결합
- 확장성 향상
- 유지보수성
- 코드 중복 제거
- 명확한 책임 분리
- 테스트 용이성
태그
#React