우리 팀은 지역별 일몰일출시간 정보를 얻어오기 위해 공공데이터 오픈 API를 사용하였다. 이것을 받아오고 출력하는 과정 전부 내가 담당하였는데 1차 release 때까지 내가 서버를 실행하면 일몰일출api가 실행되지만 우리 팀의 다른팀원들에게는 이 api가 작동을 못하였다. 이것의 문제점이 무엇인가 ... cors 부터 팀원들이 다해보셨다고 했지만 작동을 안하였다 .
오늘 튜터님께 도움을 요청했고 그것은 바로 자바스크립트의 크로스도메인 문제라고 하셨다
크로스도메인은 서로 다른 도메인간의 호출을 뜻하는데 ,
자바스크립트는 동일한 도메인 내에서만 서버요청을 허용한다는 크로스도메인이라는 원칙이 있다. 내가 개발한 웹사이트에서만 사용하기위해 api를 구축하였는데 다른 도메인에서 이 api를 호출하여 사용하면 문제가 되기 때문이다.
따라서 자바스크립트는 Same Origin Policy(동일 출처 정책)을 두어 크로스도메인을 차단한다.
이 개념을 몰랐던 나는 자바스크립트에서 ajax 요청을 통해 공공데이터 api를 가져와서 썼기 때문에 다른 팀원들에게는 실행이 안되어 보여지지 않았던 것이다.
튜터님은 서버에서 이 공공데이터 API를 받아오라는 해결책을 주셨고 나는 서버로 get요청을 보내고 서버에서 다시 공공데이터url로 get요청을 하는 방식으로 코드를 짰다.
#공공데이터 api query url 만드는함수
def get_request_query(url, operation, params, serviceKey):
import urllib.parse as urlparse
params = urlparse.urlencode(params)
request_query = url + '/' + operation + '?' + params + '&' + 'serviceKey' + '=' + serviceKey
return request_query
@app.route('/time',methods=['GET'])
def show_time():
URL="http://apis.data.go.kr/B090041/openapi/service/RiseSetInfoService"
OPERATION = 'getLCRiseSetInfo'
SERVICEKEY="/oZ4AFQEH6WdKfRkiTxU9cNH8VHjxNsZO3PeRFfdDwIQLI3TfmMbjfQvhRSJyrACs3w1ARppFgEkiz5ebTfibg=="
longitude = request.args.get('long',int)
latitude = request.args.get('lati',int)
date = request.args.get('date',int)
PARAMS={
'locdate':date,
'longitude':longitude,
'latitude':latitude,
'dnYn':'y'
}
#response=requests.get("http://apis.data.go.kr/B090041/openapi/service/RiseSetInfoService/getLCRiseSetInfo?&longitude=" + longitude + "&latitude=" + latitude + "&locdate=" + date + "&dnYn=y&ServiceKey=/oZ4AFQEH6WdKfRkiTxU9cNH8VHjxNsZO3PeRFfdDwIQLI3TfmMbjfQvhRSJyrACs3w1ARppFgEkiz5ebTfibg==")
request_query = get_request_query(URL, OPERATION, PARAMS, SERVICEKEY)
print('request_query:', request_query)
response = requests.get(url=request_query)
return response.text
이렇게 내가 직접 서버에서 구현을 해보니 자신감도 생긴 것 같다 ㅎㅎ .
오늘은 할일을 다 끝냈고 2차 백신까지 맞았기 때문에 이제 쉴꺼다 ㅎㅅㅎ