
N+1 해결·60% 단축포인트/등급 로직 AOP 모듈화
Algo는 개발 취업 준비생을 위한 통합 학습 서비스 플랫폼입니다. 알고리즘 학습, 코딩 풀이 및 AI 피드백, 스터디 모집, 기업별 실전 후기 공유를 한 곳에서 제공하며, 학습부터 취업 준비까지 이어지는 올인원 경험을 목표로 기획했습니다.
단순히 문제를 푸는 것에서 그치지 않고, AI가 코드 풀이에 즉각적인 피드백을 주고 포인트·등급업 같은 게이미피케이션 요소로 지속적인 동기부여를 하도록 설계해, 사용자가 알고리즘 학습을 끝까지 이어갈 수 있는 환경을 만드는 것이 서비스의 핵심 목적입니다.
5인 팀(Team ThreeGo)이 2025.09~2025.10 두 달간 진행했고, 저는 그중 코딩 풀이 및 AI 피드백 기능, 포인트/등급 시스템(게이미피케이션), 전역 상태 관리(Pinia)를 통한 등급업 UX를 담당했습니다. Spring Cloud Gateway + Eureka 기반 MSA 구조로 서비스를 분리하고, FastAPI로 OpenAI API를 연동해 AI 피드백을 제공하도록 아키텍처를 설계했습니다.
코드 풀이 텍스트가 AI 피드백 서버로 정상 전달되지 않는 문제 사용자가 작성한 코드에 {}, 탭, 개행 같은 특수문자가 포함되면 JSON 파싱이 깨지면서 피드백 요청이 실패했습니다. 원인은 코드 문자열을 JSON으로 직접 파싱하려 한 것이었고, JSON을 dict로 변환한 뒤 문자열을 후처리하는 방식으로 로직을 분리해 개행·특수문자를 정상 처리하도록 해결했습니다.
FastAPI와 Spring 간 통신에서 반복적으로 발생한 BadRequest Swagger로 테스트할 때마다 요청이 계속 실패해 원인을 추적한 결과, .env로 관리하던 OpenAI API 키의 인코딩/디코딩 처리가 누락되어 있었습니다. FastAPI ↔ Spring 간 문자 인코딩 처리를 명확히 맞춰 서버 간 통신을 안정화하고 호출 오류를 제거했습니다.
포인트·등급업 로직이 도메인 컨트롤러마다 흩어져 있던 문제 포인트가 지급되는 모든 기능에서 각 도메인 Controller가 포인트 지급·등급업 로직을 직접 구현하고 있어, 정책 하나만 바뀌어도 여러 컨트롤러를 다 고쳐야 했습니다. 핵심 비즈니스 로직과 보상 정책이 강하게 결합돼 있던 게 원인이라 판단해, 보상 로직을 AOP로 모듈화했습니다. 그 결과 정책 변경 시 AOP 모듈 수정만으로 전체 반영이 가능해졌고, 도메인 로직과 보상 정책이 분리되어 유지보수성이 크게 좋아졌습니다.
FastAPI + OpenAI API (AI 피드백 서버) 코딩 풀이에 대한 AI 피드백 기능은 Spring 백엔드와 분리된 별도 서버로 구성하는 게 맞다고 판단했습니다. OpenAI 공식 라이브러리는 Python 지원이 가장 활발했고, FastAPI는 비동기 처리와 Swagger 자동 문서화를 기본 제공해서 Java를 쓰는 팀원들도 API 명세를 바로 보며 연동할 수 있었습니다. Java로 직접 OpenAI를 붙이는 것보다 개발 속도와 유지보수 면에서 유리하다고 판단해 선택했습니다.
Pinia (전역 상태 관리) 등급업 이벤트는 게시글 작성, 댓글, 좋아요 등 화면 여러 곳에서 발생할 수 있는데, 그때마다 애니메이션과 UI 반응이 일관되게 동작해야 했습니다. props/이벤트로 컴포넌트 간에 상태를 넘기면 구조가 복잡해질 것 같아, 등급업 상태를 전역에서 하나로 관리하고 필요한 컴포넌트가 구독하는 방식이 맞다고 판단해 Pinia를 도입했습니다.
Spring AOP (포인트/등급업 로직 모듈화) 포인트 지급 로직을 초기에는 도메인 컨트롤러마다 직접 구현했는데, 정책이 바뀔 때마다 여러 곳을 고쳐야 하는 문제가 있었습니다. 핵심 비즈니스 로직과 보상 정책(포인트 지급, 등급업 판단)을 분리하려고 AOP를 선택했고, 이후 정책 변경 시 AOP 모듈 수정만으로 전체 반영되는 구조를 만들 수 있었습니다.
AI 피드백 파이프라인(코드 입력 → FastAPI → OpenAI → 결과 반환)을 안정화해, 사용자가 코드 풀이를 등록하면 특수문자 여부와 관계없이 AI 피드백을 정상적으로 받을 수 있게 만들었습니다.
포인트·등급업 로직을 AOP로 분리해, 이후 보상 정책이 바뀌어도 도메인 코드를 건드리지 않고 AOP 모듈만 수정하면 전체 서비스에 일관되게 반영되는 구조를 확보했습니다.
등급업 이벤트를 Pinia 전역 상태로 관리해, 서비스 전반에서 등급업 애니메이션과 상태 표현이 일관되게 트리거되도록 만들었습니다.
Spring Cloud Gateway + Eureka 기반 MSA 구조 설계에 참여해, 실제 서비스 환경을 가정한 분산 아키텍처 경험을 쌓았습니다.
Impact
N+1 해결·60% 단축
포인트/등급 로직 AOP 모듈화
Spring AOP + SQL 쿼리 최적화
Tech Stack