-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
모범 음식점 가게 데이터 추가 로직 구현 (#16) #18
Conversation
src/main/java/com/nainga/nainga/domain/store/application/GoogleMapStoreService.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
수고많으셨습니다. 워낙 내용이 많다보니 질문할게 많이 생기네요!
가게 업데이트시 엑셀파일을 잘라서 부분적으로 반복해서 업데이트 하는건가요? 여기 코드에서는 mobeom_test1000.xlsx 으로 일단 1000개만 수행하신것 같아서 여쭤봅니다.
업데이트 방법은 스케줄러를 사용할 계획이신가요? 정기적으로 어떤 방식으로 업데이트하실지 궁금합니다.
가게이미지는 클라우드에 저장할계획인가요? 스프링부트 서버에 저장하면 용량이커서 서버에 못올릴 수 도 있어서 여쭤봅니다.
@jinhoon227 가게 데이터 업데이트 관련되어서는, 지금 현재 가게 엑셀 파일을 그대로 업데이트 시키려고하면 대략 단순 계산시 반나절 정도의 시간이 걸립니다. 그래서 이걸 간단하게 구현한다면, 작은 시간 단위의 테스크로 쪼개서 배치잡을 돌려놓는 방법이 있고 아니면, 비동기 병렬 처리로 성능 개선을 통해 시간을 줄일 수 있을텐데 지금까지 생각중인 방안은 1차 배포까지는 테스크를 쪼개서 일단 서비스할 수 있게 데이터를 내재화시켜놓고 그 이후에 리펙토링 통해서 병렬 처리로 성능 개선 진행시켜볼까합니다. 맞습니다. 가게 이미지는 Cloud storage에 저장할 계획이고 DB쪽에서는 Cloud sotrage에 이미지 path만 가지고 있을 계획입니다. 그 후 이미지 처리 성능 개선을 한다면 CDN을 태워서 좀 더 빠르게 클라이언트에게 제공해줄 수도 있을 것 같습니다. 혹시 또 궁금하신 점 있으시면 편하게 피드백 부탁드립니다~~ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
설명감사합니다! 승인합니다!
⭐️ Issue Number
🚩 Summary
모범 음식점에 대한 데이터 파일을 읽어들여 적절하게 파싱한 뒤 Google Map의 Place ID를 조회하고 조회한 Place ID를 기반으로 Google Map API에서 가게 상세 정보를 가져옵니다. 이렇게 가져온 상세 정보를 바탕으로 Store Entity와 Certification Entity에 추가해줍니다.
그리고 StoreCertification 엔티티에도 업데이트 해주어 연관 관계를 매핑해줍니다.
🛠️ Technical Concerns
Apache POI를 통한 Excel dataset parsing
Apache POI를 통해 Java 순수 코드로 Excel dataset 파일 parsing을 구현하였습니다. 그 과정에서 Excel의 Empty cell, Blank cell 관련해서 큰 이슈가 있었습니다. POI로 파일을 읽어오는 과정에서 Empty, Blank cell을 구분하려면 여러 번의 꼼꼼한 예외처리가 필요했습니다. 이에 대한 배경지식이 없던 저는, 오랜 시간을 들여 결국 원인을 찾아내어 해결하였습니다. 해결 방법은 null, empty string, blank cell 이 세가지 조건을 모두 걸러주면 해결됩니다. 이 로직은 isCellEmpty() 메서드로 따로 추출하여 구현해놨습니다.
또한, 위 이슈를 해결하면서 배운 점들을 제 블로그에 기록해놓았습니다. https://sungjindev.github.io/posts/java-excel-data-parsing/
대용량 데이터 셋에 대한 성능 및 비용 이슈
저희가 1차 배포 전에 파싱해야되는 가게 데이터들을 집계해봤을 때 약 13만개 정도 됩니다. 약 13만개의 가게에 대해 상세 가게정보부터 가게별 약 10장의 이미지 등을 모두 처리해야합니다. 이를 처리하다보니 굉장히 오랜 시간이 걸리는 것을 확인하고 이를 멀티 프로세싱하여 시간을 단축시킬 계획입니다. 이는 굉장히 필요에 의한 성능 개선인데, 현재 외부 API(Google Map API)에 의존하는 기능들이 많아 서비스하기 어려울 정도의 속도를 보이고 있습니다.
그리고 이외에도 비용적인 문제가 있습니다. Google Map API에 1 가게당 보내는 API 콜이 약 2~3회이며 이는 비용적으로 1 가게당 최대 0.09달러입니다. 이를 약 13만개의 가게에 대해 처리하게 되면, 한화로 약 1500만원의 비용이듭니다. 그래서, 이 부분에 대해서는 API call 비용이 비싼 사진 요청에 대한 call 수를 적절히 제한시키려고 합니다.
또한, 원래 주기적으로 가게 정보를 업데이트 시키고자 했으나, 업데이트의 주기를 최대한 늘리고 한번 Google Map으로부터 얻어온 데이터는 데이터베이스에 철저히 백업하여 계속 활용할 수 있도록 외부에 의존적인 로직을 내부 서비스로 모두 전환시킬 계획입니다. 그리고, 무의미한 중복 API call을 줄이기 위해 한번 Google Map으로부터 얻어온 가게 데이터가 있는 곳은 추가적인 중복 Call을 할 수 없도록 구현해놓았습니다.
📋 To Do