2024-03-14 (65일차) - 크롤링 시점, 스프링 @Schedule

·2024년 3월 14일

프로젝트

목록 보기
28/57

📅 2024-03-14, 65일차


TODO

  • 셀레늄 속도개선
  • 크롬창 뜨지않게
  • 반복실행 (duration) 시작과 끝지점
    • 자바 time 어쩌구 (검색해보기)
    • 자바스크립트 setInterval
  • 카페검색결과 목록에 db에 저장된거 보여주기
  • 로딩페이지-만들기

크롤링 시점 결정하기

  • 처음엔, 크롤링한 데이터를 컨트롤러에서 요청받아서 서비스 - > 레파지토리 -> DB까지 담아서 보여줄 생각이었지만
  • 사용자가 접속시 크롤링해와서 보여주는 방식으로 변경
    • beforeActionInterceptor에서 크롤링한 데이터를 요청 받아 db에 담는 방식

문제상황

  • beforeActionInterceptor로 변경 후 셀레늄의 단점인 속도가 확연이 드러남
    • 10군데의 카페를 크롤링해서 중복은 걸러내고 db까지 담는 것 까지 1분여의 시간이 걸렸으며
    • 한번에 여러개의 지도를 불러와 이보다 더 느려지기도 했고 크롤링을 중간에 멈추기도 했고..
    • 아무튼 에러도 이랬다저랬다 뭔가 불안정한 크롤링..

해결방법

  • 미리 크롤링해놓고 db에 저장 해놓은 데이터를 미리 사용자에게 보여주고, 정기업데이트와 같은 방식으로 매일 같은 시각에 크롤링을 실행하는 메서드를 사용하기로 함.

"정기적인 업데이트 (Scheduled Crawling): 크롤링을 사용자 요청에 의존하지 않고, 정해진 시간(예: 매시간, 매일 밤)에 실행합니다. 이 방법은 데이터가 빈번히 변경되지 않는 경우에 적합할 수 있습니다. 이렇게 하면 최신 정보는 정기적으로 업데이트되지만, 사용자는 오래된 데이터를 볼 수 있습니다."

@Schedule

스프링 부트에서 이런 작업을 @Schedule 어노테이션을 사용하기 위해 의존성을 추가한다.
schedule 테스트 메서드
참고

@EnableScheduling 
@SpringBootApplication
public class ScheduleApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(ScheduleApplication.class, args);
    }
}

@Slf4j // 로그를 위해서
@Component // 빈 등록
public class ScheduledTasks {

	private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("mm:ss:SSS");

	@Scheduled(fixedRate = 60000)
	public void fixedRate() {
		System.err.println("Scheduling Test");
				
	}

}
profile
hello world

0개의 댓글