{"id":19755151,"url":"https://github.com/hyunsoo730/capstone_fullstack","last_synced_at":"2025-04-30T11:32:33.087Z","repository":{"id":128886032,"uuid":"610094917","full_name":"HyunSoo730/Capstone_fullStack","owner":"HyunSoo730","description":" 🎈서울시 지역 상권 분석 및 추천 서비스","archived":false,"fork":false,"pushed_at":"2024-10-21T08:44:36.000Z","size":15704,"stargazers_count":4,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-10-21T12:09:27.071Z","etag":null,"topics":["querydsl-jpa","spring-data-jpa","springbatch","springboot"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HyunSoo730.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-03-06T04:29:54.000Z","updated_at":"2024-10-21T08:44:41.000Z","dependencies_parsed_at":"2024-08-11T18:48:43.711Z","dependency_job_id":null,"html_url":"https://github.com/HyunSoo730/Capstone_fullStack","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HyunSoo730%2FCapstone_fullStack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HyunSoo730%2FCapstone_fullStack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HyunSoo730%2FCapstone_fullStack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HyunSoo730%2FCapstone_fullStack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HyunSoo730","download_url":"https://codeload.github.com/HyunSoo730/Capstone_fullStack/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224208085,"owners_count":17273674,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["querydsl-jpa","spring-data-jpa","springbatch","springboot"],"created_at":"2024-11-12T03:09:03.722Z","updated_at":"2024-11-12T03:09:04.357Z","avatar_url":"https://github.com/HyunSoo730.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 창업스팟파인더 🏬\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg width=\"400\" alt=\"창업스팟파인더 이미지\" src=\"https://github.com/HyunSoo730/Capstone_fullStack/assets/102610889/1fa300d8-8d4b-497e-974d-e9308a677cf7\"\u003e\n\u003c/div\u003e\n\n# 창업스팟파인더 - 서울시 상권 분석 및 추천 서비스\n\u003e **서울시의 상권을 분석하고 추천하는 서비스로, 창업을 희망하는 사람들에게 최적의 창업 장소를 추천해주는 것을 목표로 합니다.**\u003cbr\u003e\n\u003e **개발기간: 2023.03 ~ 2023.06 (15주)**\n\n## 🚀 프로젝트 소개\n\n창업스팟파인더는 창업을 희망하는 사람들을 위해 서울시의 상권을 분석하고 추천하는 서비스입니다. 이 서비스는 다양한 상권 데이터를 기반으로 상권의 특성과 트렌드를 분석하여 최적의 창업 장소를 추천합니다. 사용자가 직접 원하는 우선순위를 선택할 수 있으며, 창업 입지에 가중치를 부여하여 가중치 기반으로 추천합니다. 주요 기능으로는 상권 분석, 가중치 기반 추천, 사용자 리뷰 관리 등이 포함됩니다.\n\n창업 입지 선정은 창업의 성패를 좌우하는 중요한 요소 중 하나입니다. 그러나 많은 창업자들이 정보 부족과 분석의 어려움으로 인해 최적의 입지를 선택하는 데 어려움을 겪고 있습니다. 창업스팟파인더는 이러한 문제를 해결하고자 서울시 상권 데이터를 분석 및 가공하여 창업자들에게 실질적인 도움을 제공하는 것을 목표로 합니다.\n\n창업스팟파인더는 사용자 친화적인 인터페이스를 통해 창업자들이 쉽게 상권 정보를 탐색하고 이해할 수 있도록 도와줍니다. 또한 사용자가 중요하게 생각하는 입지 조건을 바탕으로 맞춤형 창업 장소를 추천합니다. 이를 통해 본인들이 우선으로 생각하는 조건에 기반한 의사 결정을 내릴 수 있으며, 창업 성공 가능성을 높일 수 있습니다.\n\n## 🏆 수상\n\n- 🥇 **장려상** - 2023 서울시 열린데이터 경진대회\n  - 서울특별시가 주최하는 열린데이터 경진대회에서 장려상을 수상했습니다.\n- 🥇 **장려상** - 2023 제15회 세종대학교 창의설계경진대회 장려상\n  - 세종대학교에서 주최하는 창의설계경진대회에서 장려상을 수상했습니다. \n  \n\n## 🛠️ 기술 스택\n### Environment\n![Java](https://img.shields.io/badge/Java-007396?style=for-the-badge\u0026logo=java\u0026logoColor=white)\n![Spring Boot](https://img.shields.io/badge/Spring%20Boot-6DB33F?style=for-the-badge\u0026logo=springboot\u0026logoColor=white)\n![MySQL](https://img.shields.io/badge/MySQL-4479A1?style=for-the-badge\u0026logo=mysql\u0026logoColor=white)\n![React](https://img.shields.io/badge/React-61DAFB?style=for-the-badge\u0026logo=react\u0026logoColor=black)\n\n### Config\n![npm](https://img.shields.io/badge/npm-CB3837?style=for-the-badge\u0026logo=npm\u0026logoColor=white)\n![Gradle](https://img.shields.io/badge/Gradle-02303A?style=for-the-badge\u0026logo=gradle\u0026logoColor=white)\n\n### Development\n![JavaScript](https://img.shields.io/badge/JavaScript-F7DF1E?style=for-the-badge\u0026logo=javascript\u0026logoColor=black)\n![Spring Data JPA](https://img.shields.io/badge/Spring%20Data%20JPA-6DB33F?style=for-the-badge\u0026logo=spring\u0026logoColor=white)\n![MyBatis](https://img.shields.io/badge/MyBatis-000000?style=for-the-badge\u0026logo=mybatis\u0026logoColor=white)\n![QueryDSL](https://img.shields.io/badge/QueryDSL-0769AD?style=for-the-badge\u0026logo=QueryDSL\u0026logoColor=white)\n![Spring Batch](https://img.shields.io/badge/Spring%20Batch-6DB33F?style=for-the-badge\u0026logo=spring\u0026logoColor=white)\n![Spring Quartz](https://img.shields.io/badge/Spring%20Quartz-6DB33F?style=for-the-badge\u0026logo=spring\u0026logoColor=white)\n\n### DevOps\n![AWS EC2](https://img.shields.io/badge/AWS%20EC2-232F3E?style=for-the-badge\u0026logo=amazonec2\u0026logoColor=white)\n\n### Communication\n![Slack](https://img.shields.io/badge/Slack-4A154B?style=for-the-badge\u0026logo=slack\u0026logoColor=white)\n![Notion](https://img.shields.io/badge/Notion-000000?style=for-the-badge\u0026logo=notion\u0026logoColor=white)\n\n## 👥 팀 소개\n### 팀원\n|    조현수      |          배승진         |       이재혁         |       신주희         |                                                                                         \n| :------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |\n|   \u003cimg width=\"160px\" src=\"https://i.postimg.cc/d0G72ZM3/image.jpg\" /\u003e    |                      \u003cimg width=\"160px\" src=\"https://avatars.githubusercontent.com/u/50067697?v=4\" /\u003e    |                   \u003cimg width=\"160px\" src=\"https://avatars.githubusercontent.com/u/93297796?v=4\"/\u003e   |                   \u003cimg width=\"160px\" src=\"https://avatars.githubusercontent.com/u/85965862?v=4\"/\u003e   |\n|   [@hyunsoo](https://github.com/HyunSoo730)   |    [@Seung-jin](https://github.com/pip-izony)  | [@Jae-hyeok](https://github.com/JaeHyeokee)  | [@Ju-hee](https://github.com/juhee1224)  |\n| 백엔드 개발 | 프론트엔드 개발 | 프론트엔드 개발 | 백엔드 개발 |\n\n## 🙋‍♂️ 백엔드 개발자 역할 및 기여도\n| 이름 | 역할 및 기여도 |\n|------|--------------|\n| 조현수 | - 🚀 백엔드 개발 리드로서 프로젝트 아키텍처 설계 및 개발 총괄\u003cbr\u003e- 🎨 Spring Boot를 활용한 RESTful API 구현 및 문서화\u003cbr\u003e- ⚙️ Spring Batch를 활용한 데이터 수집 및 분석 배치 작업 구현\u003cbr\u003e- 💾 데이터베이스 성능 최적화 및 인덱싱 작업 수행\u003cbr\u003e- 🌐 배포 및 운영 환경 구축 및 관리|\n| 신주희 | - 🤝 유튜브 트렌드 관련 서버 개발 담당\u003cbr\u003e- 🌿 Spring Data JPA, QueryDSL을 활용한 데이터 액세스 로직 개발\u003cbr\u003e- 📊 상권 데이터 분석 알고리즘 설계 및 구현\u003cbr\u003e- 🧪 API 성능 테스트 및 최적화 작업 수행\u003cbr\u003e- 🎨 코드 리팩토링을 통한 유지보수성 개선|\n\n## 📊 ERD (Entity-Relationship Diagram)\n![ERD](https://i.postimg.cc/PJs1bWs9/ERD.png)\n\n프로젝트의 데이터베이스는 위와 같은 ERD를 기반으로 설계되었습니다. \n\n- `User` 테이블: 사용자 정보를 저장하는 테이블입니다. 사용자의 기본 정보와 함께 선호하는 창업 아이템, 예산 등의 정보를 관리합니다.\n- `Region` 테이블: 서울시의 각 구역 정보를 저장하는 테이블입니다. 구역별 상권 현황과 트렌드 정보를 포함합니다.\n- `Store` 테이블: 각 구역 내 점포 정보를 저장하는 테이블입니다. 점포의 업종, 매출, 개업/폐업 정보 등을 관리합니다.\n- `SalesData` 테이블: 각 점포의 매출 데이터를 저장하는 테이블입니다. 시계열 데이터로 구성되어 있으며, 상권 분석에 활용됩니다.\n- `Recommendation` 테이블: 사용자에게 추천된 창업 장소 정보를 저장하는 테이블입니다. 사용자의 선호도와 상권 분석 결과를 바탕으로 생성됩니다.\n\n\n\n## 📅 개발 기간\n- 2023.03 ~ 2023.06 (15주)\n\n## 🎯 주요 기능\n\n### 상권 데이터 분석\n- 서울시 열린데이터 광장에서 제공하는 상권 데이터를 수집하여 데이터베이스에 저장합니다.\n- 수집된 데이터를 바탕으로 각 구역의 상권 현황과 트렌드를 분석합니다.\n- 업종별, 시기별 매출 추이를 시각화하여 차트로 사용자에게 제공합니다.\n\n### 창업 지역 추천\n- 사용자로부터 창업 아이템, 예산, 선호 조건 등을 입력받습니다.\n- 입력된 정보를 바탕으로 상권 분석 결과와 매칭하여 최적의 창업 장소를 추천합니다.\n- 추천 결과는 지도에 표시되며, 각 추천 장소의 상세 정보를 제공합니다.\n\n### 사용자 리뷰 관리\n- 사용자는 추천받은 창업 장소에 대한 리뷰를 작성할 수 있습니다.\n- 리뷰는 다른 사용자들과 공유되어 창업 의사 결정에 도움을 줍니다.\n\n## 📺 화면 구성\n\n| 메인 페이지 | 상권 분석 |\n| :-------------------------------------------: | :-------------------------------------------: |\n| \u003cimg width=\"400\" alt=\"메인 페이지\" src=\"https://i.postimg.cc/m2Q26fXp/Youtrend.png\"/\u003e | \u003cimg width=\"400\" alt=\"상권 분석\" src=\"https://i.postimg.cc/vZh8b7dW/Youtrend.png\"/\u003e |\n| 사용자는 메인 페이지에서 서울시 지도를 통해 각 구역의 상권 현황을 한 눈에 파악할 수 있습니다. 간단한 검색을 통해 원하는 지역의 정보를 빠르게 확인할 수 있습니다. | 상권 분석 페이지에서는 선택한 구역의 상권 트렌드와 점포 현황 등을 시각화된 자료로 제공합니다. 사용자는 업종별, 시기별 매출 추이를 그래프로 확인하고, 상권의 특징을 파악할 수 있습니다. |\n\n| 유튜브 트렌드 분석 |\n| :-------------------------------------------: |\n| \u003cimg width=\"400\" alt=\"유튜브 트렌드 분석\" src=\"https://i.postimg.cc/rpY8t8ss/Youtrend.png\"/\u003e |\n| 유튜브 트렌드 분석 페이지에서는 선택한 구역의 유튜브 트렌드를 파악할 수 있습니다. 인기 있는 유튜브 채널과 동영상을 확인하고, 해당 지역의 관심사를 분석할 수 있습니다. |\n\n## 🎉 프로젝트 결과 및 성과\n- 🏬 서울시의 방대한 상권 데이터를 배치 프로세싱 자동화 구축을 통해 효과적으로 분석 및 가공하여 창업자들에게 실질적인 인사이트를 제공하였습니다.\n- 📊 사용자 친화적인 인터페이스와 직관적인 시각화를 통해 창업자들이 상권 정보를 쉽게 이해하고 활용할 수 있도록 하였습니다.\n- 🎯 사용자의 요구사항을 반영하여 가중치 기반 맞춤형 창업 장소 추천으로 창업자들의 만족도를 높였습니다.\n- 🌐 Spring Boot와 JPA, QueryDSL을 활용하여 안정적이고 효율적인 RESTful API 서버를 구축하였습니다.\n- JPA를 도입하여 객체-관계 매핑(ORM)을 통해 데이터베이스 작업을 편리하게 수행하였습니다.\n- QueryDSL을 활용하여 동적 쿼리를 생성하고 실행함으로써 복잡한 검색 조건을 유연하게 처리하였습니다.\n- 🗄️ 대량의 데이터를 효과적으로 관리하기 위해 데이터베이스 인덱싱과 쿼리 최적화를 진행하여 검색 및 조회 속도를 개선하였습니다.\n- ⏰ Spring Batch와 Quartz를 활용해 상권 데이터 수집 및 분석 배치 작업을 자동화하여 운영 효율성을 높였습니다.\n- ✅ JUnit5를 활용한 단위 테스트를 지속적으로 작성하고 수행하여 서비스의 안정성을 확보하였습니다.\n\n## 🔧 개선 사항 및 추후 계획\n- 🙌 사용자들의 피드백을 적극 수렴하여 서비스 사용성과 편의성을 지속적으로 개선해 나갈 예정입니다.\n- 예) 사용자의 창업 아이템 및 예산 등 추가 정보를 고려하여 더욱 정교한 추천 서비스 제공\n- 🔍 상권 데이터 외에도 더 다양한 데이터(유동 인구 통계, 소비 트렌드 등)를 활용하여 분석의 질을 높이고자 합니다.\n- 📈 서비스 모니터링 및 로깅 체계를 강화하여 잠재적인 문제를 사전에 감지하고 신속하게 대응할 수 있도록 할 예정입니다.\n- 🚀 배치 작업의 성능을 향상시키기 위해 분산 처리 프레임워크(예: Apache Spark)를 도입하는 방안을 검토하고 있습니다.\n\n## 🚨 트러블슈팅 가이드\n### 데이터 수집 배치 작업 실패\n- 증상: 외부 API를 통해 상권 데이터를 수집하는 배치 작업이 간헐적으로 실패하는 문제가 발생하였습니다.\n- 원인: 외부 API의 응답 지연 또는 일시적인 네트워크 불안정으로 인해 데이터 수집 작업이 실패하는 것으로 파악되었습니다.\n- 해결: Spring Batch의 재시도 기능을 활용하여 실패한 작업을 일정 간격으로 자동 재시도하도록 설정하였습니다. 또한, 외부 API 호출 시 적절한 타임아웃을 설정하고, 예외 처리를 강화하여 안정성을 높였습니다.\n\n### 대용량 데이터 처리 시 성능 저하\n- 증상: 상권 분석 작업 시 대용량 데이터를 처리할 때 성능 저하 및 응답 지연이 발생하였습니다.\n- 원인: 데이터베이스에서 대량의 데이터를 한 번에 로딩하고 처리하는 과정에서 자바 메모리 용량이 제한에 도달해 발생했습니다.\n- 해결: 페이징(Paging) 방식을 적용하여 데이터를 작은 단위로 나누어 처리하였습니다. 또한, JPA의 지연 로딩(Lazy Loading) 전략을 사용하여 필요한 데이터만 로딩하도록 최적화하였습니다. 이를 통해 메모리 사용량을 줄이고 성능을 개선할 수 있었습니다.\n\n### Querydsl 동적 쿼리 생성 시 에러 발생\n- 증상: Querydsl을 사용하여 동적으로 쿼리를 생성하는 과정에서 컴파일 에러가 발생하는 문제가 있었습니다. \n- 원인: Q-class 생성이 제대로 이루어지지 않아 Querydsl에서 필요로 하는 클래스와 메서드를 찾을 수 없었기 때문이었습니다.\n- 해결: 프로젝트의 빌드 설정을 확인하고, APT(Annotation Processing Tool) 프로세서를 올바르게 설정하여 Q-class가 자동으로 생성되도록 하였습니다. 또한, Querydsl 버전과 호환되는 의존성을 사용하고 있는지 확인하고 필요한 경우 버전을 맞추어 주었습니다.\n\n이러한 트러블슈팅 경험을 바탕으로 서비스의 안정성과 성능을 지속적으로 개선해 나갈 수 있었습니다. 앞으로도 모니터링과 피드백을 통해 발생할 수 있는 문제를 사전에 방지하고, 창업스팟파인더가 창업자들에게 더욱 유용한 서비스로 자리매김할 수 있도록 노력하겠습니다.\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhyunsoo730%2Fcapstone_fullstack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhyunsoo730%2Fcapstone_fullstack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhyunsoo730%2Fcapstone_fullstack/lists"}