|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: KWU 도서관 오픈열람실 API 만들기 |
| 4 | +hide_title: true |
| 5 | +feature-img: "" |
| 6 | +thumbnail: "assets/img/posts/making-KWU-reading-room-API.aws-logo.png" |
| 7 | +color: rgb(73,212,185) |
| 8 | +bootstrap: true |
| 9 | +tags: [2021, ] # 태그는 작성하면 알아서 분류됨 |
| 10 | +author: ccppoo |
| 11 | +--- |
| 12 | + |
| 13 | +동아리 운영을 위해서, 또 나 자신을 위해서 보편적이면서도 안 만들어진, |
| 14 | + |
| 15 | +또 난이도는 어렵지 않은 API를 제작할 대상을 찾고 있는 도중 도서관 오픈열람실을 타겟으로 잡았다. |
| 16 | + |
| 17 | +학교에서 직접 제작한 API가 없어 조금 실망감이 크긴 했지만, API를 직접 만들 기회가 되어서 다행이었다. |
| 18 | + |
| 19 | +# API 제작 대상 살펴보기 |
| 20 | + |
| 21 | +학교의 열람실 정보는 이미지로 사용중인 좌석과 비어있는 좌석을 보여준다. |
| 22 | + |
| 23 | +{% include image.html src="/assets/img/posts/making-KWU-reading-room-API/reading-room.png" height=400px%} |
| 24 | + |
| 25 | +밑에 있는 내용처럼 1분 마다 갱신하는 형태로 나름 API처럼 잘 갱신되어 보이는 듯 하지만 |
| 26 | + |
| 27 | +막상 내부에 들어가 html을 보면 경악스러운 모습을 볼 수 있다. |
| 28 | + |
| 29 | +{% include image.html src="/assets/img/posts/making-KWU-reading-room-API/reading-room-html.png"%} |
| 30 | + |
| 31 | +이미지 위에 하나 하나 html 요소를 붙여 색으로 나누고 있었던 것이다. |
| 32 | + |
| 33 | +알기로는 열람실 책상 배치 위치 이동이 몇 년동안 없었던 것 같은데... |
| 34 | + |
| 35 | +이렇게 밖에 구현할 수 밖에 없는건가? |
| 36 | + |
| 37 | +아무튼 보이는 모습처럼 html 파싱을 통해서 좌석 번호마다 공석, 점유 상황을 파싱할 수 있었다. |
| 38 | + |
| 39 | +단순히 복사 붙여놓기한 형태라 파싱하는데 쓰이는 코드는 몇 줄 안 걸렸다. |
| 40 | + |
| 41 | +```python |
| 42 | + html_text = bytes(html, 'iso-8859-1').decode('cp949') |
| 43 | + |
| 44 | + bsObj = bs(html_text, features="html.parser") |
| 45 | + |
| 46 | + seat_data_html = bsObj.find('div', id='maptemp') |
| 47 | + |
| 48 | + # 비어있는 좌석 |
| 49 | + seats = seat_data_html.find_all('td', bgcolor='gray') |
| 50 | + seats_o = [s.contents[0].contents[0] for s in seats] |
| 51 | + |
| 52 | + # 사용중인 좌석 |
| 53 | + seats = seat_data_html.find_all('td', bgcolor='red') |
| 54 | + seats_x = [s.contents[0].contents[0] for s in seats] |
| 55 | +``` |
| 56 | + |
| 57 | +여기까지 오면 쉽게 데이터를 확보할 수 있다. |
| 58 | + |
| 59 | +무엇보다 요청을 보내는데 특별히 인증절차가 없어 서버가 잠깐 다운되지 않는 이상 별 수고를 들일 필요없이 파싱을 할 수 있었다. |
| 60 | + |
| 61 | +{% include image.html src="/assets/img/posts/making-KWU-reading-room-API/aws-lambda-api-console.png"%} |
| 62 | + |
| 63 | +위 사진처럼 AWS 람다와 API Gateway를 이용하면 파싱을 대신해주는 형태로 더 쉽게 데이터를 가져오도록 만들었다. |
| 64 | + |
| 65 | +## 이 정도 선에서 끝낼수도 있지만... |
| 66 | + |
| 67 | +생각해보니 이런식으로 래핑하는 것까지 좋은데 AWS 기능을 어떻게든 사용해보고 싶어 |
| 68 | + |
| 69 | +다음과 같은 구조를 생각하고 있다. |
| 70 | + |
| 71 | +{% include image.html src="/assets/img/posts/making-KWU-reading-room-API/api-structure-1.png"%} |
| 72 | + |
| 73 | +API를 다른 학생들에게 공개할 예정이라, 단순히 파싱만 대신하는 형태로 운영하다가는 서버가 폭주할 수도 있고 |
| 74 | +단순히 래핑한 수준에 불과한 것 같아 데이터도 수집할 겸 이렇게 설계했다. |
| 75 | + |
| 76 | +학교 서버와 유저 간의 데이터 플로우를 이원화 하는 것이 운영하는데 있어 더 안정적이고 |
| 77 | + |
| 78 | +무엇보다 실제 데이터 또한 1분마다 갱신되는거라 단순히 래핑만해서 반환하는 것은 불필요한 트래픽이 낭비되기 때문이다. |
| 79 | + |
| 80 | +람다차원에서 캐싱할까 생각해봤지만, 이왕에 캐싱할 거 차라리 데이터베이스에 저장해 나중에 시계열 분석을 할 때 |
| 81 | + |
| 82 | +전혀 관련없는 데이터보다 학교 열람실의 시계열 데이터를 분석하면 더 몰입하기도 쉽고, 재밌는 결과물이 나올 것이라고 봤다. |
| 83 | + |
| 84 | +두 개의 부분으로 나누면 다음과 같다. |
| 85 | + |
| 86 | +{% include image.html src="/assets/img/posts/making-KWU-reading-room-API/api-structure-2.png"%} |
| 87 | + |
| 88 | +초록색 부분이 내 람다함수가 이용하는 백엔드와 같은 것이고 |
| 89 | + |
| 90 | +파란색 부분이 API 사용자로부터 요청이 왔을 때 DynamoDB로부터 데이터를 가져오는 프론트와 같은 것이다. |
| 91 | + |
| 92 | +여기서 더 세부적으로 나누는 것은 크게 의미가 없고, 취지에 맞지 않아 이 선에서 마치기로 했다. |
| 93 | + |
| 94 | +## 정리 |
| 95 | + |
| 96 | +클라우드를 이용해 나 말고도 다른 사람들도 함께 쓸 수 있는 애플리케이션을 만들고 있다! |
| 97 | + |
| 98 | +AWS라면 ec2를 깔짝이는 수준에서나 사용했었는데, 람다라는 것을 사용해보니 이전에는 이해가 안되었던 람다를 이해할 수 있었다. |
| 99 | + |
| 100 | +AWS Lambda라는게 처음에는 이해하기까지 어려웠던 이유가 |
| 101 | + |
| 102 | +컴퓨터를 잠깐 사용한다는데 누가 그걸 작동시키는 거지? |
| 103 | + |
| 104 | +그걸 작동시키고 값을 어떻게 하는 거지? |
| 105 | + |
| 106 | +그냥 내가 콘솔에서 `python main.py`하는거랑 뭐가 다르지? |
| 107 | + |
| 108 | +라는 의문점이 들었고, 직관에 반하는 정의라 엄청 해맸는데 |
| 109 | + |
| 110 | +디스코드 봇을 만드는 다른 예시 유튜브 영상을 따라하면서 API Gateway라는 AWS 기능도 알게 되면서 람다를 이해할 수 있게되었다. |
| 111 | + |
| 112 | +앞으로 ec2 인스턴스를 만드는 것보다 람다와 API Gateway, EventBridge를 이용해 재밌는 것을 많이 만들것 같은 예감이 든다. |
| 113 | + |
| 114 | +최근에 다른 학교에서 학교 서비스를 클라우드를 통해 운영한다는 소식을 많이 봤는데 |
| 115 | + |
| 116 | +학교 차원에서 클라우드 교육도 적극적으로 밀어주고, 도입해줬으면 좋겠다. |
| 117 | + |
| 118 | +{% include aligner.html images="/posts/making-KWU-reading-room-API/aws-logo.png ,kwu_logo.jpg" column=2 row=1 %} |
| 119 | + |
0 commit comments