기존 MVC 패턴으로 작업한 프로그램을 웹 크롤링하는 작업 중 발생된 오류이다.
오류 내용
오류가 발생된 코드들을 찾아가보면
1. model.ProductDAO 52번 라인
2. controller.ShoppingDontroller 30번 라인
3. client.Client 7번 라인
2번과 3번 코드의 경우 이상이 없었으므로,
1. model.ProductDAO 52번 라인에서 발생된 문제였다.
model.ProductDAO를 찾아가보면,
for(int i=0; i<productName.size();i++) {
String Name = productName.get(i).text();
int price =Integer.parseInt(productPrice.get(i).text());
ProductDTO productDTO = new ProductDTO();
productDTO.setPK(pk++);
productDTO.setProductName(Name);
productDTO.setPrice(price);
this.productDatas.add(productDTO);
}
해당 코드 중,
int price =Integer.parseInt(productPrice.get(i).text());
에서 발생된 오류이다.
오류 원인 파악
숫자형 포맷 오류 발생되었다는 오류 내용이고,
오류 내용을 확인해 보니 문자를 숫자로 Integer.parseint 로 변경하려고 하여 발생한 오류이다.
오류 해결
현재 크롤링으로 받아오려는 금액 내용이 "40,840원" 이라는 문자열 형식으로 확인되었는데,
문자열을 정수로 변환하려면 숫자 외의 문자를 제거해주어야 한다.
이를 위해 문자열에서 쉼표와 "원" 문자를 제거한 후 변환하면 된다.
문자열을 제거하기 위해서는 .replace 를 사용해 수정해 주면 된다.
수정한 코드
for(int i=0; i<productName.size();i++) {
String Name = productName.get(i).text();
int price =Integer.parseInt(productPrice.get(i).text().replace(",", "").replace("원", "").trim());
ProductDTO productDTO = new ProductDTO();
productDTO.setPK(pk++);
productDTO.setProductName(Name);
productDTO.setPrice(price);
this.productDatas.add(productDTO);
}
.trim() 메서드의 경우 문자열의 앞 뒤 공백을 없애주는 메서드인데,
이번 케이스는 문자열에 공백이 없기 때문에 별다른 영향은 주지 않는 메서드이다.
(참고용으로 기재해 놓음)
++ 비슷한 메서드 정리!
.replace("원", "") : 앞의 "원"을 제거하고 뒤의 빈 문자열 "" 로 대체하여 제거
.replaceAll("[^\d]", "") : 문자열에서 숫자가 아닌 모든 문자를 빈 문자열로 대체하여 제거
.replaceAll("[^0-9]", "") : 문자열에서 숫자 0~9가 아닌 모든 문자를 빈 문자열로 대체하여 제거