전체 글 32

데이터베이스 접근이 가능한 MCP 개발

들어가며AI 에이전트가 외부 시스템과 연결되려면 각 시스템마다 커스텀 통합을 구현해야 했습니다. 이는 중복된 노력과 파편화를 초래했죠. Model Context Protocol (MCP)은 이 문제를 해결하기 위한 오픈 표준입니다. MCP를 한 번 구현하면 전체 통합 생태계가 열립니다.이 글에서는 데이터베이스와 Redis에 접근할 수 있는 MCP 서버를 어떻게 구축했는지, 그리고 이를 에이전트와 어떻게 연동했는지 공유합니다.왜 MCP 서버를 만들었나?문제 상황현재 운영 중인 플랫폼은 데이터 무결성을 위해 고도로 정규화된 데이터베이스 구조를 가지고 있습니다. 이로 인해 다음과 같은 비효율이 발생했습니다.높은 조회 난이도: 운영팀에서 요청한 원인을 파악하려면 최소 6개 이상의 테이블을 조인하거나 서치를 해야..

카테고리 없음 2026.01.23

ECS환경에서 JVM메모리 누수 추적

1. 문제 상황서버의 메모리 사용량이 시간에 따라 지속적으로 증가하고 있었습니다.초기 약 41.6% → 이후 43.8%증가 폭은 크지 않았지만, GC가 정상 동작한다면 메모리 사용량은 증가와 감소를 반복(Sawtooth Pattern) 해야 합니다.실제 모니터링 그래프는 계단식으로 계속 상승하고 있었고, 이에 따라 메모리 누수 가능성을 의심했습니다. 2. 첫 번째 시도 – 명시적 GC 실행GC가 실제로 메모리를 회수하는지 확인하기 위해 System.gc()를 명시적으로 호출하고, 실행 전후의 메모리 사용량을 비교했습니다.GC 실행 이후에도 메모리 사용량은 줄지 않았고, 경우에 따라 오히려 증가했습니다.이를 통해 GC 자체의 문제가 아니라, 여전히 참조되고 있는 객체가 존재한다고 판단했습니다. 3. 두 번..

TroubleShooting 2026.01.03

Vector로 로그 시스템 구축 (feat. 신규 프로젝트 로그 시스템 구축기)

안녕하세요! 오늘은 저희 팀이 신규 프로젝트를 진행하며 로그 파이프라인을 구축할 때 겪었던 고민과 경험담을 풀어보려 합니다. 단순히 기술 나열이 아니라, 어떤 이유로 특정 기술을 선택하게 됐는지 그 과정까지 함께 이야기해볼게요.우리의 제1원칙: "로그 유실은 절대 용납할 수 없다.""로그 좀 유실될 수도 있지, 그렇게 심각하게 생각하나?"라고 물으실 수도 있습니다. 하지만 저희에게 로그는 단순히 개발자의 디버깅용 텍스트가 아니었습니다. 회사의 매출과 직결된 중요한 데이터가 바로 ‘로그’라는 이름으로 쌓이고 있었기 때문이죠.하나의 로그가 사라진다는 것은 데이터 한 건이 아니라 팀의 성과, 더 나아가 회사 자산이 증발하는 것과 같았습니다.그래서 이번 프로젝트의 목표는 단 하나였습니다."어떤 장애 상황에서도 ..

개발 학습 2025.07.19

신입 개발자의 RESTful API 분투기

신입 개발자로 입사하고 처음 맡은 업무가 바로 API 개발이었다. 처음엔 단순히 데이터만 주고받으면 되는 게 아닌가 싶었지만, 생각보다 API 패스를 정하는 과정에서 많은 피드백을 받았다. 동료 개발자분들이나 리뷰어들이 자주 언급했던 것이 바로 "RESTful API"였다. 알고 있었다고 생각했지만, 막상 적용하려니 정확히 어떻게 설계해야 할지 막막했다. 그래서 이번 기회에 RESTful API가 뭔지 다시 제대로 정리하고자 한다.RESTful API, 왜 중요할까?API는 프로그램끼리 소통하는 통로다. 잘 설계된 API는 개발자의 생산성을 높이고, 사용하기 쉬워서 많은 개발자가 빠르게 적응할 수 있다. 반대로 잘못 설계된 API는 개발자에게 큰 스트레스를 준다. 특히, 우리처럼 여러 개발자가 협업하는 ..

개발 학습 2025.07.13

런던파와 고전파 테스트: Mock과 Fake를 활용한 테스트 접근법

이번 포스트에서는 소프트웨어 테스트를 접근하는 두 가지 주요 스타일, 런던파(London School) 와 고전파(Classicist) 에 대해 이야기해보고, 이와 함께 테스트에서 많이 사용되는 Mock과 Fake 객체에 대해 살펴보겠습니다. 각 접근법의 특징과 장단점을 이해하면, 상황에 맞는 효과적인 테스트 전략을 수립하는 데 큰 도움이 될 것입니다.1. 테스트 접근 방식: 런던파 vs 고전파런던파 테스트 (London School Testing)행위 중심(Behavior-centric):런던파는 단위 테스트에서 객체 간 상호작용(메서드 호출, 메시지 전달 등)에 초점을 맞춥니다.테스트 대상 객체가 외부 의존 객체와 어떤 행위를 수행하는지를 검증합니다.Test Double 활용:런던파에서는 Mock, ..

개발 학습 2025.02.13

일급 컬렉션을 통한 컬렉션 이점 극대화

일급 컬렉션(First-class Collection) 패턴을 통해 컬렉션의 이점을 극대화하는 방법에 대해 이야기해보고자 합니다. 일급 컬렉션은 단순한 자료구조 이상의 의미를 가지며, 비즈니스 로직과 도메인 규칙을 깔끔하게 관리할 수 있도록 도와줍니다.1. 일급 컬렉션이란?일급 컬렉션은 단순히 List나 Set과 같은 컬렉션 자료구조를 사용하는 대신, 이를 하나의 값 객체(Value Object) 로 감싸서 사용하는 것을 의미합니다.즉, 컬렉션 자체를 의미 있는 도메인 객체로 추상화하여, 해당 컬렉션에 적용되는 비즈니스 로직이나 제약 조건들을 한 곳에 모아 관리할 수 있습니다.예를 들어, 주문 도메인에서 여러 개의 주문 항목을 관리한다고 할 때, 단순히 List으로 관리하는 대신, OrderItems라는..

배열의 공변성

이번 포스트에서는 이펙티브 자바(Effective Java)에서 다루는 주제 중 하나인 배열의 공변성(Covariance)과 그로 인해 발생하는 문제점에 대해 알아보겠습니다. 자바를 사용하면서 한 번쯤은 겪었거나 들어봤을 “배열 공변성”에 대한 이야기를 통해 왜 이 설계가 위험할 수 있는지, 그리고 어떻게 대처할 수 있는지 살펴보도록 하겠습니다.1. 배열의 공변성이란?자바에서 배열은 공변적(covariant)입니다.즉, 만약 Integer가 Number의 하위 타입(subtype)이라면, Integer[]는 Number[]의 하위 타입이 됩니다. Integer[] intArray = new Integer[10];Number[] numArray = intArray; // 배열의 공변성 때문에 컴파일 성공 ..

K6를 활용한 API 부하 테스트 및 모니터링

안녕하세요! 오늘은 K6를 활용하여 API 부하 테스트를 진행하고, 테스트 결과를 모니터링한 경험을 공유하려고 합니다. 이번 테스트에서는 특정 API의 동시 접속 처리 성능을 평가하고, 테스트 데이터를 InfluxDB와 Grafana를 이용해 시각화하는 방법도 다뤄보겠습니다.1. 테스트 배경현업에서 API의 성능을 보장하기 위해 부하 테스트는 필수적입니다. 특히, 예상 사용자가 급증하는 이벤트 시기나 새로운 기능이 배포될 때 시스템 안정성을 확인하기 위해 부하 테스트는 중요한 지표를 제공합니다.목표특정 API들이 동시 다중 사용자 요청을 얼마나 잘 처리하는지 확인.회원가입, 위치 정보 조회, 병원 거리 계산 API의 부하를 시뮬레이션.테스트 데이터를 수집하고 시각화하여 병목 구간을 식별.2. 테스트 환경..

EC2에서 Docker와 EBS를 활용한 Elasticsearch 및 Kibana 환경 구축 문제 해결

AWS EC2를 사용하면서 Elasticsearch와 Kibana를 Docker로 실행하는 환경을 구축하던 중, 예상치 못한 디스크 용량 문제를 겪었습니다. 이를 해결하기 위해 추가 EBS 볼륨을 연결하고 Docker 데이터를 EBS에 저장하도록 설정한 과정을 공유합니다. 또한, EC2 인스턴스를 재부팅한 후 발생한 Docker 실행 문제를 해결한 과정도 담았습니다.1. 문제 상황처음에는 AWS EC2에 기본 제공되는 8GB 루트 디스크만 사용해 Elasticsearch와 Kibana를 실행하려고 했습니다. 하지만 Elasticsearch와 Kibana는 기본적으로 많은 디스크 공간을 필요로 하기 때문에, Docker 이미지를 다운로드하거나 컨테이너를 실행하는 과정에서 다음과 같은 오류가 발생했습니다: ..

Java 거리 계산 최적화: Haversine 공식에서 SQL 공간 쿼리로

개발을 하다 보면 위치 기반 서비스에서 특정 지점들 간의 거리를 계산해야 하는 경우가 종종 발생합니다. 예를 들어 가까운 병원을 찾거나, 주변의 특정 지점을 필터링할 때 말이죠. 전통적으로 이러한 거리 계산에 사용되는 방법 중 하나가 바로 Haversine 공식을 이용하는 것입니다. 하지만, 이 방법은 대규모 데이터를 다룰 때 비효율적일 수 있습니다. 이번 포스팅에서는 제가 Java에서 Haversine 공식을 사용해 거리 계산을 하다가 SQL의 공간 함수로 전환하면서 어떻게 효율성을 높일 수 있었는지 공유하고자 합니다.Haversine 공식을 사용한 접근법처음에는 두 지점 간의 거리를 계산하기 위해 Java에서 Haversine 공식을 사용했습니다. 아래는 두 좌표 간의 거리를 킬로미터 단위로 계산하는..