[HARMAN] 세미콘 아카데미/공부내용

[Harman 세미콘 아카데미] Day_11(Python)

uiop1716 2025. 2. 18. 20:57

오늘은 API 부터 리뷰하겠다.

 

API 란? 어플리케이션 간 데이터를 주고 받을 수 있도록 하는 인터페이스(약속)

이에 대해 실습하기 위해 OpenWeather API를 활용하겠다.

실시간으로 변화하는 날씨 정보를 활용하기 위함이다.

https://openweathermap.org/

 

Current weather and forecast - OpenWeatherMap

OpenWeather Weather forecasts, nowcasts and history in a fast and elegant way

openweathermap.org

 

OpenWeather에서 제공하는 API키를 활용하여 url에 접속하고, json 형태로 데이터를 받아온다.

도시명을 직접 입력하여 날씨에 대한 컬럼과 데이터들을 받아올 수 있다.

 

아래의 예제는, 기존 화씨온도를 제공하는 데이터를 섭씨 온도로 변환한 것이다.

url = f"https://api.openweathermap.org/data/2.5/weather?q={city_name}&appid={MY_API_KEY}&units=metric"

기존 url에 &units=metric 를 추가하였다.

 

 

위의 정보를 활용하여 얻고자하는 도시의 기온을 알아보자!

 

인천의 현재 날씨를 알고싶다. json 형태의 데이터의 "main" 내부에 있는 "temp"를 통해 기온을 알 수 있다.

 

 

이를 확장하여 다양한 정보들을 얻을 수도 있다.

gisang이란 변수명은 날씨에 대한 정보를 담고 있는데, 자세히 보면 "weather"라는 리스트의 첫번째 인자의 "main"에 있으므로,    gisang = data["weather"][0]["main"]으로 저장하였다.

데이터의 형태를 두 눈 크게 뜨고 봐야한다!!

 

 

 

추후에 사용하기 쉽게(?) 함수로도 만들어 보았다 

 

우리는 이제 API를 통해 정보를 불러오는 기능을 배웠으므로,

실시간으로 변화하는 정보들을 자동으로 가져와서 그 변화를 실시간으로 보고 분석하고싶다.

이때 등장하는 개념이 스케줄링이다.

 

스케줄링 이란?  

: 특정 프로그램을 자동으로 일정 시간마다 동작시키는 기능, 반복적인 작업을 자동화할 때 사용

 

형태는 아래와 같다.

 

함수를 정의하고, schedule.every("수").seconds/days.do("함수명")으로 시간 간격으로 함수를 실행한다.

이때 While True문을 사용하여 등록한 스케줄들을 실행시킨다.

 

 

이에 대해, 예외 처리문 schedule.cancel_job()을 추가하여 안전하게 스케줄을 종료/ 관리한다.

(다 지우고 싶으면 schedule.clear_job()을 사용하면 된다...)

 

간단한 한 줄 표현인 lambda expression도 활용할 수 있다

 

 

스케줄링에 대해서도 알아보면서 무한히 도는 while문으로 실습을 했는데, 30초만 동작하는건 없을까 ?

그래서 time에 대한 라이브러리를 import해서 사용한다.

time.time() 시간을 나타나는 함수로, start_time에 시작 시간을 두고 30초만 동작시킨다. 

 

결과: 30초 후, 프로그램 종료문이 나오고 종료된다.

time 함수 활용 결과

 

 

 

아래와 같은 예제를 통해 매일 아침 8시마다 날씨 데이터를 요청하여 csv로 저장할 수 있다.

날씨 데이터를 csv로 저장하는 함수를, 스케줄링을 통해 매일 8시에 실행하도록 한다.

그러면 자동으로 날씨 데이터가 쌓이게 되고, 우리는 편하게 사용하면 된다!

 

 

그리고, 시간을 정확하게 하기 위해 python time zone과 datetime에 대한 함수를 활용하여 현재 시간에 대한 정보를 가져온다. 실시간 데이터를 확인할 것이기 때문에 정확한 시간이 필요하다.

실시간으로 날짜와 시간을 가져오는 방법

 

 

실시간 시간 정보를 매우 유용하게 사용할 것이다. 어떻게? 어제 신명나게 배운 데이터베이스를 활용하여!

API를 통해 가져온 데이터들을 나의 데이터베이스에 넣어 활용할 것이다.

어제 배운 데이터베이스 만들기 4단계를 이용하여 id, 기온, 시간을 아래와 같이 실행하여 저장한다.

 

우리는 데이터베이스에 다양한 도시들의 데이터 베이스와 서울에 대한 데이터베이스를 따로 하기 위해

두개의 데이터베이스, 두개의 sql문을 작성하였다. 단, 스케줄링은 30초마다 하는걸로...

(어제 배워뒀던 데이터베이스 다루는 법을 굉장히 많이 사용했다.) 

 

 

결과: 실시간 날씨 정보를 담는 데이터베이스 생성 완료

 

 

이를 호출하면, 정보가 30초마다 잘 들어감을 확인할 수 있었다.

 

 

우리가 이렇게 만든 데이터베이스를 남들에게도 공유해야 의미가 있을 것이다.

이를 우리는 배포라고 한다. 우리가 배포하면 다른 사람들이 활용할 수 있다.

그리하여, 터미널에서 사용하는 pyinstaller를 사용한다.
설치 : !pip3 install pyinstaller

 

터미널 창에서   !pyinstaller --onefile "파일명".py 

           ---> dist 폴더, build 폴더, 폴더명.spec 파일이 생성됨
           ---> dist 폴더에 exe 파일이 생성됨

이렇게 생성된 exe파일은 배포된 파일이며, 실행하면 우리가 심은 동작을 수행한다.

 

 

 

우리가 두번째로 작성한 Seoul에 대한 정보도 배포를 하였다.

이미지가 귀엽다...

 

배포에는 3가지 방법이 있다.

방금 우리가 진행한  1) pyinstaller를 사용해 exe를 배포

                                 2) github action을 통한 배포

                                 3) flask server를 활용한 배포  a) 포트포워딩

                                                                                  b) 외부프로그램( x. ngrok)

                                                                                  c) AWS EC2

 

그 중, flask server를 활용하며 공부해보자

보통 접속을 하기 위해 요청을 보내는 객체를 Client, 이러한 요청에 응답을 보내는 객체를 Server 라고 한다.

얘네들을 연결하기 위해 flask를 활용하는 것이다. 그 중, Flask 클래스를 이용해 웹 페이지를 만든다.

이때, if문을 사용하는 이유는 __문은 클래스의 내장 함수이다. 실행을 하게 되면서 모듈화가 편한 Python의 특성상, 외부에서 만든 py를 import하여 사용할 수 도 있기 때문에, import 시 메모리에 올리게 된다.

하지만, 의도와 달리 실행하면 임포팅된 상태에 있기 때문에 불필요한 코드가 실행 될 수도 있다.

그래서, if __name__ == "__main__" 를 통해 직접 실행된 경우에만 코드를 실행하도록 한다.

 

웹 페이지 생성 결과

 

이때 IPv4 주소에 대한 개념도 공부하였다. 0~255까지의 숫자가 4개로 이뤄져 (8bit x 4 = 32bit)의 주소이다.

형태: (0~255). (0~255). (0~255). (0~255)

위의 그림에서 사용된 127.0.0.1은 localhost로 자신의 서버를 나타낸다.

 

 

 

생성한 웹 페이지에 곁다리 같은 느낌으로 다른 경로도 추가할 수 있다.

형태 : @app.route("/seoul")
           def print_seoul():
                 return "Seoul Weather"

이렇게 되면, localhost /seoul을 하면 "Seoul Weather"를 나타내는 페이지가 나온다.

URL 형태: 127.0.0.1 /seoul

실행 결과

 

 

Public에 대해서도 배웠는데, IP주소를 0.0.0.0으로 설정하게 되면 나의 ip주소를 공개하게 되고, 누구나 나의 ip에 접속하여 정보를 열람할 수 있게 하였다.

 

 

이렇게 웹 페이지에 대해 설정을 하고, 웹 페이지를 예쁘게 꾸며보았다.

이때, 사용한 것이 flask의 render_template 클래스를 활용한다. html 문서를 불러오는 함수로 디자인을 가져온다.

html 문서에서

"안경하세요"를 핑크색으로 보이게 하고,

python 파일에서 lunch에 대한 값을 넣어 웹 페이지에  "내일의 점심은 :  lunch(입력값)"을 보이게 하였다.

 

 

결과 :

 

또한, 이를 활용하여 우리가 만들고 관리한 데이터베이스를 지정하고 html 파일에 dataframe을 넣어 표현하기도 한다.  

* Safe 필터를 사용하여 데이터프레임을 그대로 랜더링 한다 *

html 파일, 데이터프래임을 랜더링한다.
python파일

 

 

결과 : 30초마다 정보를 수집하던 데이터베이스의 데이터프레임 표현을 웹페이지에 출력한다.

 

 

 

또한, html 파일을 수정하여 클릭하는 버튼을 생성하고, href ="주소"  버튼 누르면 주소로 이동하도록 한다.

 

 

결과 : 

 

Matplotlib를 사용하여 그래프를 그리고 이미지로 저장한 뒤 출력도 가능하다.

matplotlob 사용 코드
시간에 따른 온도를 그래프로 나타낼 수 있다

 

 

flask에 대해 배우고, 외부 프로그램인 ngrok에 대해서도 조금 맛보았다.

왜 지역이 Japan으로 나오지...(당황)

 

ngrok 프로그램의 경우 나의 포트를 포트포워딩하여 주어진 주소를 외부에서도 접근 가능하도록 한다. 내가 만약 센터에서 작업하던 것을 집에 가서도 접속하여 작업을 수행할 수 있다.

 

 

 

느낀점: API 활용하여 데이터를 실시간으로 받아오고, 우리가 그동안 배워왔던 데이터베이스, CSV, DataFrame, 웹페이지등을 활용하여 정보들을 저장하고 표현할 수 있었다. 만약, 내가 이러한 것들을 활용하였을 때, OpenWeather 처럼 사람들에게 이로운 정보를 제공하고, 배포하여 세상을 더 이롭게 하면 어떨까 하는 생각들을 하였다...ㅋ  웹사이트에 들어가 정보를 가져다 쓰기만 하다가 자세히 배우게 되니, 더욱 흥미로웠던 것 같다.