안녕하세요! Spring AI를 통해 LLM + RAG를 활용하여 상품 추천 시스템을 만든 과정, 문제 그리고 해결 과정을 포스팅하려고 합니다.AI 추천 시스템은 사용자가 검색을 했을 경우 그 검색어와 더불어 사용자의 과거 검색 정보, 조회한 상품, 장바구니 상품, 나이, 연령 등을 참고하여 LLM을 사용하여 상품을 추천하는 것이 핵심 목표였습니다. 설정 환경은 아래와 같습니다!Java 21Spring Boot 3.5.7Elasticsearch 8.xQdrant(Vector DB)Spring AI (운영:OpenAI Model)1. 배경: 왜 RRF(Reciprocal Rank Fusion) 검색인가?상품 추천 기능을 기획할 때, 사용자가 단순 키워드(ex 갤럭시 S24)만을 사용해서 검색하는 것뿐 아니..
안녕하세요! 제가 프로그래머스 데브코스에서 한 팀 프로젝트에서 Kafka를 사용하면서 겪었던 문제 중 이벤트 일관성 보장에 대한 내용을 포스팅하려고 합니다. 프로젝트는 MSA 환경을 기반으로 합니다.설정 환경은 아래와 같습니다!- Java 21- Spring Boot 3.5.7- Apache Kafka- Spring Batch(스케쥴러)1. 배경회원 가입 시, User 엔티티는 User-Service에서 관리하고, Cart 엔티티와 Deposit 엔티티는 각각 Domain-Service와 Payment-Service에서 관리합니다. 따라서 User 엔티티가 생성된 후, Kafka를 통한 비동기 이벤트 발행으로 다른 서비스들이 각각의 엔티티를 생성해야 했습니다:UserSignupEvent → Domain-..
안녕하세요! 제가 프로그래머스 데브코스에서 한 팀 프로젝트에서 kafka를 사용하면서 겪었던 문제 중 비동기 이벤트 처리에 대한 내용에 대해 포스팅하려고 합니다. 프로젝트는 MSA 환경을 기반으로 합니다.설정 환경은 다음과 같습니다. Java 21Spring Boot 3.5.7Apache KafkaLocust (부하 테스트)1. 배경회원 가입 시, Cart 엔티티와 Deposit 엔티티가 비동기로 생성되어야 했습니다. 정확히는 User 엔티티는 User-Service에서 관리하고, Cart 엔티티와 Deposit 엔티티는 각각 Domain-Service와 Payment-Service에서 관리합니다. 그래서 kafka를 통한 비동기 이벤트 발행을 해야 했습니다.2. Platform Thread Pool 사..
안녕하세요!이번 포스팅은 DB 커넥션 풀을 설정에 대한 내용입니다!저는 개발 초기에는 커넥션 풀이 있다고만 생각을 했지 따로 설정할 생각을 하지 않았습니다.이번에 성능 최적화에 대해 공부하면서 DB 커넥션 풀 설정을 해봤습니다. 1. 커넥션 풀(Connection Pool)이란?커넥션 풀은 DB와 연결을 미리 생성하여 풀에 보관해 두고, 필요할 때마다 가져와 사용한 후 반납하는 메커니즘입니다. 1.1 커넥션 풀을 사용하는 이유(1) 네트워크 연결 시간 단축매번 DB 커넥션을 새로 생성하면 TCP 연결 과정을 거쳐야 합니다. 이 과정은 시간이 꽤 걸리기 때문에 이미 생성된 커넥션을 재사용하여 TCP 연결 오버헤드를 제거할 수 있습니다. (2) 커넥션 개수 제한커넥션 풀은 최대 커넥션 수를 제한하여 DB가..
1. 대칭키(AES, DES)암호화와 복호화에 같은 키를 사용a와 b는 미리 동일한 비밀키를 공유a는 이 비밀키를 사용해 원본 메시지를 암호화하여 b에게 보냄b는 전달받은 암호문을 자신이 가지고 있던 동일한 비밀키로 복호화하여 원본 메시지를 확인1.1 장점속도가 매우 빠름. → 암호화/복호화 과정의 계산이 단순1.2 단점키 배송 문제(key distribution problem)암호화 통신을 시작하기 전에, 송신자와 수신자가 어떻게 안전하게 동일한 비밀키를 공유할 것인가에 대한 문제키가 중간에 탈취되면 모든 암호문이 해독될 수 있음키 관리 어려움통신해야할 상대방이 많아지면, 각 상대방마다 별도의 키를 만들어야함2. 공개키 / 비대칭키(RSA, ECC..)암호화와 복호화에 서로 다른 키를 사용하는 방식2...
안녕하세요!오늘의 포스팅은 AttributeConverter를 이용하여 여러 카테고리를 하나의 칼럼에 저장한 내용입니다. 1. AttributeConverter란?엔티티의 특정 필드 타입을 데이터베이스 컬럼 타입으로 변환하거나 그 반대의 변환을 수행할 때 사용하는 인터페이스입니다.주로 ENUM, 값 객체 등 커스텀 타입을 DB에 원하는 형태로 저장하거나 데이터를 암호화하여 저장해야 할 경우 사용됩니다.2. AttributeConverter 사용 이유저의 프로젝트에서 주요 상품인 영양제는 여러 성분이 포함되어 있어 여러 카테고리에 포함될 수 있습니다.예를 들어, '종합 비타민'이라는 상품은 '피로', 혈액순환', '항산화' 등 여러 카테고리를 가질 수 있습니다. 카테고리가 단순 분류를 위한 것이고 여러 ..
안녕하세요! 이번 포스팅은 제가 팀 프로젝트를 개선하면서 적용한 외부 API 통신 시 시스템의 안정성을 높여주는 서킷 브레이커(Circuit Breaker)와 벌크헤드(Bulkhead) 패턴에 대한 내용입니다. 1. 서킷 브레이커, 벌크헤드가 필요한 이유1.1 장애 전파 방지 및 서버 리소스 보호 외부 API 통신 시, 외부 시스템이 느려지거나 장애가 발생하면, 비즈니스 서버의 응답이 지연되거나 실패할 수 있습니다.예를 들어, 카카오페이 결제 API를 호출한다고 가정할 때, 카카오페이 API가 일시적으로 응답하지 않거나 오래 걸릴 경우, 비즈니스 서버 시스템이 외부 API의 응답을 대기하게 됩니다. 결국, 요청이 계속 쌓이다 사용자는 계속 응답을 대기하고 서버의 리소스는 고갈될 것입니다. 1.2 빠른 ..
안녕하세요!이번 포스팅은 정기 결제 승인 테스트를 할 당시, DB 커넥션 풀(HikariCP) 부족 문제 해결과 관련한 내용입니다. 정기 결제 승인 Mock 서버저는 정기 결제 승인 테스트를 하기 위해서 결제 승인 Mock 서버를 만들었습니다.정기 결제 승인까지 걸리는 지연 시간을 2~5초 정도로 랜덤으로 설정을 하고 테스트를 진행했습니다.네이버 클라우드 서버에서 애플리케이션을 실행시킨 후 로컬에서 Cloudflare Tunnel을 통해 승인 Mock 서버와 통신을 했습니다. 1. 테스트 환경 및 승인 로직테스트 환경: VUser = 100, CPU = 2.0GB, Mem = 4GB테스트 도구: Locust 우선, 외부 API 통신을 위해 WebClient 설정을 해주었습니다. 결제 승인 과정은 시간..
1. 주요 차이점1.1 데이터 전송 방식 및 위치GET : https://www.test.com/search?name=choizz&age=20- URL의 쿼리 스트링을 통해 데이터를 전송- ?뒤에 key=value 형태로 노출- &로 연결=> URL에 데이터가 그대로 드러나므로, 민감한 정보 전송에는 부적합하고 전송할 수 있는 데이터의 양이 제한적POST: - 요청 본문에(Request Body) 데이터를 담아 전송=> URL에 노출되지 않아 비교적 안정성이 높고, 데이터의 양에 제한이 없음1.2 보안성GET :- URL에 데이터가 노출, 북마크, 브라우저 히스토리, 서버 로그에 그대로 기록됨- 스니핑 등의 공격을 당할 경우 데이터 탈취 쉬움POST: - 요청 본문에 포함되므로 GET에 비해 상대적으로 ..
1. Statelessness(무상태성)란?서버가 클라이언트의 상태 정보를 저장하지 않고, 각 요청은 독립적으로 처리되도록 하는 아키텍처 설계 방식 2. 장점1. 서버 확장 용이 (Scalability)서버가 클라이언트의 상태를 저장하지 않기 때문에, 서버 간 상태 공유가 필요 없음서버를 수평적으로 확장하기 쉽고, 로드밸런싱에도 유리2. 단순한 서버 설계세션, 쿠키 등 사용자 상태 관리를 위한 로직이 필요 없어 서버 구현이 단순해짐장애 복구 시에도 상태 복원 부담이 적음3. 높은 안정성과 신뢰성각 요청이 독립적이기 때문에, 이전 요청이 실패해도 전체 흐름에 영향을 주지 않음클라이언트-서버 간의 의존성이 낮아져 유지보수가 쉬워짐4. 캐싱 처리 용이요청 결과가 클라이언트 상태에 의존하지 않기 때문에, 동일한..
- Total
- Today
- Yesterday
- 세션
- leetcode
- http메서드
- 네트워크
- 외부API
- 벌크헤드
- SpringBatch
- 싱글모듈
- redisson
- 항해99
- 알고리즘
- spring.
- 무상태성
- Http 버전
- 백준
- LLM
- java
- kafka
- 분산락
- virtual thread
- 커넥션풀문제
- jpa
- socket통신
- rrf
- 프로그래머스
- AttributeConverter
- TransactionalOutbox
- 정기결제
- StringBuilder
- 디자인패턴
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |