동아리 운영을 위해서, 또 나 자신을 위해서 보편적이면서도 안 만들어진,

또 난이도는 어렵지 않은 API를 제작할 대상을 찾고 있는 도중 도서관 오픈열람실을 타겟으로 잡았다.

학교에서 직접 제작한 API가 없어 조금 실망감이 크긴 했지만, API를 직접 만들 기회가 되어서 다행이었다.

API 제작 대상 살펴보기

학교의 열람실 정보는 이미지로 사용중인 좌석과 비어있는 좌석을 보여준다.




밑에 있는 내용처럼 1분 마다 갱신하는 형태로 나름 API처럼 잘 갱신되어 보이는 듯 하지만

막상 내부에 들어가 html을 보면 경악스러운 모습을 볼 수 있다.




이미지 위에 하나 하나 html 요소를 붙여 색으로 나누고 있었던 것이다.

알기로는 열람실 책상 배치 위치 이동이 몇 년동안 없었던 것 같은데…

이렇게 밖에 구현할 수 밖에 없는건가?

아무튼 보이는 모습처럼 html 파싱을 통해서 좌석 번호마다 공석, 점유 상황을 파싱할 수 있었다.

단순히 복사 붙여놓기한 형태라 파싱하는데 쓰이는 코드는 몇 줄 안 걸렸다.

    html_text = bytes(html, 'iso-8859-1').decode('cp949')
    
    bsObj = bs(html_text, features="html.parser")
    
    seat_data_html = bsObj.find('div', id='maptemp')

    # 비어있는 좌석
    seats = seat_data_html.find_all('td', bgcolor='gray')
    seats_o = [s.contents[0].contents[0] for s in seats]

    # 사용중인 좌석        
    seats = seat_data_html.find_all('td', bgcolor='red')
    seats_x = [s.contents[0].contents[0] for s in seats]

여기까지 오면 쉽게 데이터를 확보할 수 있다.

무엇보다 요청을 보내는데 특별히 인증절차가 없어 서버가 잠깐 다운되지 않는 이상 별 수고를 들일 필요없이 파싱을 할 수 있었다.




위 사진처럼 AWS 람다와 API Gateway를 이용하면 파싱을 대신해주는 형태로 더 쉽게 데이터를 가져오도록 만들었다.

이 정도 선에서 끝낼수도 있지만…

생각해보니 이런식으로 래핑하는 것까지 좋은데 AWS 기능을 어떻게든 사용해보고 싶어

다음과 같은 구조를 생각하고 있다.




API를 다른 학생들에게 공개할 예정이라, 단순히 파싱만 대신하는 형태로 운영하다가는 서버가 폭주할 수도 있고 단순히 래핑한 수준에 불과한 것 같아 데이터도 수집할 겸 이렇게 설계했다.

학교 서버와 유저 간의 데이터 플로우를 이원화 하는 것이 운영하는데 있어 더 안정적이고

무엇보다 실제 데이터 또한 1분마다 갱신되는거라 단순히 래핑만해서 반환하는 것은 불필요한 트래픽이 낭비되기 때문이다.

람다차원에서 캐싱할까 생각해봤지만, 이왕에 캐싱할 거 차라리 데이터베이스에 저장해 나중에 시계열 분석을 할 때

전혀 관련없는 데이터보다 학교 열람실의 시계열 데이터를 분석하면 더 몰입하기도 쉽고, 재밌는 결과물이 나올 것이라고 봤다.

두 개의 부분으로 나누면 다음과 같다.




초록색 부분이 내 람다함수가 이용하는 백엔드와 같은 것이고

파란색 부분이 API 사용자로부터 요청이 왔을 때 DynamoDB로부터 데이터를 가져오는 프론트와 같은 것이다.

여기서 더 세부적으로 나누는 것은 크게 의미가 없고, 취지에 맞지 않아 이 선에서 마치기로 했다.

정리

클라우드를 이용해 나 말고도 다른 사람들도 함께 쓸 수 있는 애플리케이션을 만들고 있다!

AWS라면 ec2를 깔짝이는 수준에서나 사용했었는데, 람다라는 것을 사용해보니 이전에는 이해가 안되었던 람다를 이해할 수 있었다.

AWS Lambda라는게 처음에는 이해하기까지 어려웠던 이유가

컴퓨터를 잠깐 사용한다는데 누가 그걸 작동시키는 거지?

그걸 작동시키고 값을 어떻게 하는 거지?

그냥 내가 콘솔에서 python main.py하는거랑 뭐가 다르지?

라는 의문점이 들었고, 직관에 반하는 정의라 엄청 해맸는데

디스코드 봇을 만드는 다른 예시 유튜브 영상을 따라하면서 API Gateway라는 AWS 기능도 알게 되면서 람다를 이해할 수 있게되었다.

앞으로 ec2 인스턴스를 만드는 것보다 람다와 API Gateway, EventBridge를 이용해 재밌는 것을 많이 만들것 같은 예감이 든다.

최근에 다른 학교에서 학교 서비스를 클라우드를 통해 운영한다는 소식을 많이 봤는데

학교 차원에서 클라우드 교육도 적극적으로 밀어주고, 도입해줬으면 좋겠다.

aws-logo.png
kwu_logo.jpg