본문 바로가기

Project11

채팅기능 고도화 (STOMP + JWT 토큰 인증 + 전송시 유저 정보 + sessionId 확인) 저번에 엄청 간단한 채팅기능을 웹소켓만으로 구현을 했다. 클라이언트에서 소켓 연결을 열고, 서버는 연결된 세션을 직접 관리하면서 채팅방별 메시지를 구분하고 전달하는 구조였다.근데 개발이 진행되면서 몇 가지 문제가 생겼다! 1. 채팅방 별 메시지 구분이 번거로웠고 직접 방 ID를 파싱 해서 라우팅해야 했다.2. 유저에게 특정 메시지를 보내려면 세션 ID와 유저 ID를 수동으로 매핑해서 관리해야 했다.3. 메시지 형식이 자유로워 정해진 규약 없이 문자열 파싱으로 사용했다. 이로 인해 코드가 계속 복잡해지고 유지보수가 힘들 것 같다는 느낌이 들었다! 검색을 통해 찾아본 결과 STOMP라는 게 있었다. STOMP란? 쉽게 설명하면 웹소켓은 실시간 통신을 위한 기본적인 통신 프로토콜이고, STOMP는 그 위에 .. 2025. 7. 2.
간단한 실시간 채팅 구현 feat. postman 테스트 현재 내가 진행하고 있는 프로젝트가 실시간 채팅이 필요하기 때문에실시간 채팅을 차근차근 구현해 볼 거다. 전 게시글에서 설명했던 양방향 통신인 웹소켓을 사용할 것이고웹소켓을 통해 간단한 채팅방을 만들고 postman을 통해서 테스트를 해보면서 내 프로젝트에 적용해 볼 생각이다. 시작해 보자!! 자 먼저 뭘 해야 하냐 // WebSocket 관련 의존성 추가implementation 'org.springframework.boot:spring-boot-starter-websocket' 웹소켓을 쓰기 위한 의존성부터 추가해 준다! 그리고 웹소켓을 핸들링해줄 핸들러를 만들어보자 ~~ @Slf4j@Componentpublic class ChatWebSocketHandler extends TextWebSock.. 2025. 6. 30.
실시간 채팅 구현 전 개념 정리 🤔 왜 HTTP로는 실시간 채팅이 안 될까?HTTP의 근본적인 한계HTTP는 요청-응답 구조입니다: 👤 클라이언트: "서버야, 새 메시지 있어?"🖥️ 서버: "없다"[연결 끊어짐]👤 클라이언트: "서버야, 새 메시지 있어?" (다시 연결)🖥️ 서버: "없다" [연결 끊어짐]👤 클라이언트: "서버야, 새 메시지 있어?" (또 다시 연결)🖥️ 서버: "있다. -> '안녕하세요'"[연결 끊어짐]HTTP 문제점1. 지연시간 문제실제 메시지가 10:00:01에 도착했는데클라이언트가 10:00:05에 물어봐야 받을 수 있음4초 지연! 😱2. 서버 부하 문제 사용자 1000명이 1초마다 "새 메시지 있어?" 물어봄= 1초에 1000번 요청= 대부분 "없어"라는 답변만 받음= 99%가 쓸데없는 트래픽!.. 2025. 6. 30.
로그인 사용자가 어떤 댓글에 좋아요를 눌렀는가에서 발생한 N+1 문제 해결 대충 개발이 끝나고마지막 실시간 채팅개발을 하기 전 점검을 하던 중에😱 새로운 문제가 생겼다. "사용자가 어떤 댓글에 좋아요를 눌렀는지" 정보를 클라이언트에 보내줘야 했다.왜냐하면 클라이언트에서 이런 UI를 보여줘야 하기 때문이다:💬 "정말 좋은 글이네요!" ❤️ 15 (빨간 하트 - 내가 좋아요 누름)💬 "동감합니다" 🤍 3 (빈 하트 - 내가 좋아요 안 누름)🤔 처음에 짠 멍청한 코드처음에는 이렇게 구현했다:public Page getRootComments(Long postId, int page, int size, UserPrincipal userPrincipal) { // 1. 댓글 목록 조회 Page rootComments = comme.. 2025. 6. 27.
댓글 조회 리팩토링중 - feat.인덱스 전에 게시글들을 보았으면 내가 얼마나 멍청하게 댓글들을 불러왔는지 알 수 있다.사실 블로그에 글을 쓰고 인지를 하여 그냥 모든 개발이 끝나고 리팩토링 해야지 했는데 자꾸 걸려서 미리 리팩토링 하게 되었다. 전에는 댓글을 페이지네이션 하나 없이 모든 댓글 + 대댓글을 다 불러왔다. 사실 소량의 데이터면 상관은 없는데사용자의 사용성은 나눠서 보여주는 게 낫기 때문에 한 번에 다 보여주는 것보단대댓글은 숨기고 보여주고 할 필요가 있다고 생각했다. 페이지네이션은 잘 마쳤다!(페이지네이션에 대한 내용은 전에 게시글 페이지네이션 했던 글 봐주세요) 이제 댓글에 대댓글이 있는지 정보를 클라이언트에 보내줘야 클라이언트가 -대댓글 더보기..- 뭐 이런 UI를 달아줄 수 있기 때문이다. 백엔드 쪽에선 단순히 true/.. 2025. 6. 18.
게시글 조건 조회 - QueryDSL (동적 쿼리) feat. 페이징 안 그래도 댓글과 대댓글을 각각 페이징 해서 불러오지 않고 한꺼번에 모든 게시글의 댓글을 불러오게 구현해서 나중에 리팩터링 해야겠다고 생각했던 참이었는데 메인 화면에 보일 게시글들을 조건에 맞게 조회해와야 하는 일이 생겼다. 어차피 댓글은 나중에 리팩토링 할 거고 지금 한 번 구현바로 해볼 생각에 기분이 좋아졌다. 일단 게시글은 최신순, 좋아요 순, 조회순으로 조회가 가능해야한다! 그러면 각각 쿼리를 따로따로 만들어야 하나? 복잡해요.. 저번 포스팅에 잠깐 얘기했던 QueryDSL을 사용할 시간이다.동적 쿼리를 사용할 땐 QueryDSL을 사용하면 굉장히 편하고 효율적으로 작성할 수 있다. 그리고 나중에 최신순, 좋아요 순, 조회순 이런 간단한 게 아니라막 좋아요 10개 이상, 특정 키워드 포함,.. 2025. 6. 15.