# 배포 환경 이식을 위한 Porting

## Linux 기반 크롤러 이식 및 구현

본 크롤러를 관리자가 매번 실행하기에는 한계가 있다. 그러므로 컴퓨터에게 주기적으로 실행 및 관리를 맡기고, 에러 발생 시, 로그파일을 기록하는 부분까지 구현을 완료

한다. 본 프로젝트의 서버의 운영체제는 Linux(Uvuntu 18.04)로 진행하며, 이에 해당하는 작업을 설계 및 구현한다. 사용 GUI Tool 로서는 X-Shell 및 Termius 그리고 MongoDB Compass를 사용한다.

## 과정

### 요구 라이브러리 설치

![](https://728901758-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_Wo7SRUvbKJuPojzzZ%2F-LuSTkuE4_1PRtpK7kKu%2F-LuSU86bR5SX-Rc8XUeX%2Fimage.png?alt=media\&token=f1bc02aa-27b2-47e3-be91-2def7f6b732d)

해당 크롤러가 Linux에서도 실행되기 위해서 해당 크롤러가 동작할 요구 라이 브러리를 설치해야할 필요성이 존재한다. 이를 위해서 requirements.txt를 생성 한다. 해당 **requirements.txt 안에는 크롤러가 동작하기 위한 라이브러리 종류 와 해당 라이브러리의 버전이 기록**되어 있다.

### 플랫폼 분리

크롤러가 서버에서 운영도중에 에러가 발생 시, 서버에서 디버깅하는 것은 잘못된 코드 하나가 치명적인 결과를 야기할 수 있는 좋지 않은 행동이다. 그러므로 서버에서는 에러 확인 및 실행에만 리소스를 사용할 수 있도록, **본 크롤러를 현재 개발환경인 Windows와 서버의 운영체제인 Linux에 동일하게 실행할 수 있도록 코드를 수정**한다.&#x20;

![](https://728901758-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_Wo7SRUvbKJuPojzzZ%2F-LuSTkuE4_1PRtpK7kKu%2F-LuSUMyBtDV7hNp9xdt5%2Fimage.png?alt=media\&token=0c3922d5-a226-4877-ae23-9fd5a93542e8)

아래 사진을 예시로 두어서, MongoDB를 연결하는 과정에서 platform 라이브러리를 사용하여, Windows와 Linux 환경에서의 실행 차이를 두었다.

### 로깅 작업

본 프로그램의 로깅 작업에는 크게 3가지로 나뉘어진다.&#x20;

1. 크롤러 실행 도중 에러 발생 **\[ crawler\_log.log ]**
2. 크롤러 시작시각, 끝시각 및 실행시각 기록 **\[ crawler\_time.log ]**
3. 현재 크롤러의 크롤링게시판 위치 **\[ crawler\_ing.log ]**

본 크롤러의 로깅작업을 통해서 만약 **오류가 발생할 시에 디버깅을 좀 더 원활하게 하고, 실행되는 시각과 크롤링된 데이터를 파악하여서 크롤링을 실행할 시각 및 크롤링 데이터 개수를 통해서 유의미한 정보를 도출**한다. 또한 현 재 크롤러의 크롤링게시판의 위치를 파악하여, 현재 크롤러가 어느 부분을 크롤 링하고 있는지 관리자가 쉽게 파악할 수 있게 한다.

#### Crawler\_log.log

![](https://728901758-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_Wo7SRUvbKJuPojzzZ%2F-LuSTkuE4_1PRtpK7kKu%2F-LuSUtXTBV4pkd5DBcd8%2Fimage.png?alt=media\&token=aee2cc38-7876-408d-8199-37940b55b06a)

크롤러 실행 도중 에러가 발생한다면, 후에 디버깅 및 리팩토링 작업을 위해서 해당 파일에 기록을 해준다. 기록 문구는 해당 시각, 해당 게시판, 해당 URL, 해당 오류명을 표기한다. **해당 게시판에서 오류가 난다면 DB에 저장된 URL 테 이블에서 크롤링 최대 5회동안 크롤링을 일시중지하는 작업**을 실행한다.

#### Crawler\_time.log

![](https://728901758-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_Wo7SRUvbKJuPojzzZ%2F-LuSTkuE4_1PRtpK7kKu%2F-LuSV4qEOMbKUaLlSbPD%2Fimage.png?alt=media\&token=3b958512-5d25-4be2-b112-f6b1b3840f78)

크**롤러 실행시각을 명확하게 파악하기 위해서 해당 로깅작업을 진행**한다. 기록되는 문구는 크롤러가 시작하는 시각, 현재 데이터베이스에 저장된 게시글의 총 수, 크롤러가 끝난 시각, 크롤러가 실행되는 시간, 크롤링 이 후에 데이터베 이스에 저장된 게시글의 총 수, 크롤링한 데이터 수를 출력해준다.

#### Crawler\_ing.ing

![](https://728901758-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_Wo7SRUvbKJuPojzzZ%2F-LuSTkuE4_1PRtpK7kKu%2F-LuSVHdkQMAVy7b41tc_%2Fimage.png?alt=media\&token=cb7500f2-a07a-4ec0-9710-eab955256ced)

현재 크롤링하고 있는 정확한 게시판 위치와 게시판 페이지를 로깅작업을 함으로써, 서버에서 크롤러를 실행시켜두고, 언제든지 현재 실행 중인 크롤러의 현재 작업 위치를 파악할 수 있다.

#### 크롤러 주기적 자동 실행

관리자가 크롤러를 매번 실행 및 관리하지 않게 하기 위해서 **Linux의 cron 기능을 이용**한다. 이 기능은 유닉스 계열 컴퓨터 운영 체제의 시간 기반 잡 스케줄러이다. 이 과정에서는 cron을 이용하여서, 해당 작업을 고정된 시간, 날짜, 간격에 주기적으로 실행할 수 있도록 한다. 본 작업에서는 **해당 크롤러를 3일에 한 번씩, 00시 00분마다 실행할 수 있도록 작성**해주었다.
