Untitled

Github

https://github.com/Bellroute/NewRealsedShoesNoticeBatch

개요

2022년 초 1월 10일부터 16일까지 나이키 Member Days 이벤트 기간 동안 나이키 한정판 신발을 구매하기 위해 발매 시 슬랙 알림을 제공하는 서비스

서비스 플로우

  1. 특정 시간(신상품이 업데이트 되는 시간)이 되면 Jenkins를 통해 Batch 앱을 실행
  2. 나이키 공홈 사이트에서 상품 정보를 크롤링 및 파싱
  3. 크롤링된 상품 정보와 db에 저장된 상품 정보를 비교
    1. 크롤링된 상품 정보에는 없는데, db에는 있는 상품 → 품절 등으로 인해 판매하지 않는 상품 → db에서 제거
    2. 크롤링된 상품 정보에는 있는데, db에는 없는 상품 → 신상품 → db에 저장
  4. 신상품으로 분류된 데이터는 Slack으로 알림 전송

기술 스택

기술 중점 사항

1. Spring Batch Step 구성

하나의 Job 안에 3개의 Step으로 구성

2. CountDownLatch를 이용한 멀티스레딩 방식의 데이터 크롤링

크롤링을 위해 나이키 공식 홈페이지을 분석해본 결과 한 페이지에 40개의 제품이 로딩되도록 페이징처리가 되어 있음을 확인했습니다. 때문에 모든 상품 정보를 크롤링하기 위해서는 페이지 수만큼 url 요청을 보내야했습니다.

해당 로직은 비동기적으로 이뤄질 수 있을 것이라 판단되어 멀티 스레딩 방식으로 구현을 하였고, 기존에 40~50초가 소요되던 작업이 10초 미만으로 단축시킬 수 있었습니다.

public List<Product> crawlProducts() throws InterruptedException, IOException {
    int pageSize = nikeCrawler.getPageSize();
    log.info("page size : {}", pageSize);

    **CountDownLatch countdownLatch = new CountDownLatch(pageSize);
    for (int page = 1; page <= pageSize; page++) {
        Thread thread = makeThread(page , countdownLatch);
        thread.start();
    }**

    countdownLatch.await();
    return products;
}

프로젝트를 통해 성장한 부분