RAG 챗봇 벡터 검색 만들기 회사에서 고객 문의에 자동으로 답하는 AI 챗봇을 만들게 됐다. 회사가 가진 문서나 FAQ를 바탕으로 답을 해주는, 요즘 흔히 말하는 RAG(Retrieval-Augmented Generation) 챗봇이다. 이름은 거창한데 핵심은 단순하다. 사용자가 질문하면, 우리 지식 중에서 그 질문과 관련있는 걸 찾아다가, 그걸 근...
멀티테넌트 컨텍스트 전파하기
멀티테넌트 컨텍스트 전파하기 여러 회사가 같이 쓰는 SaaS를 만들면, 데이터가 회사끼리 절대 섞이면 안된다는 게 제1원칙이 된다. A회사가 요청했는데 B회사 데이터가 조회되면 그건 버그가 아니라 사고다. 이걸 막는 방법으로 우리는 모든 테이블에 company_id 컬럼을 두고, 조회할 때마다 WHERE company_id = ? 를 붙이는 방식을 골...
CloudWatch Logs Insights 로 Lambda 로그 파보기
CloudWatch Logs Insights 로 Lambda 로그 파보기 Lambda를 운영하다 보면 로그를 봐야 할 일이 계속 생긴다. “어제 밤에 왜 에러가 났지”, “이 함수 콜드스타트가 얼마나 되지”, “특정 요청 하나가 어디서 막혔지” 같은거다. 근데 CloudWatch 콘솔에서 로그 그룹 들어가서 로그 스트림을 하나하나 열어보는건 정말 못할...
presigned URL 로 대용량 파일 업로드하기
presigned URL 로 대용량 파일 업로드하기 사용자가 파일을 올리는 기능을 만들 일이 생겼다. 처음엔 별거 아니라고 생각했다. 브라우저에서 multipart/form-data 로 파일을 보내고, 서버가 받아서 S3에 올리면 되는거 아닌가. 실제로 작은 파일은 그렇게 해도 잘 된다. 문제는 파일이 커지면서 시작됐다. 우리 백엔드는 Lambda로...
Java 가상 스레드 적용기
Java 가상 스레드 적용기 회사 서비스 중에 외부 API를 잔뜩 호출하는 녀석이 하나 있다. 요청 하나를 처리하려면 외부 시스템 서너곳에 다녀와야 하는데, 각 호출이 다 끝날때까지 스레드가 그냥 멍하니 기다린다. 트래픽이 몰리면 톰캣 스레드풀(기본 200개)이 금방 동나고, 그 다음 요청들은 큐에서 줄을 선다. CPU는 놀고 있는데 처리량은 안 올라...
마케팅 메일 발송 시스템 만들기
마케팅 메일 발송 시스템 만들기 회사에서 마케팅 메일과 공지 메일을 발송하는 시스템을 직접 만들었다. 처음엔 그냥 외부 메일 서비스(스티비나 메일침프 같은)를 붙이면 되는거 아닌가 싶었는데, 막상 요구사항을 들어보니 사내 다른 서비스들과 구독자 정보를 주고받아야 하고, 발송 결과를 우리 쪽에 쌓아서 통계도 봐야 하고, 외부 SaaS에 고객 이메일을 통...
JPA Transactional 점검하기
JPA Transactional 점검하기 JPA를 다루는 개발자라면 Transactional의 동작 원리를 정확히 이해해야 한다. 하지만 솔직히 말하면, 프로젝트 초기에 세운 가이드라인을 처음에는 잘 지켰지만 개발이 진행되면서 점점 일단 @Transactional 붙이고 보자는 식으로 습관적으로 사용했던 적이 많다. 당연히 이런 무분별한 사용은 여러 ...
Application Load Balancer에 고정 IP 사용하기 (feat. VPC IPAM 통합)
Application Load Balancer에 고정 IP 사용하기 (feat. VPC IPAM 통합) aws 콘솔 보다가 이런걸 발견했다. 궁금해서 찾아보니까 이런 글을 확인할 수 있었다. (마참내!) ALB에 고정IP를 사용하려고 앞에 NLB 붙이기, 프록시 서버 사용하기, Global Accelerator과 통합하기, Lambda 사용하기...
야간 및 주말에 AWS Fargate 동적으로 운영하기
야간 및 주말에 AWS Fargate 동적으로 운영하기 사내에서만 사용하는 관리자(관제) 서비스가 있다. 아주 가끔 업무 시간외에 쓸일이 있긴 하지만 대부분의 경우 평일 21시 ~ 08시, 주말에는 전혀 사용하지 않는다. 클라우드의 장점중 필요한 만큼만 사용, 필요할 때만 사용을 중요한 장점으로 생각한다. 그래서 이 기회에 AWS Fargate 를 ...
Arm 아키텍처에서 AAPT2 빌드 도구 사용하기
Arm 아키텍처에서 AAPT2 빌드 도구 사용하기 최근 개발서버의 아키텍처를 x86 에서 Arm 으로 변경했다. (더 싸서) 해당 서버에는 gitea, Jenkins, Nexus Repository 가 굴러가고 있었다. 마이그레이션은 그럭저럭 순조롭게 진행했는데 문제는 Jenkins job을 마이그레이션 하던중, 특정 job에서 안드로이드를 빌드하는...