오늘은 노을뷰!

오늘의 난관 (객체타입 return 하기)

팀프로젝트를 시작한지 벌써 열흘이 넘게 지났다. 그동안 한걸 생각해보면 생각보다 많은 것을 한 것 같다. 물론 반석님과 영후님의 많은 고생이 있었지만 그래도 비교적 순탄하게 흘러온 것 같다. 하지만 순탄하게 흘렀다고 해서 오류가 없었던 건 아니다. 오늘은 거의 어제부터 고민했던 문제를 해결해서 그래도 속이 후련하다. 어제부터 고민했던 문제는 object 타입을 어떻게 리턴해서 프론트로 전달하느냐였다. 내가 맡은 부분은 우선 거리를 계산하는 부분이였는데 1차적으로 내 lat, lng 값을 중심으로 반경 5km 이내에 있는 강아지들의 정보들을 가져오고 2차로 그 강아지와 나와의 거리를 계산하는 것이였다. 따라서 return 값이 2가지가 필요한데 하나의 API 에는 하나의 정보만 return 해야 하다보니 두가지 로직을 분리해서 각각 API화 했는데 그렇게 하다보면 프론트와 백엔드 각각 하나의 문제가 존재했다. 우선 백엔드에서는 DB에서 모든 나를 제외한 강아지들의 정보를 조회해서 내 위치와 비교하는 연산을 2번해야하는 비효율적인 문제가 발생했다. 즉, 하나의 API 에서 모두 불러와서 비교했으면 바로 비교결과에서 나와의 거리를 구하면 되는데 거리를 구하는 API를 나누다보니까 그곳에서도 또 상대 강아지들을 찾는 연산을 해야했다. 그리고 프론트측의 문제는 상대 강아지의 정보와 그 강아지와의 거리를 각각 배열로 담아서 주면 이를 인덱스 값으로 찾아서 매칭하기가 어렵다는 것이였다.

따라서 이를 해결해주기위해서 상대강아지의 id 와 해당 강아지와의 거리를 객체에 담아서 return 하자는 결론이 났다. 이를 적용하기 위해서 내가 해결한 방법은 일단 처음 주변 강아지를 찾고나서 찾은 강아지의 id와 해당강아지와의 거리 distance 를 redis에 key-value 값으로 넣어주었다. redis는 객체니까 그 상태로 거리를 호출하는 API 의 return 으로 주면 되겠다 생각했기 때문이다. 이렇게 하면 계산하는 로직도 한번만 도니까 로직도 훨씬 효율적이였다. 문제는 이제 이 object 타입을 어떻게 return 하느냐였는데 object 타입이 graphQL에서 바로 리턴이 안돼서 일단 entity를 만들어주긴했는데 이를 어떻게 해야하나 손을 놓을때 쯤 반석님의 한끗이 빛을 발했다.

반석님이 해결한 코드는 간단했지만 나는 처음사용해보는 방법이였다.

const tmp = new DistanceType();

위의 코드 한줄로 DistanceType 이라고 명칭한 Entity의 객체 타입을 쓸 수 있게 되었다. DB에 save하고 repository에 접근하는 방법밖에 몰랐던 나는 이 코드 한줄로 정말 2일간 묵은 답답함이 해소됐다 ㅠㅠ 심지어는 꿈에서 조차 나왔다. (Redis에 저장하는 방법도 심지어 꿈에서 생각난 방법이였음 ㅋㅋㅋㅋㅋ) 아무튼 그래도 이부분을 해결해보고자 정말 많은 Docs도 읽어보고 stackoverflow도 뒤지면서 많은 의미있는 삽질을 했기 때문에 값진 경험이였다. 자 다음 에러를 맞이하러 가보자 ~ 이제 우리 서비스의 핵심기능중 하나인 '좋아요'부분을 뿌시러 고고!

'오늘의 회고' 카테고리의 다른 글

팀 프로젝트 리팩토링 후기 [22.10.05 ~ 22.11.09]  (0) 2022.11.23
팀프로젝트 후기  (1) 2022.10.01
팀프로젝트 9일차 회고  (0) 2022.09.06
팀프로젝트 5일차 회고  (0) 2022.09.03
팀프로젝트 4일차 회고  (0) 2022.09.02
복사했습니다!