📖 개발 공부
-
Spring Boot에서 Google Vertex AI Gemini 연동하기📖 개발 공부 2025. 3. 16. 21:46
최근 프로젝트에서 Gemini 모델을 Spring Boot에 연동하는 작업을 진행했다.이 과정에서 Google Cloud Vertex AI에서 제공하는 java-vertexai 라이브러리를 활용했다. 연동을 진행하면서 Gemini API 요청 시 다양한 옵션을 활용하여 원하는 방식으로 LLM을 제어할 수 있다는 점을 알게 되었다. 이 글에서는 Gemini 모델을 연동하는 과정과 함께 주요 설정값들을 정리해보려고 한다.Google Cloud Vertex AI란Google Cloud Vertex AI는 머신러닝(ML) 모델의 개발, 학습, 배포를 손쉽게 수행할 수 있도록 지원하는 통합 AI 플랫폼이다.Vertex AI를 사용하면 다음과 같은 작업을 수행할 수 있다.AutoML 모델 학습 및 배포사전 학습된 ..
-
메시지 큐 비교하기 (RabbitMQ, Kafka, SQS, Redis Pub/Sub)📖 개발 공부 2025. 2. 2. 23:03
회사에서 메시지 큐(Message Queue)를 도입해야 할 기회가 생겨 팀원과 함께 고민했다. 처음에는 가볍게 RabbitMQ, AWS SQS, Kafka, Redis Pub/Sub을 비교하며 선택했지만,각 메시지 큐의 특징과 차이점을 좀 더 깊이 이해하고 정리하고 싶었다. (개발 방향이 바뀌어 도입을 하진 않았다 😅) 이 글에서는 메시지 큐의 주요 기능과 차이점을 정리해보겠다. 메시지 큐 선택 기준한 메시지는 하나의 작업 서버에서만 처리해야 한다.중복 처리를 방지해야 함여러 작업 서버가 동시에 병렬적으로 처리할 수 있어야 한다.다수의 Consumer가 동시에 작업을 수행 가능해야 함빠른 성능이 중요하다.낮은 지연 시간 (Low Latency)높은 처리량 (High Throughput)이제 이 조건에..
-
코루틴 예외 처리: supervisorScope를 활용한 문제 해결📖 개발 공부/kotlin 2025. 1. 19. 15:16
후기 작성 이벤트 코드를 개발하던 중, 코루틴의 예외 처리로 인해 테스트 코드가 실패하는 문제가 발생했다.특정 유저가 이벤트 대상자인지 확인하는 로직에 코루틴이 적용되어 있었고, 다음과 같은 조건들을 비동기로 검증하고 있었다.이미 해당 업체에 후기를 작성했는지유효한 사용자인지이벤트 예산을 초과했는지문제 상황유효한 사용자인지 확인하는 조건은 다음과 같은 코드를 통해 검증하고 있었다.return runBlocking { val validUserDeferred = async(Dispatchers.IO) { checkValidUser(userId) } try { validUserDeferred.await() } catch (e: UserRestException) { return Respo..
-
Spring Batch Partitioning로 대용량 데이터 마이그레이션 최적화 및 롱 트랜잭션 해결📖 개발 공부 2024. 12. 22. 21:58
Spring Batch Partitioning 도입이번 프로젝트에서 400만개 데이터 대상으로 마이그레이션 작업을 수행해야 했다. 기존에는 하나의 스레드에서 Reader, Processor, Writer를 순차적으로 처리했기 때문에, 대용량 데이터를 다루기에는 시간이 너무 오래 걸리는 문제가 있었다. (거의 5시간 이상이 걸렸다)그래서 이번에 id 기반으로 데이터를 파티션으로 분할하고, 각 파티션에서 병렬로 Reader/Processor/Writer를 동작하도록 파티셔닝 방식을 적용했다. 파티셔닝 방식은 다음과 같은 장점이 있다.독립적인 실행: 각 파티션은 독립적으로 실행되므로, 특정 파티션에서 오류가 발생해도 다른 파티션 작업에는 영향을 주지 않는다.효율적인 에러 관리: 각 파티션의 상태와 데이터 범위..
-
Hikari CP 설정 알아보기📖 개발 공부 2024. 11. 24. 21:07
최근 회사에서 DB 관련한 이슈가 꽤 발생했었다."Unable to acquire JDBC Connection 에러 발생""연결된 connection 수가 예상보다 2배 많은 상황""slow query가 잡혀서 error가 튀는 상황"…위 이슈들을 대응하면서, HikariCP의 동작 원리와 설정값들을 충분히 이해하고 있어야만 이슈 파악에 도움이 될 것이라는 생각이 들었다. 그래서 이번 기회에 HikariCP에 대해 정리해려고 한다!Connection Pool커넥션 풀(Connection Pool)은 데이터베이스와의 연결을 미리 생성해 두고, 필요할 때마다 이를 재사용하는 방식으로 성능을 최적화하는 기술이다. 커넥션을 매번 새로 생성하는 것은 시간이 많이 걸리고 리소스를 낭비할 수 있다. 커넥션 풀은 애플..
-
Spring 트랜잭션 롤백 관리: rollback-only 이슈 분석과 해결📖 개발 공부 2024. 11. 10. 14:39
"Transaction silently rolled back because it has been marked as rollback-only"요 에러는 어떤 상황에 발생할까?문제 상황회사에서 주기적으로 돌고 있는 배치잡에서 Transaction silently rolled back because it has been marked as rollback-only이런 로그가 발생하면서, 데이터 처리가 누락된 현상들을 종종 발견했다. 확인해보니 데이터 변경 로직이 포함된 유스케이스 메서드에 @Transactional 어노테이션이 적용되어 있으며, 이 메서드에서 @Transactional 이 적용된 FindHelper 클래스의 메서드를 호출하고 있다. 이 FindHelper 메서드에서 특정 조건에 부합하지 않으면,..
-
테스트 코드 개선하기: Kotest 모킹 초기화 및 구조 개선📖 개발 공부/kotlin 2024. 10. 27. 16:37
이번 개선의 목표는 테스트 코드의 가시성과 효율성을 높이는 데 있다.여러 케이스에서 원하는 동작을 정확히 호출하고 의도한 타입의 응답을 반환하는지 확인했지만, 기존 코드에서는 불필요한 모킹이 많아 가독성이 떨어졌다. 이에 개선한 사항과 과정에서 새롭게 알게 된 내용을 정리해보려고 한다.AS-IS기존 코드에서는 다음 세 가지 케이스를 나누어 테스트를 진행했다.LLM 최소 조건을 충족하고 LLM 응답이 성공하는 경우LLM을 호출하며, 결과로 ContentResultByLLM을 반환해야 한다.LLM 최소 조건을 충족하지만 LLM 응답이 실패하는 경우LLM 호출 후 실패 시, ContentResultByRuleBased를 반환해아 한다.LLM 최소 조건을 충족하지 않는 경우LLM을 호출하지 않고, Content..
-
Kotlin의 Value Class로 성능 최적화하기 (Codes like a class, works like an int.)📖 개발 공부/kotlin 2024. 10. 7. 22:21
코틀린, 저는 이렇게 쓰고 있습니다 | 카카오페이 기술 블로그코틀린으로 서비스를 개발하며 직접 경험한 코틀린의 매력을 소개합니다.tech.kakaopay.com위 글을 통해 value class를 처음 접하게 되었다. 더 깊이 이해하고 정리하기 위해 이번 글에서 value class에 대해 자세히 다뤄보려고 한다.Value Class란?Kotlin의 value class는 코틀린에서 값을 나타내기 위한 wrapper 클래스이다. 이는 primitive 타입의 값을 객체와 같이 다룰 수 있게 해주면서도, wrapper 클래스의 오버헤드 문제를 해결할 수 있다. 기존의 클래스와 Value Class의 차이점기존에 Kotlin에서는 데이터 처리를 위해 Data Class를 주로 사용했다. Data Class는..