상황
우리 졸프는 프론트에서 사진을 보내주면, 스프링에서 데이터 베이스에 저장한 후 프론트에게서 받은 사진을 분석하기 위해 파이썬 서버 (FAST API) 로 보낸다.
파이썬 서버는 순차적으로 이미지 -> 오픈포즈 -> smplifyx -> smplify to json 을 거치며 이 과정은, 네이버 클라우드 High CPU (코어 두개) 서버로 돌렸을 때 대략적으로 2분 30초가 걸린다.
(정말 달달달 돌아간다....돈 이슈로 싼걸 사용하고 있지만, 9월에는 제대로된 지원을 받을 것이다.)
우리 졸프는 프록시 서버로 Cloud Flare을 사용하고 있고, 이 친구는 프론트에서 보낸 요청이 수행 돼 백엔드에서 응답을 보낼 때 100초 제한이 생겨 524 에러 를 리턴한다.
100초 제한을 늘릴 수 없으며, 다른 방법을 찾아야 했다.
해결안
해결은 비동기적 처리를 한다! 였다.
먼저, 프론트에서 사진을 보내고 데이터 베이스에 저장 처리를 하는 것은 정말 빠르게 수행된다. 이때 바로 200 을 리턴해주고,
백엔드에서 파이썬 서버로 사진을 보내는 처리는 비동기적으로 수행해준다.
비동기란?
비동기는 어떠한 요청의 수행이 완료되지 않아도, 다음으로 넘어간다.
동기는 반대로 순차적으로 일어난다.
기본적으로 HTTP 프로토콜은 동기적이다. 작업이 완료될 동안 나머지 작업은 대기하는 방식이므로, 순차적이지만 여러 가지 요청을 동시에 처리할 수가 없다.
예를 들어, 우리 백엔드의 로직을 살펴보면,
1. 프론트에서 사진을 보낸 것을 데베에 저장.
2. 백엔드에서 이 사진을 파이썬 서버로 보냄.
3. 파이썬에서 처리 후 백엔드로 결과를 보내줌.
4. 백엔드가 그 결과를 처리
3번 파이썬에서 처리 후 백엔드로 결과까지 보내주어야 200 ok 가 뜬다. 원래 이것이 백엔드 로직이기 때문에 동기적으로 진행되는 모습을 볼 수 있다.
하지만 우리 졸프는 현재 상황 상 더 좋은 클라우드를 사용할 수가 없기 때문에 비동기적으로 구현을 해보아야 한다.
스프링부트에서는 @Async
어노테이션을 사용해서 간단하게 비동기 처리를 할 수 있다.
스프링부트에서 비동기 사용법
@Async
@Async
를 사용 전에는 스프링부트 어플리케이션이나 Async Config를 따로 파서 사용한다고 알려야한다.
package smu.FittingPair.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
@Configuration
@EnableAsync
public class AsyncConfig {
}
나같은 경우에는 어플리케이션에 뭘 적기 싫어서 따로 팠다.
이 후에는 비동기로 사용하고자 하는 메서드에 @Async
를 붙여주기만 하면 끝이다.
끝!!
끝내며
사실 이거 말고도 설정하는게 많았는데, 아직 자바 쓰레드에 대해서는 잘 모르겠다..ㅎㅎ
그리고 티스토리 왤케 자주 로그아웃 당하는거지 로그인 유지 시간이 몇분인거야
'SCHOOL > 캡스톤' 카테고리의 다른 글
[졸프 백엔드] CORS (0) | 2024.08.05 |
---|---|
[캡스톤 딥러닝] M2 MAC에서 SMPL-ANthropometry (4) | 2024.07.24 |
[캡스톤 딥러닝] Open pose 와 SMPLIFY-X 를 MAC M2(MAC OS) 에서 구축하는 법 (4) | 2024.07.23 |
[졸프 서버] 시작 전 서버 구상도! (0) | 2024.07.01 |
[졸프 백엔드] [버그 수집] logout 시 "detail": "method 'get' is not supported." (0) | 2024.07.01 |