전체 글85 채팅기능 고도화 (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. [Programmers] 입국 심사 [문제 링크]https://school.programmers.co.kr/learn/courses/30/lessons/43238 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr [코드]import java.util.*;class Solution { public long solution(int n, int[] times) { Arrays.sort(times); // 이분 탐색을 위한 정렬 long left = 0; // 최소 시간 long right = (long) times[times.length - 1] * n; // 최대 시간 long ans.. 2025. 6. 26. [Programmers] 순위 검색 [문제 링크]https://school.programmers.co.kr/learn/courses/30/lessons/72412 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr [풀이 과정]말이 필요 없습니다. 한 번 보세요..보고 스스로 몇번 풀다보니 이해됬습니다. https://www.youtube.com/watch?v=vFwVvJQnC4M [코드]import java.util.*;class Solution { public int[] solution(String[] info, String[] query) { Map> hashMap = new HashMap(); /.. 2025. 6. 25. 이전 1 2 3 4 5 ··· 15 다음