1. 개요모의 투자 사이트를 개발하면서 토스 증권을 참고해보았을 때 실제 주문도 STOMP 를 통해서 진행되는 것을 확인할 수 있었다. WebSocket 이라는 것 자체가 양방향 통신이 가능한 프로토콜이기에 이미 연결되어있는 웹소켓을 사용하지 않을 이유가 없다. 모의 투자 사이트에서는 HTTP API 에 대해서 JWT 토큰을 사용해 사용자를 인증하고 있기에 STOMP 에서도 JWT 를 사용하고자 한다. 2. JWT 헤더 파싱const headers = { Authorization: `Bearer ${JWT_TOKEN}`,};try { const message = JSON.parse(messageJson); // JSON으로 변환 stompClient.send(destinationPath, he..
Programming/Spring
1. 개요모의 투자 서비스를 개발하면서 시세 데이터만 1초에 4~5개가 들어오곤 한다. 결국 프론트엔드의 모든 API 엔드포인트를 로컬 서버로 옮겨오기 위해서는 실시간 데이터를 가공해서 분봉 데이터 형태로 나타낼 수 있어야한다. 목표는 두 가지이다. 웹소켓을 사용해서 실시간 캔들 데이터를 제공하는 것과 HTTP API 로 과거 캔들 데이터를 조회할 수 있는 것이다. 실시간 데이터를 위해서는 당연히 웹소켓 을 사용하고 있으며 토스 증권을 참고하고 있기에 STOMP 프로토콜을 추가적으로 사용하겠다. 클라이언트에게 시세 데이터를 뿌려주기 위해서는 pub/sub 에서도 broadcast 가 필요하며 성능적으로 우수한 Redis 의 pub/sub 구조를 사용하고 있다. 이 역시 실제 토스 증권의 시세 ..
1. 개요현재 개발 중인 것은 모의 주식 사이트로 매수, 매도 주문이 발생한다. 당연히 이러한 주문은 동시성 제어가 되어야하며 여러 방법들을 사용해보면서 성능과 함께 비교해보겠다. /** * 주문 생성 - 시장가 주문 */ @Override @Transactional public synchronized BuyOrderDto createMarketOrder(BuyOrderRequest buyOrderRequest){ // 현재 주문 금액 조회 BigDecimal currentPrice = stockInfoHolder.getCurrentPrice(buyOrderRequest.getSymbol()); // 계좌 조회 및 금액 차감 ..
2024.10.26 - [Programming/Spring] - [Spring Boot] WebSocket, Kafka 채팅 서버 구현 (1)2024.11.04 - [Programming/Spring] - [Spring Boot] WebSocket, Kafka 채팅 서버 구현 (2)채팅 서버를 만들고 이를 활용하기 위해서 낸 아이디어가 크롬 확장자이다. 단순하게 각 URL 별로 확장자를 통해 익명 채팅할 수 있다면 어떤 웹사이트에서도 채팅 기능이 구현되어있는 것처럼 `확장자` 스럽게 사용할 수 있을 것 같았다. 그래서 이번 포스팅에서는 크롬 확장자를 구성해 보겠다. https://support.google.com/chrome/a/answer/2714278?hl=ko 맞춤 Chrome 앱 및 확장 프로그..
2024.10.26 - [Programming/Spring] - [Spring Boot] WebSocket, Kafka 채팅 서버 구현 (1) 이제 Kafka 를 사용해서 채팅 서버를 구현해보고자 한다. 추가 환경 설정 하지만 이전에 해당 글을 통해 Kafka 서버 실행을 Docker-compose 를 통해 한 번에 실행하며, 추가적으로 Kafka-UI 까지 사용할 수 있었다.2024.10.31 - [Programming/Coding] - Docker 를 통한 일관된 개발 환경 배포 방법version: '3'services: zookeeper: image: confluentinc/cp-zookeeper:latest container_name: zookeeper environment: ..
컨트롤러에서 여러 개의 쿼리 파라미터의 입력을 받는 상황이 있었다.@GetMapping("/params") public String getParams( @RequestParam String param1, @RequestParam int param2, @RequestParam(required = false) String optionalParam) { return "param1: " + param1 + ", param2: " + param2 + ", optionalParam: " + optionalParam; }모든 요소를 하나 씩 나열하는 게 당연히 어려움이 있었고 아래와 같이 바꿔줄 수 있다.@Getterpublic cla..
Kafka 를 사용한 채팅 서버를 구축해보고자 한다.Kafka 를 통해서 Pub/Sub 메세지를 소화하고, 클라이언트와 서버와의 연결은 WebSocket 을 사용할 예정이다. 메세지의 기록이 필요하다면 MongoDB 를 사용해서 저장한다.1. 환경설정 우선 Kafka 설치가 필요하다. https://kafka.apache.orgKafka 는 기본적으로 브로커, 프로듀서, 컨슈머로 구성되어있다. 토픽과 파티션처럼 데이터를 토픽별 관리하고 분산 저장되는 서비스이다. 또한 Kafka 클러스터는 각 파티션에 대해 Leader 와 Follower 를 유지한다.이러한 분산 서비스에서는 노드들을 관리하기 위해 Zookeeper 가 필수적이다. Kafka 2.8.0 이후로는 Zookeeper 없이도 Kafka 클러스..
2024.09.01 - [Programming/Spring] - [Spring Boot] 트래픽 우회, 대기열 서비스 구현 [Spring Boot] 트래픽 우회, 대기열 서비스 구현개발 방향성현재 t3.small 인스턴스를 사용하여 서버를 배포하고 있다. 현 서비스는 이벤트 서비스로 선착순 당첨 이벤트가 포함되어있다. 또한 사용하는 EC2 는 외부적인 요인으로 t3.small 을 사용happyzodiac.tistory.com 이전에 대기열 서비스에 대한 글을 발행했었다. 마지막 개선점을 다시 한번 확인해보면 G 마켓에서는 폴링 방식을 사용하고 있어 그대로 사용하였지만 기본적으로 실시간성 데이터에 허점이 존재하며, 서버의 부담도 크다는 것을 깨달았다. 실시간성 데이터의 허점이라하면 A 라는 사용자는 0..