본문 바로가기

dev/spring30

[Spring] Redisson으로 분산락 구현하기(Distrubuted Lock) 개요분산락은(Distrubuted Lock) 서로 다른 프로레스가 공유 리소스를 상화 배타적인 방식으로 작동해야 하는 분산 환경에서 매우 유용한 방식이다.Redis를 사용하면 쉽게 분산락을(Distrubuted Lock) 구현할 수 있다. Redis의 데이터 처리는 Single Thread로 처리되며 모든 요청이 순차적으로 처리되기 때문에 DB를 사용한 분산락 보다 쉽게 구현이 가능한다. Redis ClientLettuceSpring에 spring-boot-starter-data-redis를 사용하면 lettuce-core 라이브러리가 기본적으로 redis client로 사용된다. lettuce는 redis lock 관련 기능은 별도로 제공하지 않고, 일반적으로 Spin lock 형태로 별도로 구현한다... 2024. 11. 21.
Spring Batch MongoDB 빠르게 수집하기 (MongoCursorItemReader) 개요MSA 구조로 개발하면서 서비스는 점점 작은 기능 단위로 나눠지고 그로 인해 데이터 구조도 단순해지면서 MySQL과 같은 RDB에서 MongoDB 같은 NoSQL로 이동하고 있고, Spring에서도 RDB만 지원 기능이 점점 MongoDB도 지원하도록 기능이 추가되고 있다. (Spring Batch에서 MongoDB를 JobRepository로 제공 예정 https://github.com/spring-projects/spring-batch/issues/877)  MongoDB를 사용하는 곳이 늘어 남에 따라 Spring Batch에서도 지속적으로 MongoDB 관련 기능이 추가되고 있는데 그중 MongoDB에서 데이터를 조회하는 MongoCursorItemReader에 대하여 알아본다. MongoPa.. 2024. 11. 8.
Spring AI를 사용한 AI 어시스턴트 구현 RAG - Part 2 (with OpenAI) 개요Spring AI에 첫 번째 부분에서 Spring AI를 LLM과(대규모 언어 모델) 통합하는 기본 사항에 대하여 구현했다. 사용자 지정 ChatClient를 생성하여 애플리케이션에서 제공하는 함수를 호출하에 사용자 프롬프트에 응답하는 기능에 대하여 구현했다. Part 2에서는 일반적인 함수 호출 방식의 제약에 맞지 않은 대규모 데이터 세트를 처리할 수 있는 기술인 RAG를(Retrieval-Augmented Generation) 사용하여 검색 기능을 살펴보고, RAG를 사용하여 어떻게 AI를 애플리케이션과 통합할 수 있는지 알아본다. RAG(Retrieval-Augmented Generation)  RAG(Retrieval-Augmented Generation)는 대규모 언어 모델의 출력을 최적화하.. 2024. 10. 3.
Spring AI를 사용한 AI 어시스턴트 구현 - Part 1 (with OpenAI) 개요Spring AI를 활용하여 사용자가 자연어 사용을 통한 애플리케이션과 상호작용할 수 있도록 AI 어시스턴스 기능을 구현한다. Spring AI 예제는 Spring Petclinic을 사용하여 구현했지만, 아래 예제에서는 심플한 TODO 애플리케이션을 구현하여 AI 어시스턴트 기능 구현에 대하여 설명한다.  사용된 기술Spring Petclinic 코드를(https://github.com/spring-projects/spring-petclinic/tree/spring-ai) 기반으로 예제를 작성할 예정이라 AI 기능을 제외한 기능에 대해서는 Spring Petclinic AI 코드를 참고한다.Spring AI는 다양한 LLM 모델을 지원하지만 예제에서는 OpenAI를 사용하여 구현한다.(OpenAI를.. 2024. 10. 1.
[Spring] Rest service with Hexagonal architecture 개요Hexagonal Architecture의 아이디어는 입력과 출력을 시스템 아키텍처의 가장자리에 두는 것이다. 또한 비즈니스 로직은 어떤 형태의 API를(REST, GraphQL API,...) 제공하는지 여부에 따라 달라져서는 안 되며, 변경이 가능한 경우는 비즈니스 로직이 변경된 경우에만 변경이 가능하다. 또한 서비스에서 필요한 데이터를 Database, 마이크로 서비스 API 또는 CSV 파일 등 어디서 가져오는지에 따라 비즈니스 로직이 변경되지 않아야 한다.위 패턴을 사용하면 애플리케이션의 핵심 로직을 외부 환경으로부터 격리할 수 있고, 핵심 로직을 격리하면 코드 베이스에 큰 영향을 주거나 주요 코드를 다시 작성하지 않고도 Data Source를 쉽게 변경할 수 있다.경계를 명확히 구분하면 주.. 2024. 9. 22.
[Spring] @Async와 Virtual Thread 개요Java 21에 Virtual Thread와 Spring @Async 어노테이션을 조합하여 비동기 프로그래밍 방법을 알아본다. Spring @Async@Async 어노테이션을 Spring의 AOP를 사용하여 비동기 메서드 실행을 제공한다.@Async는 기본적으로 AOP로 실행되며 Proxy Parttern의 한계점을 가진다.public 메서드로만 사용가능self-invocation 불가메서드 리턴 타입은 void로 설정하거나, Future / ListenableFuture / CompletableFuture로 설정하여 비동기 처리를 할 수 있다.void 리턴 타압의 경우 Exception 처리를 위하여 AsyncUncaughtExceptionHandler를 사용하여 처리할 수 있다. 프로젝트 구조HT.. 2024. 9. 14.