본문 바로가기
프로젝트/프라이스 히어로

[사이드 프로젝트] 프라이스 히어로 / 백엔드

by 손정빈 2020. 11. 4.
728x90
반응형

안녕하세요. 하나셋입니다.

 

어.. 우선은 이 프로젝트에는 몇가지 기술스택들이 들어갑니다.

 

1. Spring boot

2. JPA (mysql)

3. Cache (spring cache)

4. Elastic Search

5. Logstash

 

위와 같은 기술 스택을 사용하였습니다.

 

차근차근 하나씩 설명해보겠습니다.

 

우선 프로젝트 구조에 대한 설명부터 시작해보도록 하겠습니다.

(코드에 대해서는 따로 설명하지 않을게요 ㅎㅎ 혹시 궁금한 내용이 있으시면 댓글로 달아주시면 답변 드릴게요 ㅎ)

 

1. Spring boot & Java

우선 제가 구성한 프로젝트 방식은 멀티모듈 방식입니다.

위와 같이 구성한 이유는 간단하게 common을 통한 observer라는 batch 모듈과 provider이라는 API 모듈의 공통된 부분을 하나로 통일하여 작업하기 위함이였습니다.

 

보이시는 howmuch-common은 entity, repository를 관리하는 모듈로 따로 빼놓은 것입니다.

(저렇게 한 이유는... 엄청 크게 만들줄 알아서... 프로젝트 공통 레파지토리를 하나 딸려고 했던 저의 욕심이였습니다.. ㅎㅎ)

 

Batch 서버인 Observer는 이름과 마찬가지로 감시하는 역할, 즉 데이터 수집(크롤링)을 위한 모듈입니다.

1-1. 크롤링 서버

API 클라이언트의 겨우 저는 ... RestTemplate보다는 이상하게 Retrofit이 더 좋아서 Retrofit을 통해 구현하였습니다.

이렇게 수집한 데이터는 DataBase로 들어가게 됩니다.

 

그런데 여기서 문제점!!!

중고나라, 당근마켓, 번개장터의 하루 신규 게시글이 총합 100만건 정도 되는 수준이였습니다.

그렇다보니 db에 넣어서로는 이 수많은 게시글들을 검색하기에는 무리가 있다고 판단되어 

 

이 검색을 위한 부분을 위해 검색엔진인 elastic search을 기용하게 되었습니다.

 

사실 elastic search는 잘 모릅니다. 데이터 넣고 그에대한 검색 결과만 보기 위한 용도로 사용하거라 사실 자세한 사용법에 대해서 공부하지 못했습니다. (쓰기 위해 공부하는 타입이라... 필요한 부분까지만 그때 그때 공부합니다..하하하) 

 

또한 Database를 elastic search로 옮기기 위해 logstash를 사용하였습니다.

 

elastic search와 logstash에 대해서는 자세하게 다루지 않겠습니다. (저도 잘 몰라요.. 사용하기 위해서 공부했습니다... 죄송합니다..)

 

API 모듈인 provider로 넘어가보죠.

1-2. API 서버

 

provider에서 제공하고 잇는 API는 

 

1. 검색 API

2. 인기 검색어 API

 

이렇게 2가지 였습니다.

 

우선 좀더 간단한 내용인 인기 검색어 API의 경우 검색한 결과가 있을 경우 Database에 insert 또는 update Count + 1를 해주는 씩으로 기록하였습니다. 당연히 타임 Slot를 줘서 한시간을 기준으로 한 Row나눠었습니다.

그리고 지금 시간으로부터 24시간 전까지의 데이터를 기반으로 인기검색어를 계산하여 제공해주었습니다.

 

검색 API의 경우는 간단하게 생각을 하고 elastic search에 쿼리를 던져 받은 결과를 가지고 보여주고자 했습니다.

하지만 여기서 문제점이 비속어와 같은 필터링이 필요한 내용들이 있어서 필터링을 하는 기능을 추가하였구요.

 

그리고 데드페이지를 체크하기 위해 Response를 준 뒤에 Async로 데드 페이지를 체크하여 elastic search에서 제거하는 형식의 기능을 구현하였습니다.

 

마지막으로 평균가와 최고가, 최저가를 계산하여 제공하려고 했는데... 이 부분에 대해서 사실 검색하는 유저마다 모두 계산을 한다면 되게 비효율적인 상황이 연출될꺼라 생각이 들어 캐싱을 통한 30초 동안 검색한 결과를 동일하게 줘어 연산을 30초에 1번만 하면 될 수 있도록 구현하였습니다.

 

 

 

여기까지 정말 간단하게 프라이스 히어로의 서버 구현 방식이였습니다.

github.com/hanaset/Arybyung

 

hanaset/Arybyung

중고제품들에 대한 시세와 오더북을 제공해주는 웹사이트. Contribute to hanaset/Arybyung development by creating an account on GitHub.

github.com

위 레파지토리는 많이 업데이트 되지 못한 저의 공개용 레파지토리입니다.

 

현재 실제로 작동하고 있는 레파지토리는 따로 프라이빗으로 관리하고 있어서 조금 다를 수 있습니다.

 

또한 코드가 많이 깔끔하지 못한점 양해부탁드리구요. 

 

혹시 위 프로젝트 구현에 있어서 궁금하신 내용이 있다면 질문 주시면 최대한 성심 성의껏 대답해드리겠습니다.

 

감사합니다. 

 

반응형

댓글