[Spring] 1 대 1 실시간 채팅 구현하기 - Stomp, MongoDB, Redis
·
Backend/Spring
1. 배경 및 목표1) 배경사용자 간 빠른 소통을 위한 실시간 채팅의 필요성이 제시됐습니다.이전에 실시간 채팅을 구현해본 경험이 있습니다. [WebSocket] Spring, React, Stomp로 실시간 채팅, 저장 구현하기팀원들과 프로젝트를 진행하였고 의미 있는 내용들을 포스팅 해보려고 합니다.프로젝트는 다음과 같이 진행되었습니다.Java 17Spring Boot 3.2.0JPAGradleReact저에게는 자그마한 꿈이 있었습니다. 바로5g-0.tistory.com 이 구조를 그대로 실서비스에 적용하기에는 사용성이 떨어질 수 있다고 판단했습니다. 이유는 다음과 같습니다.RDB로 채팅 메시지를 저장/조회메시지가 쌓일수록 조회 성능 저하 및 부하 증가서버 증축(Scale-out) 계획현재는 단일서버로 ..
[Spring] Redis Sorted Set, ZSet 을 이용한 매칭 시스템 구현하기
·
Backend/Spring
1. 배경 및 목표고객과 매니저를 매칭하는 서비스를 개선하고자 했습니다.매칭 시스템은 고객의 상황에 맞는 매니저를 추천하여 연결해주는 기능을 담당합니다.고객은 매칭 페이지에서 새로고침 형태로 여러 매니저를 추천받으며, 그 중 적절한 매니저를 선택할 수 있습니다.기존 구현에서는 새로고침 시 같은 매니저가 다시 노출되지 않도록 매칭 정보를 DB에 저장했습니다.하지만 이 방식에는 두 가지 문제가 있었습니다.한 번이라도 추천된 매니저는 다시는 추천되지 않기에, 새로운 매니저가 추가되기 전까지 고객이 매칭을 다시 시도할 수 없음매칭 기록이 DB에 계속 누적되어 불필요한 데이터가 쌓임저는 이러한 서비스를 캐시 + 우선순위 큐로 개선할 수 있겠다고 생각하였습니다. 그 이유는 다음과 같습니다.매칭이 종료되면 기록을 휘..
[Spring] 로컬, AWS LightSail에서 AWS parameter store로 환경변수 관리하기
·
Backend/Spring
1. 배경 및 목표현재 저는 회사에서 개발용서버를 구축하기 위해 작업을 하고 있습니다.먼저 개발서버는 AWS LightSail을 이용하기로 하였습니다.운영서버는 EC2에 구축되어 있지만 LighSail을 선택한 이유는 정액제로 요금을 부과하기 때문입니다. 현재 운영서버에는 Backend 프로젝트만 올라가있지만 개발서버에는 Frontend 프로젝트와 개발용 DB 또한 Docker로 올릴 계획을 하고 있습니다. 서버 리소스 비용을 정확히 산정하기 힘든 상황에서 요금폭탄을 피하기 위해 Lighsail을 이용하기로 하였습니다.이러한 상황에서 개발서버와 운영서버의 application.yaml의 환경변수들을 효과적으로 관리하기를 원했고 AWS에서 제공하는 암호 관리 서비스인 AWS Parameter Store를 ..
[Spring] Spring AOP의 동작원리, JDK Dynamic Proxy와 CGLIB
·
Backend/Spring
오늘은 Spring AOP에 대해서 공부해보겠습니다.1. 관점 지향 프로그래밍(AOP)1) 등장 배경, 횡단 관심사객체지향 프로그래밍(OOP)는 프로그램을 객체(Object)라는 기본단위로 나누고 이들의 상호작용을 바탕으로 프로그래밍 하는 방법입니다. 하지만 객체지향 방식만으로 프로그래밍을 하다보면 문제 상황이 발생합니다. 예를들어, 각 서비스 로직이 걸리는 시간을 로그로 출력한다고 가정해봅시다.// 서비스 마다 걸리는 시간을 로그로 표시한다고 가정try { ... business ...} finally { log.info("time = {}", watch.stop());} 수많은 서비스로직에 하나하나 이와같은 로그를 남긴다면 코드 양도 어마어마해질거고 반복된 작업을 계속해야 할 것입니다.로깅..
[Spring] Apache.commons.exec 사용, 외부 명령어 실행 API 만들기, Java에서 Shell 사용
·
Backend/Spring
3번째 프로젝트가 성공적으로 종료되었습니다.기존의 WEB 프로젝트와 많이 다른 방식으로 진행되었고 그 중 처음 사용해보거나 의미있는 기술들을 포스팅 해보려합니다. 프로젝트는 다음과 같이 진행되었습니다. Java 17Spring Boot 3.2.5GradleReact1. 목표 이번 프로젝트의 주제는 초보자를 위한 인프라 플랫폼입니다.GitHub 링크 : https://github.com/o54711254/Dobie GitHub - o54711254/DobieContribute to o54711254/Dobie development by creating an account on GitHub.github.com간단한 정보를 입력 후 배포를 경험할 수 있게 하는것이 이번 프로젝트의 주제였고 간단한 버튼 클릭만..
[WebSocket] Spring, React, Stomp로 실시간 채팅, 저장 구현하기
·
Backend/Spring
팀원들과 프로젝트를 진행하였고 의미 있는 내용들을 포스팅 해보려고 합니다.프로젝트는 다음과 같이 진행되었습니다.Java 17Spring Boot 3.2.0JPAGradleReact저에게는 자그마한 꿈이 있었습니다. 바로 저장되는 실시간 채팅입니다. 한번 좌절을 맛보았던 터라 이번 프로젝트는 반드시 해내자고 다짐하고 결과적으로 성공했습니다. 그 과정을 설명해보려고 합니다. 이번 프로젝트에서 프론트엔드를 맡아서 백엔드 코드는 설명이 부족할 수 있습니다.1. 목표제가 생각하는 구현하고자 했던 채팅은 당근마켓과 유사한 1:1 채팅이였습니다. 참고자료들에서는 사용자 입장메세지, 일반메세지로 나누었지만 1대1 채팅을 원하는 저에게는 의미없었습니다. 또한 채팅내용이 저장이 되어야 했습니다. 굳이 다른 백엔드 서버를 ..
서블릿(Servlet)과 서블릿 컨테이너(Servlet Container)
·
Backend/Spring
ServletServlet은 동적 웹 페이지를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술이며클라이언트의 요청을 처리하고, 그 결과를 반환하는 역할을 합니다.웹페이지가 동적인 기능을 할 수 있게 도와주는 것입니다. 특징 클라이언트의 Request에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트 입니다.HTML을 사용하여 Response 합니다.JAVA의 스레드를 이용하여 동작합니다.MVC 패터에서 컨트롤러로 이용됩니다.HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet클래스를 상속받습니다.UDP 보다 속도가 느립니다.HTML 변경 시 Servlet을 재 컴파일해야하는 단점이 있습니다.Servlet Container서블릿을 담고 관리해주는 컨테이너..