[Dev-Fortune] 시리즈 다시보기


1. 프롤로그: 왜 ‘AI 개발자’ 사주인가?

전통적인 동양 철학의 사주명리학(四柱命理學)은 대중적이고 흥미로운 도메인이지만, 현대의 소프트웨어 엔지니어들에게는 다소 난해하고 거리감이 느껴지는 영역입니다. “올해는 수(水)의 기운이 과하여 화(火)가 상하니…” 같은 해석은 직관적으로 와닿지 않습니다.

그런데 만약 **“실리콘밸리 15년 차 시니컬한 시니어 아키텍트”**가 나의 생년월일시와 고민을 코드로 분석해 준다면 어떨까요?

  • “너의 사주는 모놀리식 레거시 시스템처럼 과도하게 결합되어 있어 리팩토링이 시급하다.”
  • “올해의 운세는 분산 락(Distributed Lock) 경합이 발생하는 형국이니 무리한 이직 시도는 데드락을 초래할 것이다.”

이러한 유쾌한 상상에서 출발한 프로젝트가 바로 **‘Dev-Fortune(개발자 사주 디버거)’**입니다. 따뜻한 위로 대신, 차갑고 명확한 개발 용어로 인생의 안티패턴을 짚어주고 코드 리뷰하듯 처방전을 내려주는 AI 챗봇을 만드는 여정을 시작합니다.


2. 도메인 재해석: 명리학과 소프트웨어 공학의 매핑

전통 사주 데이터를 LLM이 효과적으로 해석하고 개발자 언어로 치환할 수 있도록 다음과 같은 도메인 매핑 테이블을 정의했습니다.

전통 명리학 개념 IT / 소프트웨어 공학 개념 AI 페르소나의 해석 관점
오행(목, 화, 토, 금, 수) 인프라 레이어 (Front, Back, DB, Network, DevOps) 특정 기술 스택에 치우친 편중도 분석
신살 / 흉살 (도화살, 역마살 등) 코드 스멜 (Code Smell) & 안티패턴 스파게티 코드, 신(God) 클래스, 하드코딩 등
용신 (나를 돕는 기운) 클린 아키텍처 & 리팩토링 원칙 TDD 도입, 결합도 낮추기, 비동기 큐 도입
대운 / 세운 (10년/1년 주기 운세) 테크트리 & 메이저 마이그레이션 주기 레거시 마이그레이션 타이밍, 아키텍처 전환점

이러한 체계적인 도메인 모델링 덕분에 RAG 검색 시 사용자 질의에 맞춰 최적의 안티패턴 데이터 청크를 조회할 수 있게 됩니다.


3. 전체 시스템 아키텍처 (System Architecture)

Dev-Fortune의 전체 시스템 아키텍처는 Spring Boot 3 기반의 백엔드와 로컬 추론 엔진인 Ollama, 그리고 RAG를 위한 인메모리 벡터 저장소로 구성됩니다.

flowchart TB subgraph Client ["Client Layer"] UI[웹 프론트엔드 UI] end
subgraph Backend ["Spring Boot 3.3.x Application"]
    Controller[FortuneChatController (WebFlux)]
    Service[FortuneAIService]
    PromptEngine[System / User Prompt Orchestrator]
    VectorStore[(SimpleVectorStore (RAM))]
    DataLoader[SajuJsonDataLoader]
end

subgraph AI_Engine ["Local AI Engine"]
    OllamaServer["Ollama Daemon (Port: 11434)"]
    ChatModel["LLM: qwen2.5:3b"]
    EmbedModel["Embedding: nomic-embed-text"]
end

subgraph Data ["Raw Knowledge"]
    RawJson[("sajuAPI.json (안티패턴 및 운세 DB)")]
end

RawJson -->|서버 구동 시 Ingestion| DataLoader
DataLoader -->|텍스트 정제 및 임베딩| VectorStore

UI -->|1. 고민 입력 POST| Controller
Controller -->|2. 분석 위임| Service
Service -->|3. 유사도 검색| VectorStore
VectorStore -.->|4. 관련 지식 반환| Service
Service -->|5. 프롬프트 조합| PromptEngine
PromptEngine -->|6. 스트리밍 요청| OllamaServer
OllamaServer --> ChatModel
ChatModel -->>|7. 토큰 스트림| Service
Service -->>|8. SSE 이벤트 전송| Controller
Controller -->>|9. 실시간 타이핑 렌더링| UI

4. 기술 스택 선정 이유 (The Stack Rationale)

프로젝트를 구상할 때 가장 고민했던 기술 스택들의 선정 배경입니다.

1) 백엔드: Spring Boot 3.x + Spring AI

파이썬 생태계(LangChain) 대신 자바 생태계를 선택한 이유는 엔터프라이즈급 안정성과 타입 안정성 때문입니다.

  • Spring AI의 등장: 2024년 정식 공개된 Spring AI는 기존 Spring 생태계의 POJO, 의존성 주입(DI), 선언적 클라이언트 패턴을 그대로 유지하면서 모델 추상화(ChatClient), 프롬프트 템플릿, 벡터 스토어를 일관된 인터페이스로 제공합니다.
  • 포터블한 구조: 코드 변경 없이 프로퍼티 설정만으로 OpenAI, Anthropic, Ollama, HuggingFace 등 다양한 백엔드를 자유롭게 스위칭할 수 있습니다.

2) AI 추론 엔진: 로컬 Ollama (qwen2.5:3b)

  • 비용 제로: 상용 API(GPT-4 등)의 토큰 과금 걱정 없이 무제한으로 테스트하고 개발할 수 있습니다.
  • 데이터 프라이버시: 사용자의 민감한 개인 정보나 생년월일, 속마음 고민이 외부 클라우드로 유출되지 않고 로컬 머신에서만 처리됩니다.
  • qwen2.5:3b 선택 이유: 3B(30억 파라미터)급 경량 모델임에도 한국어 이해 능력과 추론 지시 이행 능력이 매우 뛰어나며, M1/M2 맥북이나 일반 로컬 PC에서도 초당 30~50토큰의 빠른 생성 속도를 보장합니다.

3) RAG 벡터 저장소: SimpleVectorStore

  • 외부 데이터베이스(Pinecone, Milvus 등)를 설치하고 운영하는 복잡도를 줄이기 위해 Spring AI가 내장한 인메모리 벡터 저장소를 채택했습니다.
  • 사주 텍스트 데이터가 수백 개 규모이므로 RAM 상에서 코사인 유사도 연산을 수행해도 수 밀리초 내에 즉각적인 결과가 반환됩니다.

4) 실시간 반응형 스트리밍: Spring WebFlux & SSE (Server-Sent Events)

  • LLM 응답은 전체 문장이 완성될 때까지 수 초가 걸릴 수 있습니다.
  • WebSocket보다 가볍고 단방향 텍스트 전달에 최적화된 HTTP 기반의 **SSE(Server-Sent Events)**를 채택하여 한 글자씩 실시간으로 화면에 출력되는 뛰어난 사용자 경험(UX)을 구축합니다.

5. Dev-Fortune 7부작 연재 로드맵

본 프로젝트는 총 7개의 포스팅으로 나누어 기초 인프라 구축부터 최종 아키텍처 회고까지 체계적으로 다룹니다.

회차 주제 핵심 내용
1편 기획 및 아키텍처 설계 도메인 모델링, 시스템 구성도, 기술 스택 선정 배경 (현재 글)
2편 Ollama 로컬 LLM 연동 Ollama 설치, 모델 서빙, Spring Boot application.properties 연동 및 최적화
3편 RAG & Vector Store 구축 JSON 데이터 로더, 텍스트 청킹, SimpleVectorStore 임베딩 주입
4편 프롬프트 엔지니어링 시니컬한 시니어 페르소나 설계, Few-Shot 가드레일 기법
5편 비동기 스트리밍 API WebFlux, SSE(Server-Sent Events), 실시간 토큰 전송 파이프라인
6편 엔드투엔드 워크플로우 분석 질문부터 응답까지 시퀀스 심층 분석, 지연 시간 프로파일링
7편 프로젝트 회고 및 발전 로드맵 인메모리 한계 분석, PostgreSQL pgvector, 멀티턴 ChatMemory 확장 방안

6. 결론 및 다음 편 예고

‘Dev-Fortune’은 생성형 AI 기술을 엔지니어링 관점에서 가장 실용적이고 흥미롭게 풀어낸 프로젝트입니다. 프레임워크 뒤에 숨겨진 복잡한 수학과 모델 가중치를 자바 개발자의 언어로 다루는 법을 하나씩 배워나가게 될 것입니다.

다음 2편에서는 Ollama를 내 컴퓨터에 설치하고 Spring Boot 3 프로젝트와 연결하여 최초의 로컬 AI 응답을 받아보는 실전 연동 과정을 자세히 살펴보겠습니다.