내 취미는 독서다. 꽤 오래전, 통신사 혜택으로 밀리의서재 구독권을 받게 되었고, 이를 계기로 전자책을 구매하며 틈틈이 독서를 이어오고 있다. 그러나 이제 취업 준비와 본격적인 공부를 해야 하는 시점이기에, 이전처럼 활발하게 책을 읽기는 어려울 것 같다.
이 전자책 읽기
라는 취미에는 한 가지 불편한 점이 존재한다. 바로 밀리의 서재나 특정 구독 서비스 등등에서 제공하지 않는 전자책이 꽤나 많다는 것이다.
다행히 대학 전자책 도서관을 함께 이용할 수 있어 부족한 책들을 보완할 수 있었지만, 그마저도 원하는 책이 없는 경우가 종종 있었다. 결국 서울시 전자책 도서관, 소상공인 전자책 도서관 등 여러 기관을 직접 찾아가며 원하는 책이 어디 있는지 일일이 검색해야 했다.
이러한 불편함을 해소하기 위해 통합 검색 서비스를 찾아봤고, 다행히 능력자분들이 만들어 둔 사이트가 있어 이를 유용하게 활용했다. 하지만 속도가 느리거나 간헐적으로 접속이 불가능한 문제가 있었고, 결정적으로 UI가 직관적이지 않아 사용이 불편했다. 마침 42과정을 마무리하는 시점에서, 직접 통합 검색 서비스를 개발해보기로 결심했다.
본 프로젝트는 Docker 컨테이너 + CI/CD
기반의 모듈화된 구조로 개발된다.
eBook Search 서비스 개발 환경 구축 및 프로젝트 구조 설계
본 프로젝트는 공공기관 등의 전자책 사이트에서 서적 정보를 크롤링하고, 사용자가 검색하면 대여 가능한 곳을 알려주는 서비스이다. 개발 목표는 완전 자동화된 시스템을 구축하는 것이며, 이를 위해 주기적인 자동 크롤링을 통해 DB를 최신화하는는 환경을 마련하고자 한다. 본 문서에서는 개발 환경을 구축하는 과정과 프로젝트 구조를 정리하여, 향후 유지보수 및 확장을 용이하게 한다.
본 프로젝트에서는 다음과 같은 기술 스택을 사용한다. (* 개발 기간이나 숙련도 문제인한 모듈 대체 가능
)
개발을 단계별로 분리하여 진행함으로써, 각 모듈을 독립적으로 개발하고 점진적으로 통합한다.
e-book-search/
│── Makefile # 개발 자동화 명령어
│── .gitignore # Git 관리 제외 파일
│── docker-compose.yml # 전체 서비스 컨테이너 구성
│── srcs/ # 소스 코드 폴더
│ │── backend/ # Spring Boot 백엔드
│ │ ├── Dockerfile
│ │ ├── src/
│ │── frontend/ # React 프론트엔드
│ │ ├── Dockerfile
│ │ ├── src/
│ │── crawler/ # Playwright 크롤러
│ │ ├── Dockerfile
│ │ ├── src/
│ │── nginx/ # Nginx 리버스 프록시
│ │ ├── Dockerfile
│ │ ├── nginx.conf
│── db/ # 데이터베이스 설정
│ │── Dockerfile
│ │── init.sql
│── scripts/ # 자동화 및 배포 스크립트
│ │── deploy.sh
│ │── cronjob.sh
│── .github/ # GitHub Actions (CI/CD 설정)
│ │── workflows/
│ ├── deploy.yml
각 서비스(백엔드, 프론트엔드, 데이터베이스, 크롤러, Nginx)를 독립적인 컨테이너로 관리하기 위해 docker-compose.yml
을 작성한다. 이를 통해 각 서비스가 독립적으로 실행되며, docker-compose up -d
명령어만으로 전체 애플리케이션을 실행할 수 있다.
또한 Makefile을 사용하여 자주 실행하는 명령어를 단순화한다.
Playwright를 활용하여 전자책 사이트에서 데이터를 수집하고, MariaDB에 저장하는 기능을 구현한다.
Spring Boot를 활용하여 크롤링된 데이터를 조회하는 API를 설계한다.
React를 활용하여 검색 UI를 개발하고 백엔드 API와 연동한다.
Nginx를 리버스 프록시로 사용하여 프론트엔드 및 백엔드 트래픽을 관리한다.
GitHub Actions 또는 Jenkins를 활용하여 배포 자동화를 구성하고, 크롤링이 한 달에 한 번 실행되도록 스케줄링한다.