본문 바로가기

AWS

[Spring] 배포 서버의 도커 컨테이너에 크롤링 환경 구축하기

728x90

배포 서버의 도커 컨테이너에 크롤링 환경 구축하기

⚙️ 개발 환경

  • AWS ubuntu EC2
  • Java 11
  • Gradle
  • Spring boot

 

문제가 발생했다. 자꾸 크롬드라이버의 경로를 못찾음 ... 뭐지뭐지 ...

 

📍 Dockerfile : 도커 컨테이너에 크롬 브라우저 및 크롬 드라이버 설치 후 배포

 

FROM openjdk:11
COPY ./build/libs/TeamPlanner-BE-0.0.1-SNAPSHOT.jar application.jar

RUN apt-get -y update

RUN apt -y install wget

RUN apt -y install unzip

RUN apt -y install curl

RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

RUN apt -y install ./google-chrome-stable_current_amd64.deb

RUN #wget -O /tmp/chromedriver.zip https://chromedriver.storage.googleapis.com/` curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip

RUN wget -O /tmp/chromedriver.zip https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/117.0.5938.92/linux64/chromedriver-linux64.zip

RUN unzip /tmp/chromedriver.zip -d /usr/bin



ENV TZ=Asia/Seoul

EXPOSE 8080

ENTRYPOINT ["java","-jar","/application.jar"]

다음그림처럼 크롬브라우저를 설치하고 , 크롬브라우저맞는 크롬드라이버 설치가 되야 했는데 latest 가 자꾸 114버전이 떠서 실패해서

그냥 수동으로 117버전을 맞춰줬다. 그랬더니 일단은 크롬브라우저와 크롬드라이버의 호환은 잘 맞았음.

 

그래도 경로가 잘 안잡히시는분들은

 

서버에 있는 파일을 컨테이너에 복사하기 위해서 아래의 명령어를 사용했다.

docker cp /usr/bin/chromedriver [컨테이너 이름]:/usr/bin/chromedriver 

다음 명령어를 통해서 ec2에 크롬드라이버를 설치하고 도커컨테이너안에 해당하는 경로안에 chromedriver를 수동으로 넣는방법도 있다.

하지만 나는 제대로 설정되었음 ㅎㅎ..

 

📍 ChromeDriver 페이지 로딩되는 시간 넉넉하게주기

        try {
            driver.get(link);
            WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); // Adjust the timeout as needed

            // Wait for elements to load
            WebElement activityElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".nav-menu-list [data-active='true']")));

            if (activityElement != null) {
                String activityType = activityElement.getText();
                if ("공모전".equals(activityType)) {
                    processContestActivity(driver,link);
                } else if ("대외활동".equals(activityType)) {
                    processExternalActivity(driver,link);
                } else if ("동아리".equals(activityType)) {
                    processClubActivity(driver,link);
                }
            }
        } finally {
            driver.quit(); // Always quit the driver to avoid memory leaks
        }

나는 페이지가 로딩되는 시간을 1초로 줬었다. 하지만 서버에 스팩은 나의 노북 및 데스크탑과는 사양이 너무나도 막강하게

달랐기 때문에 중간에 자꾸 크롤링이 멈추는 일이 생겼다. 뭐지뭐지 하다가 chromedriver가 제대로 켜질때까지 시간을 넉넉하게줘서

크롤링하는데 문제없게했다.

 

📍 EnableScheduling , Scheduling 어노테이션의 이해

 

@Scheduled

Spring Boot에서 @Scheduled 어노테이션을 사용하면 일정한 시간 간격으로, 혹은 특정 시간에 코드가 실행되도록 설정할 수 있다.

주기적으로 실행해야 하는 작업이 있을 때 적용해 쉽게 사용하자.

@Scheduled 사용법

@Scheduled 어노테이션을 사용하기 위해 다음과 같이 Application Class @EnableScheduling 추가한다.

 

 

@Scheduled 속성

fixedDelay : milliseconds 단위로이전 Task 종료 시점으로부터 정의된 시간만큼 지난 Task 실행한다.

fixedRate : milliseconds 단위로이전 Task 시작 시점으로부터 정의된 시간만큼 지난 Task 실행한다.

 

 

fixedRate는 작업 수행시간과 상관없이 일정 주기마다 메소드를 호출하는 것이고,
fixedDelay는 (작업 수행 시간을 포함하여) 작업을 마친 후부터 주기 타이머가 돌아 메소드를 호출하는 것이다.

initialDelay : 스케줄러에서 메소드가 등록되자마자 수행하는 것이 아닌 초기 지연시간을 설정하는 것이다.

cron : Cron 표현식을 사용하여 작업을 예약할 있다.

첫 번째 * 부터
초(0-59)
분(0-59)
시간(0-23)
일(1-31)
월(1-12)
요일(0-6) (0: 일, 1: 월, 2:화, 3:수, 4:목, 5:금, 6:토)
Spring @Scheduled cron은 6자리 설정만 허용하며 연도 설정을 할 수 없다.

Cron 표현식 :

* : 모든 조건(매시, 매일, 매주처럼 사용) 의미

728x90