You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
OpenAI API 추상화 및 BeanOutputConverter로 타입 안전한 응답 처리
서버리스 아키텍처
기술
선택 이유
AWS Lambda
이미지 처리 + GPT 호출을 EC2에서 분리 → 요청별 독립 컨테이너로 메모리 격리
Java 21 SnapStart
Java Lambda 콜드 스타트 (~5초) 단축 → 스냅샷 복원 (~275ms)
Python Lambda
Java 대비 경량 스택으로 동일 작업 약 49% 빠른 처리
S3 트리거
EC2에서 S3 업로드 완료 시 Lambda 자동 호출
3. 아키텍처
전체 처리 흐름
클라이언트
│
▼
[Nginx] ──SSL 종료──▶ [EC2: Spring Boot WebFlux]
│
① 이미지 수신 + S3 업로드
② jobId 반환 + SSE 대기
│
S3 ObjectCreated 이벤트
│
▼
[AWS Lambda (Java/Python)]
③ S3에서 이미지 다운로드
④ 이미지 리사이징
⑤ GPT Vision API 호출
│
⑥ EC2 콜백 (분석 결과 전송)
│
▼
[EC2: Spring Boot WebFlux]
⑦ Redis 캐싱 + DB 저장
⑧ SSE 푸시 ──▶ 클라이언트
4. 프로젝트 구조
ReTrip-api/
├── src/main/java/ssafy/retrip/
│ ├── api/
│ │ ├── controller/retrip/ # REST API (이미지 업로드, 콜백 수신)
│ │ └── service/
│ │ ├── retrip/ # 핵심 비즈니스 로직
│ │ ├── s3/ # S3 업로드 처리
│ │ ├── sse/ # SSE 실시간 푸시
│ │ ├── cache/ # Redis 캐싱
│ │ └── openai/ # OpenAI API 연동
│ ├── config/ # Security, Redis, WebClient 설정
│ ├── domain/ # JPA 엔티티 (Retrip, RecommendationPlace)
│ └── utils/ # 메타데이터 추출, GPS, 거리 계산
│
├── nginx/ # Nginx 설정 (SSL, 리버스 프록시)
├── docker-compose.yml # EC2 컨테이너 구성
└── src/main/resources/
├── application.yml
└── analysis.prompt # GPT 분석 프롬프트
5. 아키텍처 진화 과정
동기 통신의 한계를 발견하고, 서버리스 아키텍처로 진화한 과정을 기록했습니다.
단계
방식
결과
문제
Stage 0
RestClient 동기 통신
30개 중 15개 타임아웃 (50% 실패)
스레드 블로킹 → HikariCP 고갈
Stage 1
WebClient 비동기 논블로킹
스레드 고갈 해결
150장 이미지 단일 JVM 동시 적재 한계
Stage 2
Java Lambda + SnapStart
10개 성공, 30개 실패
OpenAI TPM 200K 초과 (429)
Stage 3
gpt-5-mini + 429 재시도
30개 100% 성공 (avg 2분 20초)
응답시간 다소 길음
Stage 4
Python Lambda
30개 100% 성공 (avg 1분 33초)
-
6. 성능 테스트 결과 (k6, 30 VUs 동시 요청)
Java SnapStart vs Python Lambda
지표
Java (SnapStart)
Python
성공률
100% (30/30)
100% (30/30)
e2e 평균 응답시간
3분 04초
1분 33초
e2e p(95)
❌ 4분 13초 (임계값 초과)
✅ 2분 16초
e2e 최소
2분 01초
48.61초
e2e 최대
4분 17초
2분 16초
폴링 횟수 (요청당)
35.4회
18.3회
콜드 스타트
~275ms (SnapStart)
~1.2초
Python Lambda가 Java 대비 평균 응답시간 약 49% 단축 및 p(95) 임계값(3분) 통과