본문 바로가기

전체 글85

[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.
LLM 프롬프트 디자인 AI를 (LLM) 사용하여 원하는 결과를 얻기 위해서는 원하는 결과물에 대하여 프롬프트를 통해 상세하게 알려주어야 한다. 이를 프롬프트 디자인이라 하고 아래 7가지 항목에 대하여 프롬프트를 상세하게 작성해야 원하는 사용자가 원하는 결과물을 얻을 수 있다.  AI 예제 프롬프트이전 포스팅에서 구현했던(https://blog.igooo.org/150) Spring AI 예제를 통해 각 항목에 맞게 프롬프트를 디자인 했는지 알아본다.You are a friendly AI assistant designed to help with the management of a user's todo called igooo. Your job is to answer questions about and to perform acti.. 2024. 11. 12.
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.
Building a SpringBoot Monorepo with Gradle 개요Gradle을 사용하여 프로젝트를 Monorepo로 관리하는 방법에 대하여 설명한다. MonorepoMongorepo와 multi-repo에 대하여 장단점이 있지만 어떤 기술이나 그렇지만 프로젝트 상황에 맞게 선택해서 사용하도록 한다.두 방법에 차이와 장담점에 대해서는 아래 링크에 잘 설명되어 있다.https://www.thoughtworks.com/insights/blog/agile-engineering-practices/monorepo-vs-multirepo 개인적인 생각으로는 프로젝트 인원이 적은 경우 Monorepo가 더 효율적이었고, 깃 브랜치 전략에 따라서도 프로젝트 상황에 맞게 선택하면 좋다.  프로젝트 구조Java 프로젝트로 구성할 예정이고 Gradle로 프로젝트를 구성한다. shop .. 2024. 11. 6.
Gradle JUnit 5 Tag Kotlin, Rest-assured 조합으로 통합 테스트 작성 시 JUnit 5에 @Tag 어노테이션을 사용하여 Test를 필터링한다. JUnit 5 Tag@Tag 어노테이션을 클래스 또는 메서드 수준에서 테스트를 필터링 할 수 있는 기능이다.Used to declare tags for filtering tests, either at the class or method level; analogous to test groups in TestNG or Categories in JUnit 4. Such annotations are inherited at the class level but not at the method level.참고 : https://junit.org/junit5/docs/current/.. 2024. 11. 3.
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.
Java 23 : Structured Concurrency 개요Structured Concurrency는 서로 다른 스레드에서 실행되는 관련된 작업 그룹을 하나의 작업 단위로 처리하여 오류 처리와 작업 취소를 간소화하고, 안정성을 향상하며, 관찰성을 강화하는 방식이다. Java에서는 Structured concurrency를 위한 API를 도입하여 동시성 프로그래밍을 간소화함을 목표로 한다. Kotlin에서는 코루틴 구문을 사용하여 Structured Concurrency(구조적 동시성)을 지원하지만 자바에서는 아직 Preview 상태이고 Java 23에서도 아직 Preview 상태다. 하지만 이후 버전에서는 정식 기능으로 나오기를 희망한다. Motivation개발자는 task를 여러 개의 subtask로 나눠서 복잡성을 관리한다. 일반적인 단일 스레드 코드에서.. 2024. 9. 28.
[Kotlin] REST Assured로 통합 테스트 작성하기 개요Java 프로젝트에서 자주 사용하던 REST Assured(https://rest-assured.io/)를 사용하여 Kotlin 프로젝트에서요 실제 API를 호출하는 Integraion Test를 작성한다 Java REST Assured 참고 : https://blog.igooo.org/119  Why Kotlin?Java Java로 Junit 테스트를 작성하는 경우 여러 줄의 검증 코드가 있을 때 특정줄의 검증 코드에서 오류가 발생하면 아래 검증 코드는 실행되지 않고 사용자에게 오류 라인수를 리포팅해 준다.......then(). statusCode(200). body("size", is(3)). body("name.any { it == 'Ervin Howell' }", is(tru.. 2024. 9. 25.