이전 포스트까지 AI 모델이 작품 속 객체를 인식하고 설명을 생성한 뒤, 해당 정보를 FAISS 데이터 베이스에 전달하는 구조를 만들었습니다.
이 시스템은 FAST API와 SPRING BOOT를 연동하여 동작하도록 연결 할 것 이며 실시간 응답성과 인증 보안을 동시에 고려해 설계하였습니다.
전체 흐름 요약
1. 사용자가 이미지 클릭 -> FAST API 서버로 요청 전송
2. FAST API는 YOLO/CLIP 기반으로 객체 설명 전송
3. JWT 인증 토큰과 함께 설명을 SPRING BOOT 로 전송 (POST)
4. SPRING BOOT는 Painting Id 유효성 검증 후 db에 설명 저장
3/4 가 이번 포스트에서 다룰 내용입니다.
@app.post("analyze")
def analyze_click(req:AnalyzeClickRequest):
description = generate_descriptoin(req.image_id)
response = requests.post(
"http://localhost:8080/api/model/response",
json = { "paintingId":req.image_id, "description":description},
headers = {"Authorization": ACCESS_TOKEN} #JWT 인증 헤더 포함
)
return { "status" : response.status_code }
--> AI가 생성한 설명을 SPRING 서버에 POST 방식으로 전송합니다.이때 , 보안 처리를 위해 JWT 토큰을 함께 헤더에 담습니다.
! JWT 란?
JSON WEB TOKEN 는 사용자 인증 정보를 안전하게 주고 받기 위한 디지털 토큰입니다.
로그인 이후 서버가 클라이언트에게 토큰을 발급하면,
이후 요청 시 이 토큰을 HTTP HEADER에 포함시켜 서버는 유저를 식별할 수 있습니다.
구성: 헤더, 내용, 서명으로 이루어진 문자열
장점: 세션 관리 불필요, 서버가 사용자 상태를 저장하지 않아도 됨
분산 시스템에 적합
가볍고 빠름
! 비동기 처리란?
하나의 작업이 끝날때까지 기다리지 않고, 다른 작업을 병렬로 처리할 수 있는 방식입니다.
FAST API와 같은 프레임워크는 비동기 기반 서버 ( ASGI ) 를 사용해 다음을 가능하게 합니다.
- 여러 요청 동시 처리
- 응답 대기 중에도 다른 요청 처리 가능
- 서버 자원을 효율적으로 사용
@app.post("/async.process")
async def handle_asnyc():
result = await slow_task()
return result
@PostMapping("/api/model/response")
public ResponseEntity<?> receiveDescription(@RequestBody ObjectDescriptionRequest request){
Painting painting = paintingRepository.findById(reequest.getPaintingID())
.orElseThrow() -> new IllegalArgumentException("해당 그림 없음"));
painting.setBackground(request.getDescription());
return ResponseEntity.ok().build();
}
이 연동 시스템은 비동기 요청 처리, jwt 인증, 모델-백엔드 간 restful 통신 , db 저장 처리 까지 실제 프로덕션 환경에서 요구되는 다양한 기능을 통합하였습니다.