2025/05 13

RAG 시스템 설계

앞서 Qdrant, GPT, WebClient로 만든 요약/질문 생성 시스템 에 대한 주제로 글을 포스팅했었다.이전 글에선 RAG에 대한 설명이 없어, 추가적으로 RAG 시스템에 대한 설계와 구현에 초점을 맞춰 글을 작성하려 한다. 우선 프로젝트를 소개하자면,사용자의 글 내용을 요약하고 해당 내용을 기반으로 GPT를 통해 심층 면접 질문과 답변을 생성하는 시스템을 구현하는 것이 목표이다.핵심 기술로 OpenAI GPT API, Qdrant 벡터 DB, WebFlux 비동기 처리 그리고 Redis 분산 락을 활용했으며RAG 아키텍처에 기반하여 정보를 검색/보강/생성하는 전체 흐름을 구성했다. RAG 시스템RAG 도입한 이유내가 프로젝트에 RAG를 도입하게 된 이유는,사용자가 입력했던 데이터들을 기억하고 ..

Gatling 성능 테스트

저번 글에서는 JMeter를 사용해 성능테스트를 진행해 보았다.이후 응답 시간을 개선하고자 비동기 호출을 코드에 적용해 보았고 JMeter로 테스트 해보려 했다.하지만 JMeter는 비동기 호출을 지원하지 않아 다른 테스트 툴을 찾아보다 Gatling을 알게 되었다. 우선 JMeter가 비동기호출이 안되는 이유부터 짚고 넘어가면,JMeter의 각 스레드는 하나의 요청을 보내고 응답을 기다리기에 다음 요청은 이전 요청이 완료된 후에 실행된다.따라서 각 스레드가 별도로 동작하여 비동기 처리를 모방하기 어렵다. 이번 글에서는 Gatling을 선택한 계기와 사용방법, 테스트 결과에 대한 분석을 해보겠다. Gatling 선택 이유다른 테스트 툴로 Locust, k6가 있었다.Locust는 파이썬 기반으로 JVM..

JMeter를 이용한 성능 측정 - JMeter 설정, 결과 분석

진행중인 프로젝트에서 GPT와 Qdrant API를 호출해 응답을 받는 API가 생각보다 시간이 걸렸다.6초, 7초 정도 걸린다면 적당할 것 같다고 생각했는데 기존 코드로는 타이머로 측정해보니 9~10초정도 걸린것 같다. 이렇게 동시 접속자 수와 사용자의 반복 횟수 등을 설정해 측정할 수 있는 툴을 찾다 JMeter의 장점이 좋아 사용하고자 한다.이번 글은 JMeter 초기 설정과 성능 측정한 결과를 어떻게 분석할지에 대해 다뤄 보겠다. 1. JMeter 사용법JMeter를 선택한 계기부터 말하면 좋을 것 같다. 여러가지 이유가 있었지만,우선 JMeter는 오픈소스 기반으로 무료로 사용 가능하며 GUI로 손쉽게 테스트 시나리오를 작성할 수 있다는 것이 매력적이었다.또한 여러 스레드를 사용해 동시 접..

자바 람다와 스트림

자바를 사용하다 보면 복잡하고 반복적인 코드 때문에 고민이 생기곤 한다.특히 컬렉션을 다룰 때, 데이터를 변환하거나 필터링하는 과정이 길고 복잡해지기 쉬운것 같다.이럴 때 람다와 스트림을 사용하면 코드가 간결해지고 가독성도 높아진다.람다식은 자바 8부터 도입된 함수형 프로그래밍의 핵심 요소로기존 메서드를 간단하게 표현하여 코드를 직관적으로 작성할 수 있다.또한, 스트림을 사용하면 데이터를 효과적으로 필터링, 변환, 집계할 수 있어데이터 처리 코드를 훨씬 간단하게 만들 수 있다. 람다식?람다식은 한마디로 메서드를 하나의 식으로 표현한 것이다.기존 메서드와 달리 이름과 반환 타입을 없애고 매개변수와 실행문을 -> 기호로 연결한다.예를 들어, 두 수를 더하는 메서드를 람다식으로 표현하면 다음과 같다.(int..

자바 2025.05.12

자바에서 쓰레드 사용법과 동기화

오늘도 자바의 정석 책을 읽고 한 챕터를 정리하고자 한다. 이번엔 쓰레드와 동기화에 대한 내용이다. 쓰레드와 프로세스의 차이 – 공장과 일꾼의 비유자바에서 쓰레드를 이해하려면 먼저 프로세스와 쓰레드의 차이부터 명확히 알아야 한다.프로세스란 간단히 말해 실행 중인 프로그램이다.어떤 프로그램을 실행하면, OS로부터 필요한 자원을 할당받아 프로세스가 된다.이 프로세스는 프로그램을 수행하는 데 필요한 데이터와 메모리 같은 자원을 가지고 있으며실제로 작업을 수행하는 주체가 바로 쓰레드이다. 쓰레드와 프로세스의 관계를 쉽게 이해하려면공장(프로세스)과 그 안에서 일하는 여러 명의 일꾼(쓰레드)로 비유할 수 있다.하나의 공장에는 여러 명의 일꾼이 동시에 일을 할 수 있고 각 일꾼이 맡은 작업을 수행하면서도 공장이 가..

자바 2025.05.08

GitHub Actions로 EC2 자동 배포

프로젝트 초기에는 EC2에 직접 접속해서 git pull → docker-compose up을 수작업으로 반복했다.수정할 때마다 직접 SSH 접속 해서 시간 소모가 들고 매번 docker 명령어를 입력해야했다.이제 배포 자동화를 프로젝트에 적용할 단계이다.이번 글에서는 왜 GitHub Actions를 도입했는지, 그리고 어떻게 구축했는지를 공유해보려 한다. 처음에 제일 먼저 떠올린 자동화 도구는 Jenkins였다.워낙 오래되고 유명한 데다, 검색만 해도 튜토리얼이 넘쳐나서 금방 쓸 수 있을 것 같았다.Jenkins는 오픈소스이고, 커스텀이 자유로워서 정말 많은 곳에서 사용하고 있었다.특히 대규모 프로젝트나 전통적인 배포 환경에서는 사실상 표준처럼 자리 잡고 있다. 그래서 Jenkins를 써볼까 생각했..

도메인 연결, HTTPS 적용하기

그냥 EC2의 퍼블릭 IP 주소로 웹사이트에 접속하는 것이 간단하긴 하다.하지만 현재의 주소 http://43.201.208.238 는 사용자에게 낯설 뿐만 아니라 http로 되어있어 로그인 같은 기능에 보안 경고가 뜬다. 그래서 본격적으로 도메인을 연결하고 HTTPS를 적용하는 작업에 들어갔다.이 글은 그 모든 과정을 정리해본 기록이다. 1단계 – 도메인 연결 (Route 53 + 가비아)왜 도메인이 필요?IP 주소는 외우기 힘들고 전문적이지 않은 인상을 준다.HTTPS 인증서 발급도 도메인을 기준으로 진행된다.결국 사용자가 접속하는 주소는 https://devinterview.shop 같은 형태여야 한다.도메인 연결 흐름도메인 구매 (나는 가비아에서 devinterview.shop 구매했다)Rout..

Nginx가 왜 필요했는가

웹 애플리케이션을 배포하다 보면 자연스럽게 웹 서버와 보안에 대한 고민이 시작된다.특히 프론트엔드와 백엔드가 분리된 구조에서는 어떻게 요청을 분기하고, 안전하게 데이터를 주고받을 것인가가 중요하다.이때 가장 많이 사용되는 도구가 바로 Nginx다.Nginx는 단순히 웹 서버 역할만 하는 것이 아니라, 리버스 프록시, 로드 밸런서, SSL 처리까지 담당하는 다재다능한 도구다.이번에는 Nginx의 역할과 SSL 적용 방식에 대해 구체적으로 정리해보려고 한다. Nginx 역할1. 정적파일 제공Nginx는 기본적으로 웹 서버이면서 동시에 리버스 프록시 서버로 많이 사용된다.웹 서버라는 건, 쉽게 말해 정적 파일을 직접 제공하는 역할을 한다.예를 들어, HTML, CSS, JavaScript 같은 파일들을 클..

프로젝트에 Docker를 도입한 이유

그런 얘기를 많이 들어봤다. 프로젝트 초기에는 로컬에서 Spring Boot 서버 띄우고, Next.js로 프론트 돌리고 처음엔 잘 됐었다.그런데 팀원이 늘고, 배포를 하려다 보니 시스템 환경마다 오류가 발생했다.클래식한 그 문제 , “내 PC에선 잘 되는데요?”이 문제를 팀프로젝트에서 겪을 것을 대비해 Docker로 모든 환경을 통일해보고자 했다. 왜 Docker를 도입?Docker를 도입하면서 기대했던 가장 큰 변화는 어디서든 한 번 설정으로 동일한 환경을 재현할 수 있다는 점이다.Docker를 사용하면 EC2에도 Docker만 설치하면 되므로, 배포 과정도 간소화된다.문제 상황: Docker 없는 환경의 고통로컬마다 자바, npm, node, OS가 미묘하게 달라서 오류가 발생한다.프론트, 백엔드,..

EC2 + Docker 기반 수동 배포

이 글은 GitHub Actions 같은 자동화 도구 없이, 순수하게 EC2와 Docker만으로 수동 배포를 했던 과정을 정리한 것이다.처음엔 막막했지만, 하나씩 개념을 찾아가며 세팅하다 보니 인프라에 대한 감각이 조금씩 생겼다.혹시 나처럼 처음으로 배포를 해보는 신입 개발자라면, 도움이 되길 바라는 마음으로 이 글을 정리해본다. 프로젝트 구조 정리부터interview-platform/── frontend/ # Next.js 프론트엔드 ── server/ # Spring Boot 백엔드 ── nginx/ # 리버스 프록시 설정 (conf.d/default.conf) ── docker-compose.yml ── .env # 환경 변수 (DB, GPT, JWT 등)처음에는 각 서비스를 각각 실행했는데, D..