기본 지식이 없어 생긴 에러 회고

김지인·2023년 2월 28일
0

들어가기 앞서서..

우리 프로젝트는 모듈 형식으로 구성되어 있어 첨부파일 요청을 보내면 해당 요청을 처리하는 리소스 서버가 존재했다.

이번 상황에서는 클라이언트에서 사진 업로드 요청을 보내면, 서비스 모듈에서는 해당 사진의 정보를 가져와야 하는 로직을 구성해야 했다.

하지만 이 로직을 처리하기 위해서는 리소스서버에서 데이터를 가져와야 했기 때문에, 클라이언트에서 요청을 보낸 후에 서비스 모듈에서는 리소스서버로 포스트 요청을 보내 데이터를 업로드하고, 이후 리스트 겟 요청을 보내 해당 데이터를 가져와야 했다. 마지막으로 서비스 모듈에서는 가져온 데이터를 클라이언트로 전달해야 했다.


내가 생각했던 플로우다.

fetch() ~~~
  
fetch() ~~~
  
location.href(~~)

이런식으로 진행하면 저 플로우를 타지 않을까? 라고 생각했으나, 제대로 결과를 반환해주는 경우가 반밖에 되지 않았다. 그 원인은 Resource Server 의 DB 인덱스가 맞지 않아서 생기는 오류이었다. 그때 당시에 '나는 왜 순서가 보장되지 않을까?' 하고 이해가 안갔었다.

정말 부끄럽지만 기초 지식이 부족했던 나는 일차원적으로 뒤에 겟요청이 너무 빨라서 뒤에오는 포스트 요청이 못따라오는 것인가 라고 생각했었다.
그래서 강제로 겟 요청이 오래 걸리도록 강제로 지연시간을 늘린다거나, 처리를 많이 하도록 한다거나 그런식으로 해결했었다. 근데 아무리 생각해도 옳은 방법이 아닌거같고, 지연시간을 늦춘다는 것은 말 그대로 운에 맡기겠다는 소리이었다.

앞에 작성했던 시퀀스그램을 다시 보자.
저 시퀀스그램은 잘못된것이었다. 왜냐하면 클라이언트에서 요청을 2번 보내는데 해당 요청은 순서를 보장하지 않는다. 그렇다면 어디서 순서가 보장되지 않는 것일까?

왼쪽의 파란색 부분은 순서를 보장한다. 하지만 그렇다고 오른쪽도 똑같이 순서가 보장될까 ?

첫번째와 두번째 요청시에 서비스 모듈에 쓰레드가 두개 씩 배정되어 해당 처리를 해줄 것이다. 하지만 그 쓰레드가 서비스모듈과 리소스 서버까지 공유가 되는것인가? 아니다. 그렇기 때문에 해당 로직이 순서를 보장받지 못하고 계속해서 인덱스 에러가 낫던것이었다.

말 그대로 포스트 요청을 보내고 ㅡ> 그다음 리스트를 가져오는 하나의 플로우가 되어야 하는데, 포스트 요청과 리스트를 가져오는 요청이 각각의 플로우를 가지고 로직이 수행되었던 것이었다.

그래서 나는 첫번째 요청인 포스트 요청이 다 끝난 후 그 다음 요청이 실행될 수 있도록 프론트 단의 로직을 수정함으로써 에러를 해결할 수 있었다.

fetch() ~~~
  .then(fetch() ~~~
       .then(location.href(~~~)))

첫번째 요청이 끝난 후 그다음 요청을 실행하고 해당 요청이 끝난 후 리다이렉트를 해줌으로써 인덱스 에러로부터 벗어날 수 있었다.

profile
에러가 세상에서 제일 좋아

0개의 댓글