Coding 91

Kafka를 이용해 로그 커스텀하여 저장하기(feat.ksqldb)

1. 메시지 큐와 MOM카프카를 이해하기 위해서는 메시지 큐와 MOM을 먼저 알아야한다. 메시지 큐는 분산화된 환경에서 발신자와 수신자 사이에서 메시지를 전송하고, 수신하는 기술을 의미한다. MOM(message oriented middleware)를 통해서 구현된다.메시지 큐를 사용하면 발신자와 수신자가 서로를 직접 알 필요가 없으므로 느슨한 결합으로 만들어낼 수 있다. 즉, 발신자와 수신자가 서로에게 의존하지 않으므로, 독립적으로 확장될 수 있다.또한, 수신자 서비스가 당장 장애 상황이더라도 모두 메시지 큐에 남아있으므로 결국 모든 메시지가 소비자 서비스에게 전달된다는 보장성을 갖는다. 마지막으로 비동기 통신으로 구현하여 무거운 작업을 요청할 수 있다. 메시지 큐는 크게 Point to Point와 ..

Coding/Server 2025.09.15

[CtrlU] 부하테스트 및 최적화

1. 부하테스트 구축서비스의 응답 속도가 빠른 것을 넘어 부하가 발생했을 때 잘버티는지 확인하기 위해 K6, InfluxDB, Grafana 조합을 활용하여 모니터링을 시작했다. K6는 javascript를 사용하기에 다른 기술보다 배울 것이 적다고 생각했고, 또한 사용법이 간단하고 무료라는 점에서 처음 부하테스트를 시작하는데 부담이 없었다.〽️ Grafana 대시보드 구축 트러블 슈팅응답 시간 (Response Time, 처리량 (Throughput / RPS): , 가상 사용자 (Virtual Users), 에러 및 체크 성공률 (Errors & Checks), 데이터 전송량를 시각화한 Grafana Labs에서 공식적으로 제공하는 K6 Results (대시보드 ID: 2587) 템플릿을 사용하여 대..

[CtrlU] 성능 개선

1. 병목 지점 탐색 과정Todo 도메인 API들의 성능 병목 가능성을 파악하기 위해 mock.sql, auth.http, todo.http 파일을 활용하여 사전 분석을 진행했다.초기 분석 결과, GET /todos/within-24hours 쿼리가 약 500ms의 응답 시간을 기록하며 잠재적인 병목 지점으로 나타났다.2. 로그를 사용한 문제 파악/todos/within-24hours는 CRUD 형식의 간단한 로직이 아닌, 24시간 내 todo를 업로드한 친구들의 목록과, 그 친구들을 Green과 Gray로 나누는 작업까지 필요한 로직이다. 현재 코드에서는 로그는 아래와 같고, API는 한 번 호출되었지만 쿼리가 총 16번 호출된 것을 확인할 수 있다.1) 회원 정보 조회Hibernate: sel..

[CtrlU] 메트릭 모니터링 대시보드 구축

애플리케이션이 정상적으로 동작하는지 확인하려면 CPU 사용량, 메모리 사용량 등을 실시간으로 모니터링해야한다. 시스템 메트릭 수집 및 시계열 데이터 처리에 특화된 Prometheus와 수집한 데이터를 시각화해주는 Grafana를 이용하여 모니터링을 구축하고자 한다.1. Actuator로 메트릭 정보 생성먼저 actuator 라이브러리를 추가하여 스프링 애플리케이션으로부터 메트릭 정보를 얻도록 했다.management: endpoints: web: exposure: include: "health,metrics,info,prometheus" endpoint: health: show-details: always2. Prometheus 로 데이터 수집 Promethe..

[배달뚝배기] 인덱스와 배치를 적용한 성능 최적화

0. 들어가기 전인덱스 관련된 강의를 들으면서, 강의에서 배운 내용을 이해하기 위해 전에 개발했었던 배달뚝배기 프로젝트에 인덱스를 적용해보고자 한다. 강의에서 배운 내용은 다음과 같다.인덱스를 추가한다면, Where 절에 자주되는 컬럼, 혹은 Order by로 매번 정렬하는 컬럼을 고려해봐야한다.두 가지 칼럼을 대상으로 검색하는 경우, 카디너리티가 높은 (값의 종류가 많은) 컬럼을 우선으로 세워야 한다. 게시물의 댓글 수와 같이, 빈번하게 조회되지만 조인으로 성능이 저하되는 경우에는 반정규화도 고려해봐야한다.대규모 GROUP BY를 수행하여 통계 등의 긴 응답시간이 발생하는 통계처리는 배치를 고려해봐야한다.실제로 프로젝트에서 인덱스를 적용해보겠다. 1. 병목 가능성이 있을만한 쿼리는 무엇인가?병목 가능..

[CtrlU] 로그 모니터링 대시보드(Fluent Bit+OpenSearch)

프로젝트를 운영환경에서 돌리면서, 에러가 발생했을 때, 예상된 응답이 나오지 않을 때 등 로그를 확인해야하는 상황은 매우 빈번하고 다양하다. 지금까지는 EC2에 직접 접근하여 로그를 확인했지만, 모니터링 대시보드를 활용하면 프로그램의 상태와 문제점을 시각적으로 표현하여 실시간으로 모니터링할 수 있다. 또한, 문제가 발생했을 때 신속하게 조치할 수 있으므로, 이번 프로젝트에 적용해보고자 한다.1. 로그로그는 시스템 내부에서 발생하는 이벤트와 정보를 기록한 데이터로, 이 데이터를 수집하고 분석하면 서비스의 문제를 식별하고 해결하는 데 도움이 된다. 로그 모니터링 도구로는 AWS openSearch 를 사용하고자 한다. 2. 로그 모니터링 대시보드 구현ElasticSearch가 아닌 AWS openSearch..

[알고리즘 TIL] 전화번호 목록(Java, 해시)

문제https://school.programmers.co.kr/learn/courses/30/lessons/42577 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr프로그래머스 LV2설명전화번호부에 들어있는 전화번호의 수는 최대 1,000,000개이다. 따라서 만약 모든 전화번호와 대조한다면 1,000,000*1,000,000 의 최악의 시간이 걸리게 된다. 그렇다면 어떻게 시간복잡도를 효율적으로 구현할 수 있을까? 전화번호는 자릿수가 20이라는 제한이 있다. 따라서 각 전화번호마다 자릿수만큼 subString을 구해서 해당 subString이 다른 전화번호랑 일치하는지 확인한다. 이때, substring이 O(..

Coding/알고리즘 2025.06.05

[알고리즘 TIL] 튜플(Java, 자료구조)

문제https://school.programmers.co.kr/learn/courses/30/lessons/64065 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr프로그래머스 LV2 설명단순 구현 문제라서 크게 어려운 것은 없었지만, 정렬을 내가 원하는 기준으로 하기 위해 커스텀하는 과정을 기억하지 못했다. Compartor를 이용해 순서를 지정하는 방법을 기억해두자.Comparator> comparator = new Comparator() { @Override public int compare(ArrayList a, ArrayList b) { return Integer.compare(a..

Coding/알고리즘 2025.06.04

[알고리즘 TIL] 캐시(Java, 자료구조)

문제https://school.programmers.co.kr/learn/courses/30/lessons/17680?language=java 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr프로그래머스 LV2. 자료구조트러블 슈팅페이지 교체 알고리즘 중 하나인 LRU를 이용해 푸는 문제이다. 하지만 LRU를 LFU와 헷갈려서 참조 횟수를 기반으로 구현하다가 오류가 났다. 이 기회에 페이지 교체 대표 알고리즘 3개에 대해 알아보았다.FIFO(First In First Out): 메모리에 가장 오래 있던 페이지를 교체LRU(Least Recently Used): 가장 오랫동안 사용되지 않았던 페이지를 교체LFU(Le..

Coding/알고리즘 2025.06.02

[토비의 스프링 3.1 Vol 1] 08장. 스프링이란 무엇인가?

스프링은 자바 소프트웨어 개발을 편하게 해주는 오픈소스 프레임워크이다. 스프링의 목적은 애플리케이션 개발의 복잡함을 줄여주고, 효과적으로 대응하게 해주는 것이다. 8.1 POJO 프로그래밍스프링의 주요 기술인 IoC/DI, AOP, 서비스 추상화는 애플리케이션을 POJO로 개발할 수 있게 해주는 가능기술이라고 불린다.8.1.1 POJO란 무엇인가?POJO는 Plain Old Java Object의 첫 글자를 떠서 만든 약자이다. 단순하게 보자면 그냥 평범한 자바 오브젝트라고 할 수 있지만, 좀 더 명확하게 하자면 다음의 세 가지 조건을 충족해야 POJO라고 불릴 수 있다.특정 규약(기술)에 종속되지 않는다.-> POJO는 자바 언어와 꼭 필요한 API 외에는 종속되지 않아야 한다. 특정 환경에 종속되지 ..