[TIL #42] [최종프로젝트] 채팅 서비스 개발2 - 채팅방 설계

2025. 2. 19. 16:54·개발/내일배움캠프 TIL

앞서 웹소켓과 STOMP를 이용해 간단하게 실시간 채팅을 할 수 있는 기능을 구현해봤다.

이제 유저들이 원하는 유저와 채팅을 할 수 있는 채팅방 기능을 만든 과정을 기록한다.

 

테이블 설계

 

유저와 채팅방의 관계를 그려보면 유저도 여러개의 채팅방을 가질 수 있고, 채팅방도 여러 유저를 가질 수 있는 구조이다.

다대다 관계인데 ManyToMany 는 복잡성과 유지보수, 성능 등등 여러방면으로 피해야 한다는 말은 많이 들어봤을 것이며,

이런 경우 대부분 중간 연결 테이블을 두어 해결한다. 이번에도 그 방식으로 진행하였다.

이번 프로젝트에선 기본적으로 1:1 채팅방을 기획하였지만 추후 그룹 채팅방 기능에 대한 확장 가능성을 열어두기 위해

인원수 제한은 두지 않았다.

 

다음과 같은 구조로 ERD를 작성하였다.

 

채팅방은 우선 채팅방 생성, 채팅방 나가기, 채팅방 목록 조회 3개의 API만 구현하였고, 기본적인 CRUD로 코드에 대한 내용은 생략한다.

String chatroomTitle = (StringUtils.hasText(title))
			? authUser.getNickName() + ", " + targetUser.getNickName()
			: title;

 

카톡처럼 개인한테 대화신청을 하는 경우 제목을 따로 입력하지 않기 때문에 미입력시 상대방닉네임 + 본인닉네임으로 설정했다.

그리고 추후 그룹채팅방을 개발하게 된다면 이 경우는 제목을 입력하는 경우가 많기 때문에 제목 입력에 대한 가능성 또한 열어두었다.

 

@Getter
@RequiredArgsConstructor
public class ChatroomListResponseDto {
	private final Long chatroomId;
	private final String nickname;
	public static ChatroomListResponseDto from(ChatroomEntity chatroom, Long userId) {
		String nickname = chatroom.getUserSet().stream()
			.map(ChatroomParticipantEntity::getUser)
			.filter(user -> !user.getId().equals(userId))
			.map(UserEntity::getNickName)
			.findFirst()
			.orElse(chatroom.getTitle());
		return new ChatroomListResponseDto(chatroom.getId(), nickname);
	}
}

채팅방 목록 조회에서 1:1 채팅방 목록을 생각해본다면 대부분의 채팅 서비스는 제목이 아니라 상대방 닉네임이 표기된다.

그래서 응답 dto에서 채팅방의 유저 리스트에서 본인Id와 다른 유

저의 닉네임을 가져와 넣어주는 방식으로 진행했다.

 

채팅방으로 이동하면 웹소켓으로 연결되고 그에 맞는 경로로 메시지를 주고받을 수 있도록 개발을 완료하였다.

 

/pub/chats/15 (15는 채팅방ID) 으로 메시지를 발행하면, /sub/chats/15 를 구독하는 클라이언트로 전송되는 것을 확인할 수 있었다.

'개발 > 내일배움캠프 TIL' 카테고리의 다른 글

[최종프로젝트] 쓰레드풀 튜닝 / 캐시 전략을 활용한 채팅 메시지 성능 개선  (0) 2025.03.24
[최종프로젝트] 채팅 서비스 개발3 - 채팅 기록 저장  (0) 2025.02.25
[TIL #40] 자바에서 데이터베이스 접근하기  (0) 2025.01.14
[TIL #39] 탈퇴한 회원 관리 테이블 분리 VS 필드 트러블 슈팅  (0) 2025.01.12
[TIL #38] Spring 심화 주차 과제 Lv 6 기능 개선하기  (0) 2025.01.06
'개발/내일배움캠프 TIL' 카테고리의 다른 글
  • [최종프로젝트] 쓰레드풀 튜닝 / 캐시 전략을 활용한 채팅 메시지 성능 개선
  • [최종프로젝트] 채팅 서비스 개발3 - 채팅 기록 저장
  • [TIL #40] 자바에서 데이터베이스 접근하기
  • [TIL #39] 탈퇴한 회원 관리 테이블 분리 VS 필드 트러블 슈팅
BigChoi93
BigChoi93
이곳은 저의 성장과정과 개인적인 생각을 담기 위한 공간입니다.
  • BigChoi93
    Donologue
    BigChoi93
  • 전체
    오늘
    어제
    • 분류 전체보기 (61)
      • 개발 (53)
        • Javascript (2)
        • 내일배움캠프 TIL (41)
        • 개발일기 (4)
        • Java (2)
        • Spring (1)
        • Sql (1)
      • 일상 (0)
      • 사진 (1)
        • 포토샵 (1)
  • hELLO· Designed By정상우.v4.10.1
BigChoi93
[TIL #42] [최종프로젝트] 채팅 서비스 개발2 - 채팅방 설계
상단으로

티스토리툴바