✅ 1. 크롤링 대상
- 대상: 동행복권
- 범위: 로또 1회차부터 최신 회차(1167회차)까지 전체
- 수집 정보:
- 당첨 번호(n1~n6)
- 보너스 번호
- 추첨일자
- 1등 당첨자 수
- 1등 당첨금액
- 총 판매금액
- 2등~5등 각 등수의 당첨자 수 및 금액
✅ 2. DB 테이블 구조
📄 lotto_results
컬럼명 설명
| draw_round | 회차 번호 |
| draw_date | 추첨일 |
| n1 ~ n6 | 당첨 번호 |
| bonus_number | 보너스 번호 |
| first_prize_winners | 1등 당첨자 수 (Long 타입으로 확장) |
| first_prize_amount | 1등 당첨금 |
| total_sales_amount | 총 판매금액 |
📄 lotto_result_details
컬럼명 설명
| lotto_result_id | 외래키 (lotto_results) |
| rank | 등수 (2~5등) |
| winner_count | 당첨자 수 |
| prize_amount | 당첨금액 |
✅ 3. Spring 엔티티 구성
- LottoResults, LottoResultDetails 두 개의 Entity 구성
- @OneToMany(mappedBy = "lottoResults") 로 연관관계 설정
- @Builder.Default 로 List<LottoResultDetails> 기본값 세팅
✅ 4. 크롤링 서비스 구성
📌 LottoCrawlerService
- crawlAndSave(WebDriver driver, int round)
- 단일 회차 크롤링 및 저장
- crawlLatest()
- 최신 회차 1회 자동 저장
- getLatestRound()
- 셀렉트 박스에서 최신 회차 파싱
- crawlAll()
- 1회차부터 최신까지 전체 저장 루프
주요 수정 사항:
- Integer.parseInt(...) → Long.parseLong(...) 로 변경하여 int 범위 초과 문제 해결
- 날짜 처리 시 LocalDate.parse(...).atStartOfDay() 방식으로 LocalDateTime 일관 처리
✅ 5. Controller 구성
@PostMapping("/crawlall")
public ResponseEntity<?> crawlAll() {
crawlerService.crawlAll();
return ResponseEntity.ok("전체 회차 크롤링을 성공적으로 완료했습니다.");
}
- Postman에서 POST 요청으로 전체 크롤링 수행 가능
✅ 6. Selenium 설정 및 디버깅 이슈
- chromedriver 자동 세팅 (WebDriverManager)
- ExpectedConditions.presenceOfElementLocated() 로 로딩 안정성 확보
- NoSuchElementException, NumberFormatException 등 예외 처리 및 로깅 강화
✅ 7. 성공 결과
- 🌟 총 1167회차까지 크롤링 및 DB 저장 성공
- ✔️ DB 정합성 및 데이터 정리 확인 완료
✍️ 향후 작업 예정
- 스케줄러로 매주 토요일 오전 자동 실행 기능
- 테스트 컨트롤러로 DB 호출 기능 확인
- Swagger 연동으로 API 테스트 편의성 향상
- 데이터 기반 추천 알고리즘 개발 및 연동 (확률 기반 번호 추천)
- 크롤링 결과 대시보드 시각화
'DEV-LOG > Lottomate' 카테고리의 다른 글
| [Project Lottomate] 개발일지(6) (0) | 2025.04.25 |
|---|---|
| [Project Lottomate] 개발일지(5) (0) | 2025.04.22 |
| [Project Lottomate] 개발일지(4) (0) | 2025.04.21 |
| [Project Lottomate] 개발일지(3) (0) | 2025.04.20 |
| [Project Lottomate] 개발일지(2) (0) | 2025.04.18 |