분류 전체보기 15

실시간 시세를 초고속으로 처리하는 Redis 캐싱과 Pub/Sub 도입

지난 번에 웹소켓에 대한 설명에 이어 이번에는 저희 프로젝트에서 처리량과 지연 시간 부분에서 큰 역할을 한 Redis에 대해서 설명하겠습니다. 1. 도입 배경: 왜 Redis가 필요했나웹소켓을 통해 실시간 통신 환경을 구축했지만, 또 다른 병목 현상이 기다리고 있었습니다. 바로 데이터베이스(RDB)의 부하였습니다.캐싱의 필요성: 초당 수만 건의 시세 조회 요청을 매번 PostgreSQL 같은 RDB로 처리한다면 응답 속도가 현저히 느려지고 서버는 금방 한계에 도달합니다.서버 간 동기화 문제: 프로젝트 규모가 커지며 모놀리식 구조에서 MSA(Microservices Architecture)로 전환할 때, 여러 대의 서버 인스턴스 간에 실시간 데이터를 어떻게 일관성 있게 공유할 것인가라는 숙제가 생겼습니다...

Project 2026.03.16

실시간 시세 서비스를 위한 WebSocket 도입

오늘 소개해볼 주제는 웹소켓입니다. 가상 화폐 거래소 프로젝트 진행중 기존의 HTTP 방식으로는 원활한 실시간 시세 반영이 쉽지 않다고 느껴 도입을 하였던 기술입니다.1. WebSocket이란?WebSocket은 단일 TCP 연결을 통해 서버와 클라이언트 간의 전이중(Full-Duplex) 통신을 지원하는 프로토콜입니다. 일반적인 웹 서비스가 요청이 있을 때만 응답하는 '수동적'인 구조라면, 웹소켓은 한 번 연결되면 양방향으로 자유롭게 데이터를 주고받는 '능동적'인 전용선을 까는 것과 같습니다. 그렇다면 왜 기존 HTTP 요청 방식이 무리가 있다고 느꼈을까? 2. 기존 HTTP 요청 vs WebSocket우리가 흔히 쓰는 HTTP 통신과 웹소켓은 주도권과 효율성 면에서 큰 차이가 있습니다. HTTP ..

Project 2026.03.16

[BOJ] 2839 설탕 배달 (Java, Greedy)

문 제 정보문제 : 백준 2839번 설탕 배달난이도 : 실버 4알고리즘 : Greedy문제 링크 : https://www.acmicpc.net/problem/2839 문제 요약주어진 N kg의 설탕은 3kg과 5kg의 설탕 봉지로 정확하게 배달해야 한다. 이때 최소의 봉지 개수값을 구하는 문제 접근 방법처음에는 동적 프로그래밍(DP)을 생각했다. 시간 복잡도가 O(N)이라 입력 가능한 N의 최대값 5000에도 무사히 들어오는 수치였다. 그렇지만 과연 방법이 DP밖에 없을까 고민해보다가 브루트 포스와 그리디로는 해결이 안될까?라고 생각이 들었고 N은 최대 5000이라는 작은 값이므로 브루트 포스보다는 그리디가 더 직관적이고 짧을 것 같아서 그리디로 접근해보았다. 알고리즘최대한 적은 봉지 수를 이용하는..

알고리즘 2026.03.11

가상 화폐 거래소 프로젝트에 대한 회고

2달간의 몰입, 업비트 클론 프로젝트 'Heartbit' 제작기IT 교육 플랫폼 구름(goorm)에서 진행한 2달간의 프로젝트가 지난 2월 말 대단원의 막을 내렸습니다. 학교를 다니며 내세울 만한 프로젝트가 없었던 저에게 이번 경험은 단순한 개발 그 이상이었는데요. 그 기록을 짧게 정리해 보고자 합니다. 도메인 선정: "가짜를 만들더라도, 완벽하게 만들자"프로젝트 기획 단계에서 이커머스, 엔터테인먼트 등 수많은 선택지가 있었습니다. 하지만 우리 팀의 목표는 명확했습니다. "가짜를 만들더라도, 진짜처럼 동작하는 완벽한 서비스를 만들자."이런 관점에서 보았을 때, 기술적 난이도가 높고 실시간 처리가 필수적인 거래소 도메인은 거부할 수 없는 매력적인 선택지였습니다. 그렇게 우리는 국내 최대 암호화폐 거래소인..

회고 2026.03.11

HikariCP 커넥션 고갈과 Broken Pipe 해결기 (@TransactionalEventListener활용)

오늘은 HikariCP 커넥션 풀에 관련하여 내가 마주한 문제에 대해 정리해볼 생각입니다. 배경 및 문제 상황가상 화폐 거래소(Upbit) 클론 코딩 프로젝트를 진행하며, 핵심 로직인 [주문 -> 체결 -> 웹소켓 전송] 구간의 부하 테스트를 수행중에 대량의 트래픽을 발생시키자 서버 로그에 다음과 같은 경고와 에러가 발생했습니다.Error Log: java.io.IOException: Broken pipe (클라이언트 연결 끊김)Symptom: HikariCP 커넥션 풀 고갈 및 서버 응답 지연 원인 분석로그 분석 및 코드 리뷰 결과, processTradeResults 메서드의 트랜잭션 범위가 지나치게 넓은 것이 원인이었습니다기존 로직: 체결 데이터 DB 저장 + 자산 정산(Update) + Redi..

트러블 슈팅 2026.02.18

프로그래머스, 최소직사각형

이번 문제 이해하는데 애를 좀 먹었는데사고력을 길러야 할 것 같다고 절실히 느끼게 해준 문제입니다 ..,,   .간략히 설명해드리자면,  우선 2차 배열을 입력받습니다. 2차배열의 각 행들은 [w, h]즉, [가로, 세로]로 이루어져있고 이 수많은 행들 각각의 값들을 비교하여 큰 값을 maxWidth에, 작은 값을 maxHeight에 대입하여 이차배열을 순회하면서 더 큰 값이 나타날 때마다 maxWidth값과 maxHeight값을 갱신하는 방법으로 풀 수 있습니다.    ex) sizes = [[60, 50], [30, 70], [60, 30], [80, 40]] 60과 50을 비교하여 큰 숫자인 60을 width에 작은 숫자인 50을 height에 저장하고 또 30과 70을 비교하여 큰 숫자인 70을 ..

알고리즘 2024.07.10

프로그래머스, 수열과 구간 쿼리3

문제에 대해 간략하게 설명드리겠습니다. 입력받는 배열은 총 2개 arr, queries입니다.   queries배열의 인덱스 값에 해당하는 arr배열의 요소들의위치를 서로 바꿔주는 것이 이번 문제의 해결방법입니다.   ex) arr = [1, 2, 3, 4, 5] queries = [[0,3]] 이라면 arr배열의 요소들 중에서 인덱스 값이 0인 1과 인덱스 값이 3인 4의 위치를 서로 바꿔서 result배열로 출력따라서, result = [4, 2, 3, 1, 5]가 됩니다.    코드가 매우 간단하죠.?이 간단하고 짧은 코드에서도알아두셨으면 하는 알고리즘이 하나 있습니다.   위의 3줄은 arr[i]와 arr[j]의 값을 서로 바꾸기 위해temp라는 변수를 추가해서 하나하나씩 값을 서로 바꿔주는 역할..

알고리즘 2024.07.10

프로그래머스, K번째수

이번 문제에 대해서 간략히 설명해드리면 배열을 슬라이싱해서슬라이싱한 배열에서 주어진 인덱스값(k)을 이용하여해당하는 요소를 찾아내서 새로운 배열에 추가해주는 코드입니다!  출력해야 할 answer배열과 commands배열의 요소 개수가 같으니 for문은commands배열의 길이만큼 돌아주게 설정하면 됩니다. int[] subArray = Arrays.copyOfRange(array, start, end);로 새로운 배열을 하나 생성해주고 새롭게 생성한 배열을 오름차순 정렬을 해준 뒤에 오름차순 정렬을 마친 새로운 배열의 k번째 값을 answer배열에 넣어주면 이번 문제 해결입니다!

알고리즘 2024.07.10

LEETCODE, Smallest Number in Infinite Set

간단하게 문제 설명을 해드리자면 이번 문제에서 쓰이는 매서드는 크게 최솟값을 삭제해주는 popSmallest() Set안에 중복되는 수가 없다면 파라미터로 입력받은 수를 추가해주는addBack() 이렇게 두 가지입니다.      우선순위 큐는 기본적으로 최소 우선 순위로 지정되어있습니다. 그래서 우선순위 큐에 별다른 지정없이 값을 꺼내면자동으로 최솟값을 추출하게 됩니다. 이런 특징을 이용해서 popSmallest() 매서드를 이용하여최솟값 꺼내고 set에서도 제거. addBack() 매서드에서는 파라미터로 입력받은 정수가현재 set안의 최솟값보다 작고 set.add(num)이 true로 출력되면큐에다가 num을 추가해주는 방식입니다 !

알고리즘 2024.07.10

LEETCODE, Minimum Number

문제에서 요구하는 것은 nums라는 배열이 주어지고 그 배열 안에는 짝수 개의 요소들만 들어갈 수 있는 게 전제조건이고, 이제 nums안의 요소들을 2개씩 꺼내야하는데 Alice라는 친구가 nums 배열 안에 있는 요소들 중에서최솟값을 꺼내고 Bob이라는 친구가 그 다음으로 작은 값을 꺼내서 Bob친구가 꺼낸 값을 다시 새로운 배열에 추가하고Alice친구가 꺼낸 값을 새로운 배열에 추가해주면서 새로운 배열을 만들어내는 코드입니다. 요약하자면 꺼내는 순서는 Alice --> Bob이고,다시 배열에 추가하는 순서는 Bob --> Alice입니다. ex) nums = {5, 4, 2, 3}이고 최솟값 2를 Alice가 그 다음 작은 값인 3을 Bob이 꺼내서{3, 2}순서로 집어넣어주고 남은 {5, 4}도 똑..

알고리즘 2024.07.10