brunch

You can make anything
by writing

C.S.Lewis

by Moai Nov 15. 2020

Sqlite와 Crontab

백엔드 서비스 사전 지식

일정한 시간마다 정보를 수집 하고 DB에 저장한 후 REST API로 정보를 제공하는 서비스를 구현하려고 한다.

그전에 앞서 사전 지식을 가지고 있어야 한다.




Sqlite

개인적으로 mongodb를 좋아하고 일반적으로 DB서버를 sqlite를 사용하지 않지만 가볍게 서비스를 구축하려고 하므로 sqlite를 사용하려고 한다.


sqlite는 클라이언트에 최적화된 경량화 버전의 DB이다. 일단 매우 가볍다. 내가 저장한 텍스트 크기와 거의 비슷하게 DB용량이 증가한다. 크롬, 카카오톡 PC버전, 안드로이드 앱이 기본적으로 sqlite DB를 사용한다고 생각하면 그 이유가 있지 않을까? 그리고 호환성이 매우 좋아서 어느 운영체제에서나 편하게 사용, 개발할 수 있다. 또한 읽기 작업을 하는데 매우 빠르다.


단점을 말하자면 sqlite는 다른 디비와 다르게 다양한 자료형을 제공하지 않는다. BLOB(바이너리), NULL(비어있음), INTEGER(숫자), TEXT(문자열)만 제공할 뿐이다. 생각보다 시간을 디비에 자주 저장하고 인덱싱 하는데 이러한 기능은 좀 넣어주었으면 좋겠다.

두 번째 단점으로 사용자가 1명에 최적화되어있다. 디비에 값을 저장하는 동안 디비를 잠그기 때문에 여러 사용자가 쓰기가 많은 작업해야 하는 경우엔 적합하지 않다.


어려운 쿼리는 제외하고 테이블을 생성하고 값을 넣고 조회하는 방법만 알아보자. 추가적인 설명은 DB에 관한 내용이므로 패스하겠다.


테이블 생성

CREATE TABLE IF NOT EXISTS 테이블명 (

        칼럼명 자료형 옵션,

        contact_id INTEGER PRIMARY KEY,

        first_name TEXT NOT NULL,

        last_name TEXT NOT NULL,

        email TEXT NOT NULL UNIQUE,

        phone TEXT NOT NULL UNIQUE

);

https://www.sqlitetutorial.net/sqlite-create-table/


데이터 입력

INSERT INTO 테이블명 (칼럼명, column2 ,..)

VALUES( , value2 ,...);

https://www.sqlitetutorial.net/sqlite-insert/


데이터 조회

SELECT

   칼럼명,

   milliseconds,

   bytes,

   albumid

FROM

   테이블명,

WHERE

   조건식,

   albumid = 1;

https://www.sqlitetutorial.net/sqlite-where/


Python에서는 sqlite3 모듈이 기본적으로 내장되어 있다.

db 객체를 만들기 위해선 connect 함수를 이용해야 한다.


import sqlite3

db_con = sqlite3.connect('디비명')

그리고 쿼리를 실행하기 위해선 cursor 객체를 생성해야 한다.

cursor = db_con.cursor()

그리고 작성한 쿼리를 날리면 된다.

cursor.execute(작성한 쿼리)

이제 쿼리 한 결과를 디비에 적용하자.

db_con.commit()

디비 사용이 끝나면 디비를 닫아주자.

db_con.close()

자세한 사용 방법은 아래 사이트를 참고하자

https://docs.python.org/2/library/sqlite3.html



Crontab

다음에 알아볼 작업은 crontab이다.

우리가 작성한 프로그램이나 커맨드를 주기적으로 실행해야 할 경우 크론탭을 사용한다.

윈도우는 작업 스케쥴러라는 프로그램으로 기본적으로 내장되어 있어서 크론탭을 사용할 필요가 없다. 일반적인 사용자는 작업 스케줄러 사용법을 잘 모르고 있다. 오히려 악성코드가 자동실행을 위해 사용되는 기능으로 주로 사용된다. 윈도우의 작업스케줄러가 있다면 리눅스에는 크론탭이 존재한다.


크롤링을 하여 디비에 결과를 저장하는 프로그램을 만들어도 단발성이면 사람이 주기적으로 실행해야 하는 문제가 있다. 이러한 프로그램을 아주 작게 마이크로 단위로 서비스를 만든 뒤 크론탭으로 주기적으로 실행하도록 구현하면 도커에 컨테이너를 띄우기도 용이하다.


리눅스의 크론탭 사용방법은 다음과 같다. 어떤식으로 작업할지 쉘스크립트를 만들고 그 스크립트 파일을 어떤 식으로 작동시킬지 시간설정을 하면 된다.

주기적으로 필요없는 로그파일을 삭제하는 쉘스크립트를 만들고 하루에 한번씩 14시 20분에 실행하도록 해보자.


find /var/logs/로그폴더/*.log -ctime +365 -exec rm -f {} \;

생성한지 1년이 지난 로그파일을 삭제하는 명령어이다. 이 명령어를 delete_log.sh라는 파일에 작성한 뒤 실행권한을 주자.


이제 이 파일을 crontab -e 옵션을 주어 에디트 창을 열고

*      *      *      *      * [수행할 명령]

분(0-59)  시간(0-23)  일(1-31)  월(1-12)  요일(0-7)


다음의 형식으로 실행하도록 작업해보자

20 14 * * * sh 파일경로/delete_log.sh

이렇게 하면 14시 20분마다 주기적으로 쉘 스크립트를 실행하게 된다.


파이썬의 크론탭 라이브러리를 사용해서 주기적으로 작성한 코드를 실행해보도록 하자


python-crontab 라이브러리는 코드가 아닌 파일을 주기적으로 실행하는 모듈이므로 이 모듈을 사용하지 말고 apscheduler모듈을 사용해보자

https://apscheduler.readthedocs.io/en/stable/


python -m pip install apscheduler  명령어로 모듈을 설치하고

from apscheduler.schedulers.background import BackgroundScheduler

위의 모듈을 임포트 한 뒤 스케쥴러를 만들자


scheduler = BackgroundScheduler(job_defaults = { 'coalesce': False, 'max_instances': 인스턴스 개수 })

이후 스케줄러를 시작시키고

scheuler.start()

작업을 넣어주자

scheduler.add_job(함수명)

이렇게 하면 위 함수가 한 번만 실행된다.


2분 간격으로 주기적으로 실행하게 하려면 모드를 interval로 해야 한다

job = scheduler.add_job(함수명, 'interval', minutes=2)


마지막으로 위와 동일하게 14시 20분마다 실행하게 하려면 cron모드를 사용하면 된다.

job = scheduler.add_job(함수명, 'cron', hour=14, minute=20)


이제 위 내용을 통해서 주기적으로 데이터를 읽어와 디비에 저장하는 백엔드 서비스를 구현해보자

매거진의 이전글 Python 이미지 캡쳐 후 파일 탐지, 자동 번역
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari