Welcome! 🙋‍♂️ View more

Personal/Toy Project

첫 번째 토이 프로젝트 회고 (방탈출 취소 자리 찾기) (feat. AWS EC2, 웹크롤링, node.js)

DeepFlame 2022. 3. 14. 19:00

나의 첫번째 토이 프로젝트가 끝났다.

그에 따라 프로젝트 주제 선정과 프로젝트를 진행하면서 고민했던 부분을 회고해보고자 한다.

🙋‍♂️ 목차는 아래와 같다.

  1. 주제 정하기 
  2. 웹 정보 크롤링
  3. 웹 서버 만들기
  4. AWS EC2를 활용하여 서비스 구축
  5. 마무리

 

1. 주제 정하기


토이 프로젝트란 무엇인가... 🤔

토이 프로젝트란 거창한 프로젝트가 아니라 장난감(토이)를 가지고 놀 듯 흥미 위주의 프로젝트를 진행하는 것으로 생각하면된다. 

나의 경우, 평소에 불편했던 점 또는 이런 서비스가 있으면 참 좋을텐데... 라는 생각으로 접근했다. 

 

방탈출 취소 자리 찾기!

그래서 생각한 것이 방탈출 취소 자리 찾기이다. 

홍대 디코더의 Tempo Rubato의 경우, 1년간 예약이 꽉 차있다. 
1년 뒤 열리는 자리를 예약하는 것보다 취소 자리를 찾는 것이 좀 더 합리적일 것이라 생각했고, 이것을 사람이 주기적으로 할 수는 없으니 서버에서 주기적으로 확인하여 알려주는 서비스가 있으면 좋겠다고 생각했다.

 

 

2. 웹 정보 크롤링


1. selenium으로 구현

Tempo Rubato의 웹 화면은 아래와 같다. 

따라서 특정 날짜에 예약 가능한 시간이 있는지 확인하기 위해서는 아래와 같은 과정을 거쳐야한다. 

  1. 달력 객체를 가져와서 원하는 날짜를 찾아 클릭한다.
  2. 시간 객체를 가져와서 가능한 시간이 있는지 확인한다.

Tempo Rubato 예약창

위 과정은 웹컨트롤이 필요했고, 해당 과정을 selenium으로 구현했다.

구현 내용은 아래 게시글에 자세히 설명되어있다.

https://deep-flame.tistory.com/6

 

AWS EC2와 Python Selenium 을 활용한 토이 프로젝트 💻 (feat. 방탈출 자리 찾기!)

필자는 최근에 AWS Certified Cloud Practitioner 자격증을 취득했다. Data Engineer가 되기 위해서는 그들이 사용하는 기본적인 언어는 알아야한다고 생각했기 때문이다. 합격의 기쁨도 잠시, 자격증도 취득

deep-flame.tistory.com

 

 

2. requests로 구현

그러다가 웹에서 예약 여부 데이터를 조회하는 url을 확인할 수 있다면 selenium을 활용하는 것보다 훨씬 더 빠르게 정보를 가져올 수 있다는 사실을 확인했다. 

selenium vs requests 시간 비교 내용은 아래 게시글에서 확인할 수 있다.
내용을 요약하자면 "selenium은 브라우저를 띄우는 시간도 오래뿐더러, 웹 컨트롤을 찾는 시간이 4배 더 걸린다."

https://deep-flame.tistory.com/27

 

[Python] 크롤링 방법과 비교 (requests, BeautifulSoup, selenium)

Python에서 웹 크롤링을 하는 방법은 두 가지가 있다. requests 라이브러리로 웹 정보를 받고, BeautifulSoup로 파싱한다. selenium 라이브러리로 브라우저를 열어 웹 정보를 받는다. 보통 웹 컨트롤이 필요

deep-flame.tistory.com

 

다행히 예약 페이지에서 예약 가능 여부 데이터를 조회하는 url을 쉽게 찾을 수 있었고, 웹 정보를 가져오는 코드를 수정하게 되었다.

그 결과 두 달의 예약 정보를 가져오는 시간을 142초에서 12초로 줄이게 되었다. 그래서 현재는 1년간의 데이터를 추출할 수 있게 되었다.

Tempo Rubato 예약창의 네트워크 정보

 

그 후 이메일을 보내는 과정은 아래 게시글을 참고했다.

https://yeolco.tistory.com/93

 

파이썬으로 이메일 보내기(SMTP)

안녕하세요 열코입니다. 이번에는 파이썬을 활용하여 지메일(Gmail)로 메일 보내기에 대해 알아보겠습니다. 파이썬에서 메일을 보내기 위해서는 외부 라이브러리가 별도로 필요하지 않으며, 'SMT

yeolco.tistory.com

 

 

 

3. 웹 서버 만들기


나는 생각했다. 나에게 필요하면.... 누군가는 필요하지 않을까...?

이를 위해서는 2가지 고민이 필요하다.

  1. 유저 정보를 어떻게 받을 것인가?
  2. 유저 정보를 어디에/어떻게 보관할 것인가?

 

1. 유저 정보를 어떻게 받을 것인가? 🤔 

유저 정보를 받기 위해서는 DB와 통신하는 간단한 로직을 구동하는 웹 서버가 필요했다. 
Spring, Django, node.js를 비교해보았고, node.js + Express를 채택하여 웹 서버를 구축했다.

node.js는 채택한 이유는 서버에 무리가 적기 때문이다.

필자는 서버를 배포하기 위해서 AWS 프리티어 EC2를 사용했다. 그렇기 때문에 서버에 무리가 가지 않는 것이 중요했다.
그리고 간단한 작업을 진행하기에 적절하다는 이유도 있었다. 

node.js는 아래와 같은 특징을 가지고 있어 서버에 무리에 큰 무리가 가지 않는다.
1. node.js는 이벤트 루프라고 불리는 싱글 스레드 하나가 모든 요청을 다 받아 처리한다.
2. I/O 작업의 경우, 비동기 방식으로 요청을 처리한다.즉, 받은 요청에 대한 처리를 던져놓고, 다른 일을 하고 있다가 작업이 완료되면 이벤트 방식으로 요청이 완료됨을 알린다.
3. 따라서 많은 양의 작은 데이터를 주고 받는 프로그램에 적절하다.

이 외에도 node.js는 아래와 같은 장점들을 가지고 있다.
4. 라이브러리가 많아서 원하는 서비스를 입맛에 맞게 구축할 수 있다.
5. PM2를 통해 무중단 배포를 손쉽게 할 수 있다.
6. MongoDB와 같은 JSON기반 DB를 사용하는 경우 Java에서는 데이터 변환이 생기지만, node.js에서는 별도의 변환이 없어 유리하다.

 

node.js를 통해 구축한 웹서버

 

2. 웹서버에서 받은 유저 정보를 어디에/어떻게 보관할 것인가? 🤔 

유저 정보를 DB에 저장하는 것은 어찌보면 당연하다. 그렇다면 SQL과 NoSQL 중 무엇을 활용하는 것이 좋을까? 

필자의 경우는 NoSQL을 선택했다. 그 중 MongoDB를 선택했다.
그 이유는 간단하며 스키마가 느슨하고, 이메일 발송 정보를 저장하기 위해서이다. 

이메일 발송 정보: {"취소 자리 datetime" : "전송 시간"} 형태의 정보를 리스트 형태로 가진 정보이다. 이 정보가 필요한 이유는 같은 자리에 대해서 중복해서 보내지 않기 위함이었다.

 

MongoDB에 저장된 데이터 정보

 

 

4. AWS EC2를 활용하여 서비스 구축


AWS EC2 인스턴스를 생성하고, 아래와 같이 작업을 진행했다.

  1. git을 통해서 완성한 깃허브의 프로젝트를 가져왔다. 
  2. 웹서버는 PM2를 통해서 배포했다. (이 과정에서 EC2 인스턴스의 포트를 열어주는 과정이 꼭 필요하다.)
  3. 24시간 작업 실행을 위해 nohup을 통해서 백그라운드 작업을 실행했다. 
    이때, 주의할 점은 nohup을 통해서 저장되는 로그 파일에는 파이썬 내장 함수인 print()를 통한 출력이 나타나지 않았다. 그래서 logging 모듈을 사용하여 작업 진행상황을 확인했다.

로그 파일을 통해서 작업 진행 상황을 계속해서 확인할 수 있다.

 

nohup과 logging은 아래 게시글에 자세한 설명이 되어있다.

https://joonyon.tistory.com/98

 

쉽게 설명한 nohup 과 &(백그라운드) 명령어 사용법

안녕하세요. 린아저씨 입니다. 리눅스를 사용하다 보면 프로그램을 백그라운드에서 세션과의 연결이 끊어져도 돌려야할 일이 많이 발생합니다. 그럴때 주로 사용하는 명령어가 바로 nohup 과 &

joonyon.tistory.com

https://deep-flame.tistory.com/32

 

[Python] logging 사용법과 클래스화

Python에는 print라는 기능이 있다. 보통은 이 기능을 통해서 output을 확인한다. 그러나 print로는 output을 확인할 수 없는 경우가 있다. 필자는 airflow의 에러 로그가 print로는 확인되지 않아 logging 모듈

deep-flame.tistory.com

 

 

5. 마무리


이번 프로젝트에서 느낀점은... 👀

  1. 공부하는 것도 중요하지만, 무작정 부딪혀보는 것도 필요하다. 
  2. 문제점을 정의했으면 해결하기 위한 여러가지 기술들을 찾아보고, 비교해보자.
    (처음에 selenium으로 구현했을 때는 시간도 오래 걸리고, 에러도 많이 났다. 처음부터 좀 더 찾아봤더라면 작업이 좀 더 쉬웠을 수 있다고 생각된다.)

 

첫번째 토이 프로젝트였고, 클라우드 환경을 활용하는 것도 처음이라 여러 가지 어려움이 많았고, 힘들었다.

하지만 특징/장단점만 글로만 알고 있었던 여러가지 기술들을 직접 몸으로 느낀 경험은 정말 값진 경험이라고 생각한다!

 

 

🚀 해당 프로젝트 내용은 아래 깃허브에서 확인할 수 있다.

https://github.com/DeepFlame-JR/RoomEscape_Cancellation

 

GitHub - DeepFlame-JR/RoomEscape_Cancellation: 방탈출 빈자리를 찾아서 알립니다.

방탈출 빈자리를 찾아서 알립니다. Contribute to DeepFlame-JR/RoomEscape_Cancellation development by creating an account on GitHub.

github.com