🌏 인트로서비스를 실제로 개발하다 보면 단위 테스트(Unit Test)보다 훨씬 현실적인 End-to-End(E2E) 테스트를 작성할 일이 많습니다.E2E 테스트는 실제 API를 호출하고, 데이터베이스와의 연동, 인증 절차, 외부 요청 등까지 통합적으로 검증하는 테스트입니다.✅ E2E 테스트 예시(인수테스트입니다)@Testvoid 고객이_자신의_리워드를_조회한다() { String ownerAccessToken = 카페_사장_회원_가입_요청하고_액세스_토큰_반환(OWNER_CREATE_REQUEST); Long savedCafeId = 카페_생성_요청하고_아이디_반환(ownerAccessToken, CAFE_CREATE_REQUEST); String customerToken = 가입_고..
PROJECT
🌏 인트로서비스를 개발하다 보면 생각보다 비동기적으로 처리해야 하는 작업들이 많아진다. LLM 호출한다던지, 외부 API 연동, S3에 저장한다던지 등등 외부와 함께 해야하는 작업이 이어질 때, 응답 지연이 길고, 순차적으로 처리하면 전체 서비스가 느려질 수 있다. 그래서 우리는 보통 “비동기 처리”로 이런 작업을 분리한다. 하지만 문제는, 비동기 처리 과정에서 데이터가 섞이거나 순서가 깨지는 상황이 생긴다는 점이다. 동시에 여러 이벤트가 발행될 때 Race Condition이 발생하는 것이다. 이 글에서는 Spring 환경에서 이벤트 기반 아키텍처를 사용하면서 응답 순서를 보장하기 위해 이벤트를 직렬로 처리하는 방식을 설계한 경험을 공유하고자 한다. 🌏 문제 상황: 비동기 이벤트 처리 시의 순서 ..
관련 레포: https://github.com/AiResearch2025/FigVarietyRAGChat GitHub - AiResearch2025/FigVarietyRAGChat: RAG 기반 희귀품종 무화과 챗봇 프로젝트RAG 기반 희귀품종 무화과 챗봇 프로젝트. Contribute to AiResearch2025/FigVarietyRAGChat development by creating an account on GitHub.github.com 🌏 AI Agent✅ AI Agent가 해야 할 일AI Agent는 사용자의 질문이 들어오면 곧바로 그 질문을 LLM에 돌리기 전에 우선 질문을 아래와 같이 분류하고, 각 분류에 따라서 우리가 정해놓은 로직에 따라서 처리한다. 사용자가 특정 품종 이름을 알고..
관련 PR https://github.com/AiResearch2025/FigVarietyRAGChat/pull/1 feat: vector DB (query by variety / feature) by gitchannn · Pull Request #1 · AiResearch2025/FigVarietyRAGChat github.com 🌏 데이터 수집 from 무화과 도감우선 RAG의 근간이 될 텍스트 데이터를 모았습니다. 무화과 품종 관련 자료를 모으기 위해서 무화과도감의 데이터를 이용했습니다. 무화과도감을 LLM이 해석한 자연어를 각각은 txt 파일에 넣었습니다. 좀더 와닿도록 하나만 예를 들어서 보여드리자면, Strawberry_Verte.txt스트로베리 베르테(Strawberry Verte, SV..
🌏 인트로학부 시절, AI 개발 과정이 지나치게 복잡하고 비효율적이라는 점에서 불편함을 느꼈다. 이를 해결하기 위해 AI 개발 생산성 플랫폼 ‘AIGOYA’를 직접 기획·개발했다. AIGOYA에서는 사용자가 쉽게 AI 개발을 시작할 수 있도록, 모듈 단위의 코드 블록(프리셋모듈) 을 미리 만들어놔서 사용자가 Drag&Drop으로 가볍게 가져다 사용할 수 있는 기능을 제공했다. 베타 사용자의 테스트 기간이 오기까지 수천 개의 프리셋모듈을 만들던 당시 발생한 이슈에 대해 이번 포스팅에서는 정리해보려고 한다. 초기에는 AI 연구실 대학원생들이 직접 제작한 코드 모듈 우리 팀 사람들이 검토하고 제공할 수 있는 시스템을 만들었지만, 베타 사용자 유입 전까지 충분한 양을 확보하기에는 코드가 턱없이 부족하고 일정이..
🌏 프로젝트의 시작,,국내에서 유통되는 무화과의 대부분(무려 95% 이상)은 ‘도핀(Dauphin)’ 품종이다.도핀은 저장성과 유통성이 좋아 상업적으로는 효율적이지만, 식감이 단단하고 당도가 낮아 집에서 직접 키워 먹는 무화과의 풍미와는 거리가 있다. 그래서 최근에는 더 부드럽고 달콤한 품종을 직접 키워보려는 사람들이 많아졌고, 나 역시 ‘즐거운 무화과 생활’이라는 네이버 카페를 통해서 품종 무화과를 접했고 나뭇가지 하나일 뿐인 삽수부터 뿌리를 내리고, 열매를 맺는 과정까지를 즐기는 사람이당. 하지만 품종 이름이나 특징이 생소한 경우가 많다.키우면서 느낀 답답함은, 품종마다 삽목(나뭇가지에서 뿌리를 내리는 과정)에 걸리는 시간이나 뿌리가 난 직후에 식물의 예민도, 햇빛을 선호하는 정도, 물을 선호하는..
🌏 운영 중단 없는 대규모 스키마 전환과 데이터 마이그레이션 전략서비스 규모가 커질수록 데이터베이스 스키마 변경과 데이터 마이그레이션은 단순한 기능 추가가 아니라 서비스 안정성과 직결되는 핵심 운영 과제가 됩니다. 특히 다중 서버 환경에서는 코드와 스키마의 버전 불일치로 인해 예상치 못한 장애가 발생할 수 있어, 사전에 철저한 설계와 단계별 검토가 필요합니다.여기서는 실제 운영 환경에서 진행했던 대규모 스키마 전환과 데이터 마이그레이션 과정을 바탕으로, 발생 가능한 문제와 이를 최소화하기 위한 전략을 정리했습니다.🌏 스키마 전환 시 발생할 수 있는 주요 문제✅ 코드-스키마 불일치DB에만 있는 컬럼: 코드가 해당 컬럼을 전혀 참조하지 않으면 문제 없음.코드에서만 존재하는 컬럼: DB에 없을 경우 애플리..
🌏 AIGOYA란?✅ 프로젝트 개요AIGOYA는 AI 개발에서 발생하는 비효율성을 해결하기 위한 AI 개발 생산성 플랫폼입니다. AI 개발 과정에서 반복되는 전처리, 모델 정의, 학습, 시각화, 평가 등을 프리셋 모듈로 제공하며, 자체 웹 기반 IDE에서 GUI를 활용한 drag-and-drop 개발 환경을 지원합니다. 또한 사용자가 쿠버네티스 기반 클라우드에서 독립된 OS을 점유 사용할 수 있도록 하여, 개발 환경을 손쉽게 구축할 수 있습니다. 부가적으로는 학습 파라미터, 코드 버전, 결과를 함께 저장 관리할 수 있어 프로젝트 추적이 용이하고, 코드 모듈을 공유하고 자신만의 AI 개발자 포트폴리오를 구성할 수 있는 커뮤니티 기능을 제공합니다.해당 프로젝트는 2024년 4월 시작되었으며, 인공지능융합사..
🌏 인트로서비스를 개발할 때 종종 마주하게 되는 문제 중 하나는 외부 API 호출과 데이터 저장을 어떻게 함께 처리할 것인가이다. 특히 LLM이나 외부 시스템과의 연동은 언제든지 실패하거나, 지연될 수 있는 잠재적 위험을 내포한다. 내 애플리케이션을 아무리 잘 만들더라도, 외부 서버가 다운 되어있거나, 데이터의 형식이 변경된다던가 무튼 아무리 내가 잘 개발하더라도 언제든 호출이 제대로 되지 않을 수 있다는 말이다.이번 글에서는 Kotlin + Spring Boot 환경에서, LLM 응답 처리와 DB 저장을 분리하여 트랜잭션을 효율적으로 관리한 경험을 소개하려고 한다.🌏 문제 상황: 모든 처리를 트랜잭션으로 묶은 경우@Transactionalfun processAllAtOnce(input: Input)..
💋 인트로 시작은 Ebook pdf 변환,,, 필기 하고싶은데 너무 불편해서 pdf로 변환하고 싶었고, 검색 끝에 유포 용도가 아닌 혼자서 볼 용도라면 캡쳐한 사진을 바탕으로 pdf로 변환해서 사용해도 된다는 정보를 얻었다! 일단 캡쳐를 하고 모아놓은 png를 pdf로 바꾸고 싶을 때 해당 프로그램을 쓰면 될 것 같다. 💋 사용 방법 이 프로그램은 여러 개의 png 파일들을 묶어 하나의 pdf 파일로 만드는 프로그램입니다. clone 받으신 후에 아래의 순서에 맞게 사용하시면 됩니다. 1. 아래 소스코드 링크에 들어가 소스코드를 git clone 명령어를 사용해 로컬에 다운로드합니다. 2. 필요한 라이브러리들을 설치해야 합니다. 다음 명령을 사용하여 설치할 수 있습니다. pip3 install Pillo..