프리온보딩 과제 6

Tasic·2021년 11월 22일
0

과제 정보 요약
구현 기간 : 21.11.18(18시) ~ 21.11.21 (22시)
자세한 내용은 Github 참고

들어가며

  • 이번 과제에는 기본 구현사항과 추가구현 사항이 있었습니다.
  • 추가 사항은 위치 정보들을 활용해야되는 요구사항도 있었습니다.
  • 아쉽게도 추가 사항은 구현하지 못하였지만, 구현을 하기위해 정리한 내용과 이전 프로젝트에서부터 고질적인 문제였던 url 표시 부분 해결도 공유드리겠습니다.

의도치 않은 url로 표시되는 현상 해결

  1. Pagination
    이전에는 Pagination의 next, previous url에 다음과 같이 도커 컨테이너 명이 들어가 있었습니다.
 "next": "http://Django-도커컨테이너명/researches?cursor=bz0xMDA%3D",
  "previous": null,
  "results": [
    {

    },
  1. 이전 프로젝트 후기에서 request URL이 Doker 컨데이너 이름으로 표시되는 현상도 있었습니다.

서버구성은 사용자 <-> nginx <-> Django 이렇게 구성되어 있는데, 먼가 nginx의 설정을 빼먹은 느낌이였으나, 찾지를 못하였습니다.

(기존 nginx 설정)

upstream Django-도커컨테이너명 {
    ip_hash;
    server Django-도커컨테이너명:8000; # 서버의 컨테이너 명
}

server {
    location / {
        proxy_set_header Host $http_host;
        proxy_pass http://Django-도커컨테이너명/;
    }

    location /static {
        alias /static;
    }
    listen 8051;
    server_name localhost;
}

이 현상을 proxy_set_header Host $http_host를 추가해서 정상적인 url이 출력되도록 하였다.

server {
    location / {
        proxy_set_header Host $http_host;
    }

}

간략하게 설명하면 nginx에서 Django쪽으로 요청을 전달할때, nginx에서 받은 HOST명으로 세팅을 하는 것이라고 생각하면 될 것 같습니다.
기존에는 nginx에서 Django쪽으로 요청을 전달할때, Django-도커컨테이너명 주소로 전달하기 때문에 발생한 현상이였던 것 같습니다.

구현 못한것들 (정리)

  1. 현재 위치(위도 경도)에 속한 지역
    ex) 현재 위치가 지역에서 벗어났는지
    True면 현재 지역, False 벗어남
  current_pos = Point(126.9990125, 37.4803512703)
  Area.objects.filter(id=id,area_boundary__contains=current_pos).exist()
  1. 현재위치가 파킹존 인가??
  • 파킹존들과 현재위치의 거리를 계산해서 그 거리가 파킹존마다 설정된 반지름(radius) 보다 작거나 같은 파킹존이 있는지 필터링 합니다.
  • gte를 쓴 이유는 radius 입장에서는 측정 거리보다 커야됩니다.
  • 거리 측정은 링크 의 내용를 참고하여 ORM으로 구현하였습니다.
  from django.db.models.functions import ACos, Cos, Radians, Sin
  from decimal import Decimal
    
  lat = Decimal( 37.50666558612068)
  lng = Decimal(126.72242597890687)

  Parkingzone.objects.filter(radius__gte=6371*ACos(Cos(Radians(lat))*Cos(Radians('center_lat'))*Cos(Radians('center_lng')-Radians(lng))+Sin(Radians(lat))*Sin(Radians('center_lat')))*1000).exsist()
  1. 현재 위치가 금지존 인가 -> True면 현재 금지 지역
  • 현재 위치가 금지존에 속하는 위치가 있는지 검색합니다.
  current_pos = Point(126.9990125, 37.4803512703)
  ForbiddenArea.objects.filter(forbidden_area_boundary__contains=current_pos).exist()
  1. 현재 지역에서 얼마나 떨어졌는지 계산
  • 2차원 자표계인 UTM-K(5179)로 변환 후, 제공하는 distance 함수를 이용해서 거리를 계산합니다.
    # 퀵보드를 빌린 지역
    area = Area.objects.get(id=id)
    
    # 반납위치
    lat = Decimal( 37.50666558612068)
    lng = Decimal(126.72242597890687)
    
    # 위경도 좌표계에서 utmk 좌표계로 변환 (2차원 좌표계라고 생각하면 편함)
    # 이유는 distance가 linear 하게 계산되기 때문 (구형 계산 안함)
    point = Point(lng, lat, srid=4326).transform(5179, True)
    polygon = area.area_boundary.transform(5179, True)
    
    distance_m = polygon.distance(point) # 직선거리 미터    

마치며

  • 이번프로젝트는 아쉬움이 많이 남는 프로젝트입니다. 추가 구현까지 완료하고 싶었으나 여러가지 예기치 못한 일이 생겨서 기본기능까지 밖에 구현하지 못하였습니다.
profile
블로그 옮겼습니다 (https://jotasic.github.io)

0개의 댓글