이 프로젝트를 알기 위해선 우선 ‘STRAVA’ 라는 애플리케이션을 알아야 한다.

Strava는 운동 추적 애플리케이션중 하나로 자전거를 취미로 즐기는 사람들이 전부 이용한다 싶이 하는 애플리케이션이다. 자신이 다녀온 경로, 속도, 고도, 시간, 스포츠 데이터들을 기록해주고 이를 SNS처럼 다른사람들과 공유 할 수 있도록 하는 서비스이다.

Strava는 개발자 API를 제공하여 여러가지 애플리케이션을 개발 할 수있도록 돕고있다. 이 API를 통해서 사용자의 Strava 데이터를 가져올 수 있다.

그런 데이터들 중 사용자가 다녀온 경로는 PloyLine이라는 객체로 지도상에 표시가 된다. 이 Polyline은 위도와 경도 정보로 지도에 표시되는데 이 Polyline을 가지고서 자신이 다녀온 지역을 일종의 도전과제 처럼 분석해주는 웹 사이트가 외국에 존재한다.

하지만 역시 외국 사이트인 만큼 한국의 지역은 서비스하지 않는다. 그럼 내가 만들어 보는거다.

일단 내가 서비스 하고자 하는 서비스의 포인트는 다음과 같다.

  1. 사용자의 다녀온 경로 정보를 토대로 지금까지 거쳐온 시,군 정보를 제공
  2. 사용자의 스포츠 데이터를 취합하여 일종의 도전과제 서비스 제공
  3. 경로 Polyline을 지도에 전부 표시하는 시각화 서비스

이외에도 게시판등의 기능들이 있지만 일단 제쳐두고 이거부터 다시 구현해보자.


일단 서비스 로직은 꽤 복잡하지만 다음과 같이 구현되어있다.

  1. 우선 사용자가 웹사이트에 접속하게 되면 Strava의 로그인 페이지로 리다이렉트 된다. 여기서 로그인하고 정보 공유 승인을 하게되면 해당 유저의 Strava 데이터에 접근할 수 있는 token이 발급되고 이 Token을 다시 서버로 전달한다.

  2. Token을 전달받은 서버는 token의 Key를 이용해 Strava의 API에 접근할 수 있다. API를 통해서 사용자의 정보를 가져오게 되는데 사용자의 정보는 크게 두가지로 나뉜다

    2-1) 사용자 프로필 정보: 사용자 이름, 지역, 생성일자, 업데이트 일자, 친구수 등 2-2) 사용자 라이드 정보: 사용자가 Strava에 업로드한 운동 데이터는 ‘라이드’ 단위로 저장된다. 한 라이드는 경로 정보를 담는 Polyline, 이동거리, 이동시간, 속도, 획득고도 등등의 데이터를 가지게 되고 이러한 라이드는 유저당 여러개를 가질 수 있다.

  3. 사용자 라이드 데이터는 한번 API호출에 100개씩 밖에 가져올 수 없다. 꽤 많은 데이터를 가진 유저의 요청에 대해서 약 20초가량이 소요된다. 가져오는 동안 유저는 로딩 대기해야 한다.

  4. 모든 데이터를 전부 가져오고 나면 이를 데이터베이스에 저장하고 그제서야 클라이언트에게 데이터가 리턴된다. 리턴된 데이터를 프론트엔드 단에서 랜더링 하여 사용자에게 보여준다.

  5. 사용자의 경로 데이터를 토대로 지나온 시,군 정보를 얻기 위해 KAKAO MAP API를 사용한다. Polyline은 위도 경도 데이터로 이루어져 있기 때문에 이 Polyline 데이터를 decoding하여 좌표를 얻고 Kakao API에 전달하여 해당 좌표 지점에 대한 주소 정보를 얻는다.

    이때 Kako API의 호출은 하루 10만회로 제한하고 있어 수없이 많은 위도,경도 좌표로 이루어진 Polyline 좌표를 전부다 조회할 수 없어 일정 수의 좌표를 평균치를 계산하여 조회한다.

    이 작업은 Decoding, api request등의 작업이 수반되기 때문에 시간이 오래걸리는 작업이다. 하지만 당장 유저에게 처리한 데이터를 보여줘야 할 필요는 없기 때문에 우선 사용자에게 ‘4번’ 에서의 데이터를 리턴해주고 이 작업은 별도의 쓰레드를 생성하여 수행한다.