나의 개발일지(김지헌)
항해 99 80일차 12/07일 본문
오늘은 리프레쉬 업데이트에서 저장 오류가 발생해서 코드를 수정했다.
다른 라우터를 건들다가 파라미터가 조금 변경된게 문제였다.
내 위치를 기준으로 가까운 캠핑장을 조회해서 2개의 매장만 가져오는 api를 구현했다.
프론트에서 보내는 값에 현재 나의 위치 위도 경도 값이 들어오고 받아온 값을 가지고 30키로내 가장 가까운 2개의 매장 정보를 가져오는게 목표였다.
//controller
nearCamp: async(req:Request,res:Response,next:NextFunction)=>{
try{
const { campX , campY }:coordinate = req.query
console.log(campX,campY)
if(!campX || !campY) throw new InvalidParamsError("좌표가 없습니다.")
const nearCamp = await userServ.nearCamp({campX,campY});
res.status(200).json({nearCamp})
}catch(err){
next(err)
}
},
//sev
nearCamp: async ({campX,campY}:coordinate) => {
return await userRepo.nearCamp({campX,campY});
},
//Repo
nearCamp: async ({campX,campY}:coordinate) => {
const query = `SELECT camp.*,
( 6371 * acos( cos( radians( 나의위도 ) ) * cos( radians( 목표위도 ) ) * cos( radians( 목표경도 )
- radians(나의경도) ) + sin( radians( 나의위도 ) ) * sin( radians( 목표위도 ) ) ) )as distance
FROM camp HAVING distance < 30 ORDER BY distance LIMIT 0,2`
return await sequelize.query(query, {type: QueryTypes.SELECT})
},
처음에는 캠프 정보를 다 찾아와서 map돌려서 할려고 했는데 생각보다 너무 어렵고 성능도 나쁠꺼 같아서 시퀄라이즈로 찾아보다가 mysql 쿼리문으로 사용하는 방법을 보고 적용해보았다.
HAVING distance < 30 ORDER BY distance LIMIT 0,2 지우고 요청하면 캠핑장 거리가 km단위로 찍힌다.
6371은 지구의 지름이고 하버사인 공식을 사용해서 두 지점간 최단거리를 구하는 공식이다.
as distance FROM camp : distance
HAVING distance < 30 : HAVING 을 사용해서 반경을 제한 할 수도 있다.
ORDER BY distance LIMIT 0,2 : 가까운 거리를 기준으로 오름차순해서 2개의 매장만 가지고 오곘다,
처음에는 SELECT뒤에 바로 (6371...) 이렇게 진행 헀었는데 요청을 보내보니 가까운 거리만 게속 나오는거 였다.
코드를 잘 못 쓴거 같아서 계속 찾아봤는데 이상한 것은 없었고 원하는 값은 나오지 않았다. 그래서 팀원에게 도움을 받아서 코드를 완성 했다.
이유는 SELECT 뒤에 camp.* 즉 캠프의 모든 정보를 찾겠다 라는게 빠져있었고 mysql의 쿼리문에 익숙하지 않아서 못 찾았던거 같다.