금번 멘토링 목표

마지막으로 프로젝트를 점검하며 멘토님께 부족한 부분이나 개선할 점을 확인 받는다.

프로젝트 진행 상황

질문 사항

Q. 지난 멘토링 때 '설계 발표 시, ERD와 아키텍처를 중점적으로 발표하면 좋겠다'라고 해주셨던 말씀이 많은 도움이 되었습니다. 이번 최종 프로젝트 발표에서도 놓치지 말아야 할 키워드가 있을까요?

Q. 기존에는 RestTemplate로 flask 서버와 요청/응답을 주고 받다가, 비동기를 구현하기 위해 @Async를 녹이려 했더니 AsyncRestTemplate이 Deprecated되고, 스프링 공식 문서에서 권장하는 WebClient로 구현해봤습니다.

하지만 비동기로 어떻게 구현해야 하는지 감이 안잡히는게, flask 서버에 보내는 Request를 비동기로 처리하더라도 결국은 Response로 Success 또는 Failed를 받아야 클라이언트에게 응답을 보내줘야 하는 것이라면 결국 동기로 처리할 수 밖에 없지 않을까요? 오히려 영상을 처리하는 flask 서버에서 비동기로 처리해줘야 맞는 게 아닌가라는 생각이 들었습니다.

flask 서버와 통신하는 코드

@Service
@RequiredArgsConstructor
@Slf4j
public class FlaskCommunicationService {

    private final YmlFlaskConfig flaskConfig;
    private final WebClientConfig webClientConfig;

    public AudioResponse getAudioResult(AudioRequest request) {
        return webClientConfig.webClient()
                .post()
                .uri(flaskConfig.getRequestAudioApi())
                .bodyValue(request)
                .accept(MediaType.APPLICATION_JSON)
                .retrieve()
                .bodyToMono(AudioResponse.class)
                .block();
    }

    public VideoResponse getVideoResult(VideoRequest request) {
        return webClientConfig.webClient()
                .post()
                .uri(flaskConfig.getRequestVideoApi())
                .bodyValue(request)
                .accept(MediaType.APPLICATION_JSON)
                .retrieve()
                .bodyToMono(VideoResponse.class)
                .block();
    }
}

flask 서버의 응답의 결과로 클라이언트에게 응답을 보내는 코드

   /**
     * 텍스트 페이지에서 Audio 정보 추가 및 음성 생성
     */
    @Transactional
    public TotalAudioSyntheticResponse addAudioInfo(Long projectId, TotalAudioSyntheticRequest request) {
        Project findProject = projectRepository.findWithUserById(projectId).orElseThrow(NoSuchElementException::new);
        validateAccessOnCurrentUser(findProject.getUser());
        validateSameTextsAndSplitTextList(request);

        request.changeAudioInfo(findProject.getAudio());

				//////////////////////////////////////////////////
        AudioResponse audioResponse = flaskCommunicationService.getAudioResult(
                new AudioRequest(findProject.getAudio().getTexts(), "none", "result")
        );

        if (audioResponse.getStatus().equals("Success")) {
            String savedFileBucketUrl = saveAudioFileToS3(findProject, audioResponse.getId());
            return new TotalAudioSyntheticResponse("Success", savedFileBucketUrl);
        } else {
            return new TotalAudioSyntheticResponse("Failed", null);
        }
				//////////////////////////////////////////////////
    }