레시피 업로드 구조 변경 및 속도 개선

김예지·2024년 2월 20일
0

집다방

목록 보기
4/5

개요

업로드 속도 개선

이전 게시글에서 레시피 업로드 속도 향상을 위해 멀티스레드를 적용했지만 크게 지연시간이 개선되지 않은 것을 확인했다.
따라서 이전 프로젝트(집다방1)의 로직을 그대로 적용하여, 이미지가 들어올 때 마다 S3에 그때 그때 저장하는 구조로 변경하였다.

다만 집다방1에서는 무조건 서버를 거쳐 S3에 저장하도록 했는데, 이번에는 Presigned url S3를 사용하도록 하였다.

복잡한 로직 개선

FE에서 S3 바로 사진을 저장하도록 하는 또다른 이유는 로직의 복잡도를 낮추기 위해서이다.

집다방에는 임시저장 기능이 있으며, 임시저장은 여러개가 가능하다.
기존처럼 이미지를 서버에서 한번에 S3에 저장하면, 임시저장 했던 레시피를 수정 후 다시 임시저장 할 때 복잡도가 크게 발생한다.

썸네일 관련 로직도 비슷하나, 특히 스텝 이미지 저장에서 고려할 부분이 많다.

  • FE로부터 이미지 URL이 들어왔는지
  • Multipart 파일이 들어왔는지
  • 아무것도(파일 관련) 들어오지 않았는지

각 상황에 따라 각각 처리해야 할 분기가 생긴다.
이러한 복잡한 로직은 FE에서 먼저 이미지를 저장하고 BE에 이미지 URL만 넘겨준다면 간소화 될 수 있다.

  • Request Body에 이미지 URL이 담겨 오면 DB에 URL 저장
  • 아무 것도 담겨오지 않으면 Null로 저장

아키텍쳐

기존의 구조는 레시피 등록 시 이미지 파일들과 Json을 한번에 업로드 한다.

레시피 업로드 구조 변경 후,

  1. 이미지가 하나씩 등록될 때 마다 FE에서 Presigned url S3로 이미지를 바로 저장하고
  2. S3에 저장된 이미지 url을 Body에 같이 담아 BE로 전달하도록 하였다.

presigned url s3를 사용하면 이미 권한이 검증되었기 때문에, 누구나 해당 URL을 통해 S3에 접근할 수 있다는 보안상 취약점이 있다.

이를 해결하기 위해, presigned url의 생성과 검증을 Lambda@Edge를 통하도록 할 수 있다. 해당 방법에 대해서는 추후에 다루어 보겠다.

결과

멀티스레드 DeadLock 문제

부하테스트를 진행하는 도중, Hikari Pool에서 DeadLock이 발생하였다.
DB에 접근하는 곳에 CompletableFuture을 사용해 발생한 문제로, 해당 코드를 제거하고 테스트를 진행하였다.
(트러블슈팅: https://velog.io/@nwactris/Hikari-Pool-Error)

지연 시간 비교

당연히 이미지를 먼저 저장하는 것이 훨씬 빠를 것이라고는 예상했지만, 실제로 비교하니 상당히 차이가 컸다.

  • 1명 요청 시 평균적으로 약 8.36배 빠르게 동작하며, P99도 1,243ms내에 완료된다.
  • 50명 동시 요청 시 평균적으로 약 134.29배 속도가 증가했다.
    애초에, 이전에 동작하던 방식이 전혀 잘못된 접근이었다는 것을 알 수 있다.
    P99도 2,024ms내에 완료되어 서비스 가능한 속도라고 판단된다.

느낀 점

집다방1(Node.js)을 Spring으로 변경하는 집다방2를 기획하면서, PM이 [레시피 업로드]를 이미지들을 한번에 전송하는 구조로 변경하자는 의견을 제시하였다. 물론, 지연시간이 길어질 것이 예상되어 기존 방식을 유지하도록 제안하였으나 회의 후 일단 PM의 의견을 수용하여 구현해 보기로 하였다.

로직이 완성되고 레시피 1건 테스트에 약 6-7초의 시간이 소요되니, 인스타그램 등에서 사진을 업로드 하는 시간을 고려하면 이 정도의 지연은 괜찮을 수도 있겠다 생각하였다.

하지만 실제 상황을 고려해 10명, 50명의 부하테스트를 진행하자 각 30초, 3분 이상의 대기 시간이 발생하여 로직을 변경할 수 밖에 없었다.

이번 경험을 통해 느낀 것은 아키텍쳐를 정할 때, 머릿속으로만 판단하는 것이 아니라 실제로 테스트를 해보는 것이 얼마나 중요한지 깨달았다.

또한 PM이 제시하는 방향을 믿고 따르는 것이 가장 중요하지만, 더 나은 해결책이 있을 때 솔루션을 제안하고 설득할 수 있는 수치상의 결과를 만들어내는 것도 BE 개발자의 능력이라는 생각이 들었다.

Icon 출처
Android Phone icon by Icons8, Image File icon by Icons8,
Database icon by Icons8, JSON icon by Icons8, Url icon by Icons8

0개의 댓글

관련 채용 정보