본문 바로가기
프로젝트

[팀프로젝트]크롤링과 MVC패턴을 이용한 이마트몰 프로그램

by 근근커 2022. 7. 21.

이번 프로젝트는 PPT없이 진행되었으며, 이마트몰이라는 주제를 바탕으로 크롤링과 프로그램 제작을 진행하였다.

구상도는 위의 사진과 같이 설계되었다.

사용자는 프로그램을 사용하게되면 회원가입 후 로그인을 통하여 이마트몰을 이용할 수 있고

물품 검색은 최소금액과 최대금액을 설정하여 검색하며 검색한 물품 중 물품의 번호를 선택하여 구매를 진행한다.

마이페이지에서는 구매한 물품 목록과 회원 탈퇴가 가능하다.

테이블은 총 4개의 테이블을 사용하며 카테고리를 나눠놓은 테이블과 품목이 직접적으로 들어갈 테이블,

유저 정보가 저장될 테이블과 유저가 구매한 품목이 저장될 테이블이 있다.

품목의 카테고리를 번호로 저장하고 join을 이용하여 출력은 문자열의 형태로 출력할 것이다.

BUYLIST 테이블은 EPRODUCT와 USERDATA, 두 개의 테이블을 join하여 품목을 저장할 것이다.

EPRODUCT에 저장될 품목은 이마트몰 페이지에서 크롤링을 해서 저장할 것이다.

총 4개의 요소를 크롤링하며 상품의 이름,가격,리뷰수,이미지를 크롤링할 것이다.

이마트몰을 분석해보니 카테고리별로 페이지의 url만 다르며 요소의 경로자체는 같기때문에 url만 따로 지정하여

크롤링을 진행하였다. 카테고리는 임의로 101~501까지 5개의 카테고리로 분류해놓았으며 Crawling의 파라미터중 int는

카테고리의 번호를 의미한다.

더보기란으로 막혀있는 부분은 ajax되어있어 크롤링이 되지않아 샘플로 각 카테고리별로 데이터를 20개씩

수집하기로 결정하였다.

원래는 url과 카테고리 번호를 배열에 저장하여 for문을 이용해 한번에 20개씩 5번 총 100개를 받아오는 방법을

사용했었으나, 이마트 홈페이지 짧은 시간안에 여러 카테고리에서 크롤링을 하게되면 홈페이지에서 밴을 당하여

수기로 url과 카테고리 번호를 넣어서 천천히 크롤링을 진행하였다.

추후에 Thread.sleep을 이용하여 크롤링 사이에 텀을 주는 방법도 성공하였다.

 

추가적으로 이미지를 단순 저장이 아닌 실제로 콘솔에서 보이게 할 수는 없을까라고 생각을 하며 구글링을 해보다가

재미있는 프로그램을 발견하여 사용해보았다.

Sanji(상디)의 애니 천국: 인터넷 url 이미지를 복사해서 자바 스윙의 화면으로 뿌려주기 (bisuanytime.blogspot.com)

 

인터넷 url 이미지를 복사해서 자바 스윙의 화면으로 뿌려주기

"지구 상에 존재하는 미스테리 생물에 대해 글 올리는 블로그입니다"

bisuanytime.blogspot.com

해당 블로그에 포스팅 되어있는 프로그램이며 url주소의 해당하는 이미지를 출력해주는 프로그램이다.

이 프로그램에서 필요없는 부분은 지우고 필요한 부분만 남겨서 사용해보았다.

 

Model은 Person과 EmartMall 두가지의 VO와 DAO가 있으며 각각 유저 관련,이마트몰 관련 로직을 담당한다.

View는 눈에 보이는 콘솔의 화면과 크롤링을 담당했다.

Controller는 Model과 View를 결합하여 최종적으로 프로그램을 완성시켰다.

 

우선 join을 한 sql문을 살펴보도록 하자.

전체 목록출력과 금액검색 출력,구매할 상품과 구매한 상품목록에 join을 이용하였다.

현재 카테고리를 사용하는 기능은 없으나 추후에 카테고리를 이용하여 목록을 나눌 업데이트 예정이 있기 때문에

카테고리를 다른 테이블로 나누어 조인하였다.

 

프로그램을 구동해보도록하자.

설계와같이 로그인,회원가입,종료 세가지 선택지로 나누었으며 아이디가 없으니 우선 회원가입을 해야한다.

이름 홍길동,id는 hong, 비밀번호는 1234로 회원가입을 하였다.

테이블에 회원정보가 저장된것을 확인할 수 있다.

로그인을하면 역시 설계와같이 이마트몰의 메인화면으로 진입한다.

상품목록을 선택하면 위와같이 상품의 번호,이름,가격,구매횟수,카테고리가 출력된다.

크롤링해온 리뷰갯수를 구매횟수로 사용하였다.

상품검색은 최소금액과 최대금액 입력으로 이루어지며, 입력 조건에 해당하는 물품들이 출력된다.

추려진 품목을 보여주며 추가적으로 번호입력을 받아 구매하는 시스템이다.

번호 입력시 구매여부를 확인하고 대소문자 구분없이 입력이 가능하며 구매할 품목의 사진을 보여준다.

y를 눌러 구매를 완료한 모습이다.

구매를 완료하게되면 BUYLIST 테이블에 추가된것을 확인할 수 있다.

SID와 EID를 이용해 join하여 구매목록을 출력한다.

구매상품에 제대로 출력이 되는 모습을 확인할 수 있다.

회원탈퇴를 하게되면 첫 화면으로 돌아간다.

회원정보 테이블에서 정보가 삭제된 모습을 확인할 수 있다.

 

유효성 검사가 거의 안되어있는 수준이며 기능면으로도 부족한 부분이 많다.

카테고리 테이블 join을 이용한 카테고리별 목록 출력기능이나 구매목록 기능을 참고하여 장바구니 기능을

업데이트 할 예정이다. 구매목록같은 경우 현재 한 개의 테이블에서 두 개의 테이블로 join을 하고 있는 형태인데

BUYLIST테이블에서 유저의 PK와 상품의 PK를 JOIN하여 구매목록에 담아두고있다.

이 기능을 활용하여 장바구니에 담기 및 삭제, 그리고 장바구니에 있는 물품 구매 등을 구현할 수 있을것이다.

현재 회원이 물품을 구매한 후 탈퇴하게되면 BUYLIST에 탈퇴한 회원의 구매목록이 그대로 남아있는 문제가 있는데

join을 이용하여 DELETE를 사용하면

DELETE FROM BUYLIST A WHERE NOT EXISTS(SELECT SID FROM USERDATA B WHERE A.SID = B.SID);

해당 형태의 SQL문으로 두 테이블이 같은 SID값을 가지고 있지 않다면 해당 요소를 삭제할 수 있다.

 

이번 프로젝트를 통해 느낀점은 역시 설계단계는 아무리 공들여하더라도 부족하다는 것이다.

이번에는 View파트를 맡아보았는데 덕분에 크롤링을 더 많이 접해볼수있는 좋은 기회가 되었다.

이로 인하여 웹 페이지를 분석하는 능력을 키울수 있었다고 생각한다.

다음 프로젝트는 다른 웹 페이지들을 분석하여 좋은 웹 페이지를 만들 수 있을것이다. 

 

코드는 해당 링크에서 확인할 수 있다.

sonsunghwan94/sonsunghwan94 at EmartMall (github.com)

댓글