AOP 기반 Lock 인터페이스 추상화, Redisson 분산락 적용 동시성 처리(Spring)
·
Spring/AOP
들어가며이번 포스팅에서는 100명의 사용자가 동시에 같은 게시글에 좋아요 또는 좋아요 취소를 누르는 상황에서 발생하는 예시 상황과 같은, 동시성 문제를 어떻게 해결할 수 있을지 다루어보려 한다 일단 내가 구현한 기능에서 좋아요는 인스타의 좋아요처럼 누르고, 다시 누르면 취소하는 로직이였다. 그래서 좋아요 수를 올리는 과정에서 락을 걸지 않으면, 동시에 여러 쓰레드나 요청이 동일한 데이터를 수정하면서 정합성 이나 데이터 유실 문제가 발생할 수 있다고 판단했어서 여러 방법을 고민하다가 분산락을 적용하는 방향으로 생각했다Redisson먼저 Redisson이 뭔지에 대해서 먼저 알아보자Redisson이란 ?자바 언어로 구현된 Redis 클라이언트 라이브러리이다. 주로 분산 시스템에서 동시성 문제를 해결하기 위해..
FewShot, ChatHistory 활용해서 RAG 고도화 + Streamlit으로 배포 (LangChain)
·
Python/Langchain
들어가며이번 포스팅은 이전 키워드 사전 활용으로 Retrieval 효율개선이라는 내용의 포스팅에서, 추가로 FewShot, ChatHistory를 통해 고도화한 내용이라 아래 포스팅을 못본 사람들은 참고해주면 좋을거같다 🙇🏻‍♂️https://huncozyboy.tistory.com/42 키워드 사전 활용으로 Retrieval 효율개선 (LangChain)들어가며사용자 질문 표현이 검색 성능에 미치는 영향여러가지 Chat GPT를 포함한 생성형 AI 모델들을 사용하게 되면, 종종 사용자 질문이 모델의 답변 정확도에 큰 영향을 주는 것을 체감하게 된huncozyboy.tistory.comFewShot이란?먼저 실습을 진행하며 코드를 입력했던 내용을 공유하기 전에, FewShot이라는 개념에 대해서 알아..
Caffeine + Redis 2-Level 캐싱 (Spring)
·
Spring/캐싱
들어가며이번 포스팅은 게시글 조회에서, 게시글이 10개, 100개일때와 수천 개 이상이 되는 순간을 고민했을때의 대용량 데이터의 조회 API(게시글 상세, 전체 목록 등) 을 위해서 Redis를 활용한 캐싱을 적용하며, 고민했던 내용을 담아보려한다캐싱을 적용해야하는 이유는 무엇일까 ?서론에서도 짧게 작성했었지만, 게시글 상세 조회나 전체 목록 조회는 로직 자체는 단순할지 모르지만, 많은 사용자들이 짧은 시간 안에 반복적으로 호출하게 된다면 ? 그 게시글이 1,000개, 10,000개가 된다면 ? 과 같은 고민을 하게된다면 이는 DB에 부하가 크게 가게되어, 무리를 줄것이라고 생각했다. 이럴 때 캐싱을 적용하면, 이미 조회된 결과를 메모리나 외부 캐시에서 즉시 꺼내 쓰기 때문에 평균 응답 속도가 눈에 띄게..
도커 네트워크, 실습 (DevOps)
·
DevOps/Docker
들어가며이번 포스팅에서는 도커의 네트워크에 대해서 다루어보려고 한다. 평소 docker networks 는 docker-compose 파일을 docker compose up -d로 실행해줄때 mysql, mongodb, redis, kafka 등을 하나의 서버에서 한번에 실행하기 위해, 설정해줘야하는 값으로만 알고 있었던 상태였고직접 서브넷과 게이트웨이를 지정을 해본다거나 컨테이너 간 통신을 실제로 해봤던 적은 없었는데, 이번 기회에 해당 부분을 다루어보게 되었다네트워크 관련 개념도커 네트워크에 대해서 다루어보기 전에, 아래의 기본적인 네트워크 관련 개념들을 알고만 있어주면 될거같다네트워크란?여러 장치가 서로 연결되어 정보를 주고받을 수 있는 시스템이다. 우리가 컴퓨터에서 웹사이트를 열 때도, 서버에 요..
AOP 활용해서 Request 로그 추적 (Spring)
·
Spring/AOP
들어가며먼저, AOP를 사용해야겠다라고 생각했던 이유는 Redis 캐싱을 적용해서, 게시글 상세 조회나 전체 목록 조회 등의 내용의 응답 시간을 단축 시켰는데, 실제로 구체적인 Request 로그로 확인해보고 싶었기에 해당 내용에 대해서 공부한 뒤 적용해봤다(Redis 캐싱은 Caffeine + Redis 을 합친 2-Level 캐시로 구현했는데, 구현한 내용은 다른 포스팅에서 작성해보려한다)AOP의 개념먼저 AOP와 해당 기능을 사용했을때 장점에 대해서 얘기해보려 한다AOP란 ?관점(Aspect)지향 프로그래밍으로, 관점을 기준으로 다양한 기능을 분리하여 보는 프로그래밍이다.여기서 관점은, 부가 기능과 그 적용처를 정의하고 합쳐서 모듈로 만든 것을 의미한다 즉, 정리하자면 비즈니스 핵심적인 기능은 아닐..
Swagger : CORS, Network Failure, URL scheme must be "http" or "https" 트러블 슈팅 (Spring)
·
Spring/CORS
문제 상황더미데이터를 넣고, Try it out으로 테스트를 하던 중에,로컬 환경이 아닌, 배포를 해놨었던 배포 서버 환경에서 아래 사진처럼 CORS, Network Failure, URL scheme must be "http" or "https" for CORS와 같은 에러가 발생했다트러블 슈팅서버도 정상적으로 실행되고 있었고, 도커 컨테이너에도 문제가 없었기에, SwaggerConfig 아니면 SecurityConfig 문제라고 생각하고 트러블 슈팅을 시작했었다. 실제로 SOPT에서 2주동안 진행되는 합동세미나에서 운영하는 서버였기에 corsConfig는 전체 허용이 되어있어 Swagger 설정 문제일거같다고 느낌은 왔었다 😬 그러던중, 스웨거에 서버 URL이 http로 되어있는걸 확인하고 경로가 ..
키워드 사전 활용으로 Retrieval 효율개선 (LangChain)
·
Python/Langchain
들어가며사용자 질문 표현이 검색 성능에 미치는 영향여러가지 Chat GPT를 포함한 생성형 AI 모델들을 사용하게 되면, 종종 사용자 질문이 모델의 답변 정확도에 큰 영향을 주는 것을 체감하게 된다. 특히 RAG 이전 실습에서 소득세법 문서를 학습시켜, 간단한 AI 모델을 구성하여 질문해보면서 느꼈던 점은, 사용자 질문의 표현 방식이 검색 성능에 치명적인 영향을 미친다는 것이었다{'query': '연봉 5천만원인 직장인의 종합소득세는?', 'result': '근로소득에 대한 종합소득세는 기본세율이 적용됩니다. 따라서, 연봉 5천만원인 직장인의 종합소득세는 개별적인 경우에 따라 달라질 수 있으며 정확한 계산을 위해서는 기본세율표를 참조하여야 합니다. 구체적인 세율 적용 및 공제 항목을 고려해 정확한 금액..
RAG 개념 + Vector와 Embedding (Python)
·
Python/Langchain
들어가며요새 AI의 중요성을 뼈저리게 느끼면서, 구름톤 동아리 스터디에서 LLM 강의를 수강하기로 하였다. LLM은 강력한 텍스트 생성 능력을 가지고 있지만, 최신 정보나 특정 도메인의 법률과 같이 아주 구체적인 데이터는 잘 다루지 못한다. 따라서 이러한 약점을 보완할 수 있는 구조가 필요했고, RAG가 그 해답이었다고한다. 실제로 강의를 수강하고, 프로젝트에서 어떻게 적용해볼지에 대한 부분까지 계획하고 공유하는 스터디를 진행해보기로 하였다 예를 들어 GPT-4는 2023년 12월까지의 데이터까지만 보유하고 있어서 이후 개정된 세법을 반영할 수 없다던지, 외부 지식를 기반으로 답변을 생성하게 해줘야하므로, RAG를 효율적으로 활용한 튜닝 또한, LLM에서 정말 중요한 부분이라고 느꼈다본문RAG이란 ?RA..
클라우드 네이티브 애플리케이션 + LEAFY 실습 (DevOps)
·
DevOps/Docker
서론클라우드 네이티브 아키텍처는 나도 생소한 개념이였는데, 간단하게 설명하면 여러 서비스를 유기적으로 연결해주는 기술인데, 프로젝트 구조를 보다 유연하고 확장 가능하게 만들어준다고 한다. 이번 포스팅에서는 클라우드 네이티브의 기본 개념부터 시작해서, Leafy라는 식물 관리 애플리케이션을 실제로 컨테이너 환경에서 구성했던 과정을 기록해봤다본론클라우드 네이티브클라우드의 형태는 크게 두가지가 있다고 나오는데, 퍼블릭 클라우드는 AWS, GCP처럼 누구나 사용 가능한 형태고 프라이빗 클라우드는 조직 내부에서만 사용하는 방식인데, 보안성도 높고 비용 최적화에도 도움이 된다고 배웠다서론에서도 간단하게 얘기했었지만, 클라우드를 사용하게 되면 가장 큰 장점은 유연성이라고 느꼈다. 그 이유는 아래와 같다 클라우드를 사..
이미지 레지스트리와 빌드 (DevOps)
·
DevOps/Docker
들어가며이번 포스팅에서는 이미지랑 컨테이너를 어떻게 공유하고, 관리하고, 생성하는 과정에 대해서 다루려고 한다. 그중에서도 이미지의 저장소인 레지스트리랑 직접 이미지를 생성하는 빌드 과정을 함께 정리해보았다본론이미지 레지스트리란?이미지 레지스트리(Registry)는 도커 이미지들을 저장하고 공유할 수 있는 중앙 저장소 역할을 한다. 대표적으로는 Docker Hub가 있으며, 기업에서는 자체적인 프라이빗 레지스트리를 운영하기도 한다고 한다. Docker Hub 에서는 docker pull, docker push 명령어를 통해 이미지를 주고받을 수 있다만약 이미지를 레지스트리에 업로드하려면 아래의 단계로 진행이 되는데,1. docker tag 명령어로 이미지에 태그를 붙이기2. docker login을 통..