저번 포스팅 - 알라딘 중고책 프로젝트 (3) - 데이터 적재하기 | 코드 완성
이번 포스팅에서는 본격적으로 코드가 돌아갈 서버(EC2)와 DB(RDS)를 구성했던 과정을 작성하려 한다. 생각보다 오류가 많았어서 ㅠㅠ 이 과정에서 내가 했던 삽질도 상세하게 적어보려고 한다. 먼저 RDS부터 시작해보자!🚌
RDS 구축하기
데이터베이스 생성
어떤 걸 먼저 구축할까 고민하다 일단 DB에 데이터가 잘 적재되는지 테스트하는게 먼저일 것 같아서 RDS를 먼저 구축하기로 결정하였다.
사실 RDS DB를 생성하는건 그리 어렵지 않아서 생략할까 하다가 그래도 내가 했던 과정을 자세하게 밟아나가면 나 또한 큰 공부가 되지 않을까 하는 생각에 DB 생성부터 상세하게 글을 작성하기로 하였다.
우선 RDS는 PostgreSQL을 선택하였다. 선택 이유는 지금까지 계속 MySQL만 써왔기 때문에 다른 DB도 경험해보고 싶었다. 버전은 그렇게 크게 상관없을 것 같아 디폴트 버전을 선택하였다.
그리고 가장 중요한! 프리 티어를 선택했다. 데이터가 적기 때문에 운영에는 별 지장이 없긴 하지만 어차피 돈이 없는 나에게는 강제 아닌 강제... (나중에 돈 많이 벌면 펑펑 써야지💲💲💲)
그 뒤에 데이터베이스 이름이나 사용자 이름도 지정한 뒤, 쭈우욱 내려가서 퍼블릭 엑세스를 꼭 예로 해야한다. 사실 보안상으로는 굉장히 안좋은 선택이라고는 하지만... 일단 나는 개발하는 중이니까 DB가 제대로 작동하는지 외부에서 접속하여 테스트하는 용도로 사용하기 위해 퍼블릭 엑세스를 열어두었다.
그리고 추가 구성에서 자동 백업과 유지 관리 기능도 꺼두었다. 특히 자동 백업의 경우 스냅샷이 생성되는데, 예전에 AWS에서 조금씩 돈이 빠져나가서 확인해보니 DB만 삭제하고 스냅샷을 삭제하지 않아서 요금이 부과되고 있었다😂
이번에는 저번의 경험을 토대로 애초에 스냅샷을 생성하지 않는 방향으로 DB를 생성하기로 했다. 어차피 매우 중요한 DB도 아니고 문제가 생기면 그냥 다시 만들면 돼서....
이렇게 RDS를 만들면 이제 DB에 접속해서 잘 작동하는지도 확인하고, 테이블도 생성해야한다. 여기서 접근방법이 2가지로 나뉜다.
첫번째 방법은 PgAdmin 4로 편하게 GUI로 접속하는 것이다. 클릭으로 접속도 하고, 테이블도 만들 수 있기 때문에 굉장히 편리한 도구라고 할 수 있다.
두번째는 psql로 CLI 환경을 이용하는 방법이다. 아무래도 터미널이 익숙하지 않다면 불편할 수는 있겠지만, 확실히 GUI 환경보다는 뭔가 가볍고 빠른 느낌을 준다.
어떤 방법을 사용할까 고민하다 psql을 이용하는 것을 선택했다. CLI 환경에 익숙해지는 것이 중요하고, 무엇보다 가볍고 빠르게 접속할 수 있다는 것이 가장 큰 이유였다.
psql
psql은 처음에 postgresql을 다운받을 때 같이 다운받은 SQL Shell(psql)을 이용할 수도 있고, 따로 커맨트 창에서 이용할 수도 있다. 나는 Git Bash를 이용하여 psql을 이용하였다.
참고로 처음에 bash: psql: command not found 과 같은 에러가 뜰 수도 있는데(내가 그랬다 ㅎㅎ) 이는 환경변수에 psql이 등록되어 있지 않아서 그런 것이니 아래와 같이 꼭 postgresql 환경변수를 등록하자!
그러면 다음과 같이 정상적으로 psql을 사용할 수 있게 된다.
이제 본격적으로 psql을 사용해보기에... 앞서!!! AWS에서 중요한 작업을 하나 해주어야 한다. RDS를 구축하고 우리는
외부와의 통신을 위해 퍼블릭 엑세스를 열어주었다.
여기에 RDS가 가지고 있는 보안그룹에서 외부와의 연결을 위한 포트를 열어주어야 한다. RDS의 보안그룹에 가면 처음에 설정했던 보안 그룹이 나오는데 이를 클릭한다.
그러면 인바운드 규칙에 대한 창이 나오는데 이 인바운드 규칙에 PostgreSQL을 추가해준다. 허용 IP는 0.0.0.0/0로 모든 IP를 허용한다. 이 또한 보안상으로는 좋지 않지만 나는 편의를 위해 위와 같이 설정하였다.
인바운드 규칙까지 설정을 마쳤다면 이제 외부에서 RDS에 접속할 준비는 모두 마쳤다!! 이제 한 번 접속을 해보자. RDS를 구축할 때 지정했던 값들로 아래와 같은 형식으로 접속을 하면 정상적으로 접속을 할 수 있다.
psql \
--host=<DB instance endpoint> \
--port=<port> \
--username=<master username> \
--password \
--dbname=<database name>
접속을 하였으니 내가 사용하고자 하는 테이블을 생성해야 한다. 아래와 같이 CREATE TABLE 명령어를 이용하여 테이블을 생성하였다.
CREATE TABLE used_book(
itemId INT PRIMARY KEY,
...
)
대신 PostgreSQL에서 테이블을 만들 때 굉장히 조심해야할 부분이 있다. 위와 같이 입력할 경우 멀쩡한 컬럼인데 나중에 DB를 조회할 때 column "itemid" of relation "used_book" does not exist 라는 오류가 뜬다.
결론부터 말하자면 postgreSQL은 소문자가 기본인게 모든 것의 원인이었다. postgreSQL은 기본적으로 모든 쿼리가 소문자로 변환되기 때문에 위와 같이 컬럼이 존재하지 않는다는 에러가 발생하는 것이다.
자세한 내용은 아래 참고부분의 블로그를 참고하면 되겠다!
이제 데이터 적재를 위한 RDS에 대한 구축은 모두 마무리 되었다. 다음은 작성한 코드가 돌아갈 EC2를 구축하는 작업을 하려한다.
EC2 구축하기
EC2는 딱히 따로 설정한 부분이 없어서 일일이 설명하지는 않겠지만 OS는 우분투 18.04 버전을 사용했고, 당연히 프리티어 버전을 사용했다😀
EC2를 구축하고 가장 처음 해야할 작업은 작업한 코드를 EC2 서버에 옮기는 것이다. scp 명령어를 이용하여 편리하게 코드를 옮길 수 있다. 파일을 이동한 뒤에는 requirement.txt을 통해 필요한 패키지들을 먼저 다운받아준다.
scp -i aladindb.pem \
-r ./used_book_project/ ubuntu@ec2-00-000-000-000.ap-northeast-2.compute.amazonaws.com:~/
그러면 이제 EC2를 구축한 가장 큰 이유인 Crontabd을 사용해보자!
Crontab 사용
로컬에서 이 모든 환경을 구축할 수도 있었지만 EC2를 구축한 가장 큰 이유는 만들었던 코드를 24시간 내내 원하는 시간에 돌게하고 싶어서이다. 로컬로 구축하면 컴퓨터를 끄면 데이터를 추출해서 적재하는 작업을 할 수 없으니 말이다.
나는 6시간에 한 번씩 API를 통해 데이터를 적재할 예정인데, 이를 위해서는 Crontab이 필요하다. Crontab은 원하는 시간에 하고자 하는 작업을 자동으로 수행해주는 프로그램이다. (Airflow를 사용하고 싶었지만 이 태스크에서는 오버스펙이라... 나중에는 꼭 사용해봐야지😂)
사용방법은 아주아주 간단하다. 우선 아래의 명령으로 크론탭을 설치해준다.
apt-get update && apt-get install cron
그리고 crontab -e 명령어를 통해 주기적으로 실행하고자 하는 작업을 지정해주면 된다. 나는 작성한 코드를 6시간 간격으로 실행하도록 아래와 같이 작성하였다.
만약 크론탭의 문법이 헷갈린다면 https://crontab.guru/ 이 사이트로 가면 내가 하고자 하는 주기에 대해 아주 쉽게 변환하여 볼 수 있다.
앞으로는🤔
이렇게 기나긴 구축 작업이 마무리 되었다. 이제 드디어 프로젝트의 마지막인 시각화 작업만이 남았다!! 시각화에는 슈퍼셋을 이용할 것인데, 다음 글은 EC2에 슈퍼셋을 구축하는 과정에 대한 포스팅을 할 것 같다.
참고
[postgreSQL] 멀쩡한 컬럼인데 column does not exist 오류가 발생할 때
[postgreSQL] 멀쩡한 컬럼인데 column does not exist 오류가 발생할 때
이번에 시작한 토이 플젝에는 한번도 안 써본 디비를 써보자! 해서 야심차게 postgreSQL을 도입 하지만 처음 짜넣은 아주 간단한 select 문 실행에서부터 막혀버렸다ㅠ.ㅠ SELECT COUNT(*) FROM V WHERE VOCA =
dorongdogfoot.tistory.com
'프로젝트 > 알라딘 중고책 프로젝트' 카테고리의 다른 글
알라딘 중고책 프로젝트 (6) - 프로젝트 결과 & 회고 (3) | 2022.04.26 |
---|---|
알라딘 중고책 프로젝트 (5) - superset (0) | 2022.04.23 |
알라딘 중고책 프로젝트 (3) - 데이터 적재하기 | 코드 완성 (0) | 2022.04.13 |
알라딘 중고책 프로젝트 (2) - 데이터 추출하기 (0) | 2022.04.08 |
알라딘 중고책 프로젝트 (1) - 알라딘 API 살펴보기 (3) | 2022.04.07 |