호딩클라우드

[Spring boot] 비동기 이벤트로 로직을 분리하여 실행시간 55% 개선 본문

문제해결

[Spring boot] 비동기 이벤트로 로직을 분리하여 실행시간 55% 개선

hoding-cloud 2024. 7. 29. 17:28

[배경]

 

 

회원가입시 프로필 사진을 등록하면 외부 배경제거 api를 통해 배경을 제거한 후 S3에 업로드를 하게 됩니다.

이때 배경제거 후 S3업로드 까지 동기식으로 진행되다 보니 프로필  사진 업로드에 많은 시간이 소요되는 문제를 식별했습니다.

 

아래는 이미지 크기별 소요시간입니다.

 

이미지 크기 (KB) Total Elapsed (ms) Remove Background Elapsed (ms) S3 Elasped (ms)
50kb 4470 2343 1449
100kb 3350 1660 1606
155kb 5230 3865 2962
330kb 7100 4933 2092
800kb 7940 3993 3860
1200kb 10150 5685 4379
1900kb 14610 7037 7344
2300kb 19000 7146 11738
2900kb 19920 7636 11872

 

 

이미지 크기별로  3번의 요청의 실행시간 평균을 담아낸 데이터입니다.

이미지 크기에 따라 4초에서 19초까지 소요되는 것을 확인했습니다.

 

 

[해결방안]

실행시간을 개선하기 위해 배경제거 API 완료 이후 바로 클라어인트에게 이미지를 반환하고  S3업로드는 트랜잭션 커밋이후 비동기로 처리하기로 결정했습니다.

 

 

이때 배경제거 API에서는 이미지에 접근할 수 있는 URL을 통해 이미지를 반환해주는데, 해당 URL은 24시간뒤 만료되는 URL이기 때문에 DB에는 반드시 S3의 업로드된 URL을 저장해야 했습니다.

 

때문에 S3 이미지 URL을 메모리에 HashMap으로 저장해두고 회원가입 POST 요청이 올때 만료되는 URL을 S3에 업로드된 이미지 URL로 변경해서 저장하기로 결정했습니다.

 

 

[개선적용 결과]

이미지 크기 (KB) Total Elapsed (ms) Remove Background Elapsed (ms) S3 Elasped (ms)
50kb 1973 1754 1211
100kb 1733 1654 1347
155kb 1666 1653 1125
330kb 3610 3520 2440
800kb 5050 4958 3301
1200kb 6096 6000 6121
1900kb 6930 6805 4345
2300kb 8116 7637 9663
2900kb 8370 8225 12239

 

 

전체 소요시간과 api 소요시간이 동일해진 것으로 보아 예상했던 만큼 응답속도가 향상 됐음을 확인할 수 있습니다.