진행하는 프로젝트는 다른 외부 서비스로부터 우리 서비스에서 필요로하는 데이터를 수신받아야 하는데, 해당 외부 서비스에서 지원하는 DB가 MS SQL, Oracle 두 종류로 국한되는 상황이다. 반면 우리 프로젝트에서 사용할 DB는 PostgreSQL 이다. 때문에 해당 외부 서비스로부터 데이터아 우리 서버로 옮겨줄 중계 DB가 필요한데, 이를 Naver Cloud Platform 내 클라우드 서버를 통해 수신받을 예정이다. 해당 클라우드 서버 설정은 이전에 다루었고 이번엔 수신받은 데이터를 어떻게 우리 서버로 옮길지에 대해 다루도록 하겠다.
고찰
네이버 클라우드상에 위치한 DB 서버로부터 데이터를 추출하기 위해선 다양한 방법이 있을 것 같다. 우선적으로 여러 방법들 중 어떤 방법이 가장 적절한지에 대해 고민하는 것이 선행되어야 할 필요가 있다. CSV 파일을 추출하여 Gitlab에 업로드하는 것도 고려하였으나, 사원 정보를 Gitlab과 같은 퍼블릭 저장소에 올리는 것은 적절한 방법이 아닌 것 같아 고려하지 않았다.
방법
가장 처음 생각한 것은 데이터베이스에 데이터가 INSERT 되는 것을 감지하여 일련의 작업을 수행하는 것이었다. 찾아보니 MSSQL Trigger를 통해 데이터가 INSERT 되는 것을 감지할 수는 있으나, 해당 코드는 SQL 쿼리문으로만 작성되어야 했다. 수신 DB가 MSSQL로 동일하게 구현되었을 경우는 SQL 쿼리문을 통해 데이터 복사가 가능하였으나, 본 프로젝트엔 수신 DB가 PostgreSQL로 구현될 예정이기에 해당 방법은 배제하였다.
스크립트를 통한 자동화
쉘 스크립트를 통해 데이터베이스로 쿼리를 날려 데이터 조회를 자동화할 수 있다. 데이터 추출은 원활히 동작하나, 실제 사용할 프로젝트 DB에 데이터를 전송하기 위해선 별도의 코드를 작성해야하기에 적절한 방법이 아닐 것 같아 배제하였다.
이후 아래 코드를 통해 소스 DB로부터 타겟 DB로 데이터를 복사할 수 있다. 해당 코드는 파이썬 코드상으로 직접 DB에 접근하여 특정 쿼리를 통해 데이터를 얻어온 뒤, 이를 CSV 파일로 저장한다. 이후 타겟 DB에 접속한 다음 추출된 CSV 파일을 기반으로 데이터를 옮기는 간단한 방법이다.
상기 코드는 소스 데이터 테이블로부터 모든 데이터를 조회하여 전송하는 코드로, 실제 사용할 때에는 테이블의 전체 데이터를 조회하는 만큼 오버헤드가 발생할 것으로 생각된다. 따라서 상기 코드를 일정 간격으로 스케줄링 하여 해당 스케줄링 시간 간격만큼의 데이터만 조회하여 타겟 DB로 업데이트 하는 것이 적절한 방법일 것 같다.
아래는 매일 파이썬 함수를 실행한다고 할 때 datetime 모듈을 통해 오늘 날짜를 조회하여 쿼리문을 요청하는 예시이다.
1 2 3 4 5 6 7 8 9
# 오늘 날짜를 기준으로 한 쿼리문 import datetime
(코드 중략)
current_date = datetime.datetime.now().strftime("%Y%m%d") sql_query = f"SELECT * FROM your_table_name WHERE column LIKE '{current_date}%'"
crontab을 통해 해당 파이썬 코드 수행을 스케쥴링하여 매일 아침 7시에 수행될 수 있도록 자동화하였다. 또한 추후 확인을 위해 출력값을 cron.log 파일에 기록하여 확인할 수 있도록 하였다.
# crontab 작업 추가 # 매일 아침 7시에 copy_data_to_pgsql.py를 수행 $ crontab -e 0 7 * * * /usr/bin/python3 /root/bin/copy_data_to_psql.py >> /root/logs/cron.log 2>&1
print(f"{current_date} 일자 데이터 전송 완료\n") except Exception as e: print(f"{current_date} 일자 작업 중 오류가 발생하였습니다 : {e}")
1 2 3 4 5 6
# /root/logs/cron.log 20240117 일자 데이터 전송 시작 20240117 일자 데이터 전송 완료
# /root/logs/20240117_data.csv your_table_data
1 2 3 4 5 6 7 8
# PostgreSQL 테이블 생성에 사용한 쿼리문
>CREATETABLE your_table_name (
...
PRIMARY KEY (PK1, PK2) );
서버 자동 시작 & 중지
상기 과정을 완료하였다면 네이버 클라우드 DB 상의 데이터를 일정 시간마다 자동으로 전송하는 환경 구성이 완료되었다. 해당 클라우드 서버는 다른 서비스로부터 일정 시간마다 데이터를 수신받는데, 이렇게 되면 해당 수신 서버를 항상 활성화해 놓는 것은 비용적인 측면에서 낭비일 수 있다. 따라서 이번에는 Naver Cloud Functions를 활용해 자동으로 해당 서버를 일정 시간마다 시작 & 중지 할 수 있는 환경을 구성하려 한다.
Naver Cloud Functions 이란
Cloud Functions 상세 기능
상기 이미지는 Naver Cloud Functions 에 대한 기능을 간단히 도식화한 이미지이다. 간단히 설명하면 특정 이벤트 트리거를 통해 우리가 Python, JAVA등의 언어로 정의한 비즈니스 로직을 실행시켜 네이버 클라우드 플랫폼(NCP)에서 제공하는 다른 서비스들을 제어할 수 있는 것이다. 본 글에서는 cron(이벤트 트리거)를 통해 Python(비즈니스 로직) 코드를 실행시켜 직접 Server(서비스)를 제어하고자 한다.
설정
우선적으로 트리거(Trigger)를 설정해주어야 한다. 말 그대로 특정 이벤트 발생을 감지하여 일련의 코드를 동작시키기 위함으로, 본 프로젝트에서는 cron 을 트리거로 사용할 예정이다. Naver Cloud Functions에서 Trigger 탭 내의 ‘생성’ 버튼을 누르면 다음과 같은 화면을 볼 수 있다.
Cloud Functions cron 생성 페이지
cron 작성 규칙은 위에서도 언급하였지만 다시 말하면 아래와 같다. 본 프로젝트에서는 7-9, 11-13, 15-17, 19-21 시간에만 서버를 활성화할 예정이다. 또한 주말에는 서버를 활성화할 필요가 없으므로 최종적으로 다음과 같이 2개의 cron Trigger 를 생성하였다.
본 글에서는 서버 시작, 정지를 위해 startServerInstances, stopServerInstances 두 개의 API를 호출할 예정이다. 이를 위해 바로 액션을 설정하기에 앞서 패키지(Package)를 통해 두 API에서 공통적으로 필요한 데이터들을 관리하고자 한다.
Cloud Functions Package 생성 페이지
패키지 이름은 자유롭게 설정하면 되며 본 프로젝트에서는 server-control 로 정의하였다. 디폴트 파라미터로는 아래와 같이 설정해주었다.