[TIL-260722] 검증 재시도 API를 만들다 발견한 동시성 문제와 비관적 락으로 해결한 과정
·
Backend/DB
우리 서비스는 콘텐츠를 등록하면 백그라운드 비동기 워커가 AI 검증을 수행하고, 프론트엔드는 폴링(Polling)으로 검증 상태를 주기적으로 조회한다. 검증이 실패한 경우에는 사용자가 '재시도(Retry)' 버튼을 눌러 다시 검증을 요청할 수 있도록 API를 추가했다. 처음엔 단순한 API라고 생각했다. 기존 검증이 진행 중인지 확인하고, 아니라면 새로운 PENDING 이력을 만들고 검증 이벤트를 발행하면 끝이라고 생각했다. 그런데 구현을 마치고 다시 코드를 보니, 사용자가 버튼을 여러 번 누르는 순간 동시성 문제가 생길 수 있다는 걸 발견했다.1. 처음 구현은 이렇게 생겼다재시도 API의 역할은 단순하다.POST /api/contents/{contentId}/retry현재 검증이 진행 중인지 확인한다...
[TIL-260721] Swagger로는 보이지 않았던 검증 파이프라인의 버그들을 잡아낸 하루
·
Backend/Architecture & Design
1. Swagger로 호출만 해보고 끝내려 했는데콘텐츠 적합성 검증 파이프라인을 다 만들고 나서, Swagger로 실제 콘텐츠를 몇 개 등록해 보면서 잘 동작하는지 확인하기로 했다.POST /api/contents → GET /api/contents/{contentId}/validation계획은 단순했다. 몇 개 등록해보고, 응답이 PASSED/REJECTED로 그럴듯하게 나오면 끝. 그런데 첫 호출부터 막혔다.2. 첫 삽질: Claude 호출이 자꾸 실패한다 — 타임아웃이 문제였다콘텐츠를 등록하고 검증 상태를 조회했더니, 자꾸 FAILED로 떨어졌다. 처음엔 프롬프트나 파싱 로직을 의심했는데, 로그를 보니 원인은 훨씬 단순했다. Claude 응답이 오기도 전에 애플리케이션이 먼저 타임아웃을 내고 있..
[TIL-260331] Spring Boot 기초: Spring Data JPA
·
Backend/Spring
어제 상품을 판매하는 애플리케이션을 만들기로 하고, myShop이라는 새 프로젝트를 생성했다.Spring Boot Dev Tools, Spring Web, Thymeleaf, Lombok, Spring Data JPA, MySQL Driver, H2 Database 등의 Dependencies를 추가해 줬었고, 어제 Lombok에 대해서만 알아 보았다.오늘은 본격적으로 애플리케이션을 구성해 보았다.pom.xml 수정스프링 부트 버전을 2.7.1로 낮추어야 해서 pom.xml을 조금 수정해주었다. 4.0.0 org.springframework.boot spring-boot-starter-parent 2.7.1 com.exampl..
[TIL-260330] Spring Boot 기초: 개요, 실습, Lombok
·
Backend/Spring
Spring Boot란?복잡한 설정 없이 빠르게 실행 가능한 Spring 애플리케이션을 만들 수 있는 프레임워크이다. 기존 Spring의 문제점 Spring Boot의 해결 방식 XML 설정 파일이 많음자동 구성톰캣 등 WAS 설치 필요내장 톰캣 제공 (jar 실행)의존성 직접 추가 복잡Starter 의존성 제공실행까지 구조가 복잡main() 메서드 한 줄로 실행새로운 프로젝트 세팅에 오래 걸림Spring Initializr로 바로 시작 가능 Spring Boot의 특징XML 설정 없이 단순 자바 수준의 설정 방식 제공톰캣 같은 WAS 자체 내장내장 서버를 이용해 별도 설정 없이 실행 가능빌드 구성을 단순화하기 위한 Spring Boot Starter 의존성 제공 (필요한 기능만 골라 쓸 수 있음)JA..