장소의 찐 리스트를 공유하며 신뢰할 수 있는 추천으로 나만의 지도를 완성하는 앱 서비스
‘Spoony’ 는 리뷰 작성자의 신뢰도와 영향력에 기반해, 유저가 믿을 수 있는 장소 정보를 탐색하고 공유하며 나만의 찐 리스트 지도를 만들어가는 앱 서비스입니다.
🌟Spoony와 함께 새로운 장소를 발견하고 나만의 지도를 완성해보세요!🌟
🥄 Spoony 만의 특별한 사용법
1️⃣ 장소 등록하고 수저 획득하기
나만 알고 싶은 맛집, 아늑한 카페, 분위기 좋은 펍 등 찐 장소를 등록하고 수저를 획득하세요!
2️⃣신뢰도 높은 찐 리스트 떠먹기
획득한 수저로 다른 사람의 찐 리스트를 떠먹어 보세요! 원하는 유저를 팔로우하고 로컬 사용자와 지역별 랭킹을 통해 신뢰도 높은 리뷰를 확인해보세요.
3️⃣ 나만의 지도 완성하기
떠먹은 리스트 중 마음에 드는 장소를 추가해 나만의 찐 리스트 지도를 만들어보세요!
👑박효빈 (@Hyobeen-Park) |
한민재 (@angryPodo) |
안세홍 (@Roel4990) |
박동민 (@chattymin) |
---|---|---|---|
메인 지도 탐색하기 |
장소 등록하기 |
장소 상세 페이지 신고하기 |
멘토 |
뷰 | 1 | 2 | 3 |
---|---|---|---|
메인 지도 탐색하기 |
|||
장소 등록하기 | |||
장소 상세페이지 신고하기 |
📦spoony
┣ 📂core
┃ ┣ 📂database
┃ ┃ ┣ 📂di
┃ ┃ ┣ 📂entity
┃ ┣ 📂designsystem
┃ ┃ ┣ 📂component
┃ ┃ ┃ ┣ 📂bottomsheet
┃ ┃ ┃ ┣ 📂button
┃ ┃ ┃ ┣ 📂chip
┃ ┃ ┃ ┣ 📂dialog
┃ ┃ ┃ ┣ 📂image
┃ ┃ ┃ ┣ 📂snackbar
┃ ┃ ┃ ┣ 📂tag
┃ ┃ ┃ ┣ 📂textfield
┃ ┃ ┃ ┗ 📂topappbar
┃ ┃ ┣ 📂event
┃ ┃ ┣ 📂theme
┃ ┃ ┗ 📂type
┃ ┣ 📂navigation
┃ ┣ 📂state
┃ ┗ 📂util
┃ ┃ ┗ 📂extension
┣ 📂data
┃ ┣ 📂datasource
┃ ┣ 📂datasourceimpl
┃ ┣ 📂di
┃ ┣ 📂dto
┃ ┃ ┣ 📂base
┃ ┃ ┣ 📂request
┃ ┃ ┗ 📂response
┃ ┣ 📂mapper
┃ ┣ 📂repositoryimpl
┃ ┗ 📂service
┣ 📂domain
┃ ┣ 📂entity
┃ ┗ 📂repository
┗ 📂presentation
┃ ┣ 📂explore
┃ ┃ ┣ 📂component
┃ ┃ ┃ ┗ 📂bottomsheet
┃ ┃ ┣ 📂model
┃ ┃ ┣ 📂navigation
┃ ┃ ┗ 📂type
┃ ┣ 📂main
┃ ┃ ┗ 📂component
┃ ┣ 📂map
┃ ┃ ┣ 📂component
┃ ┃ ┃ ┗ 📂bottomsheet
┃ ┃ ┣ 📂model
┃ ┃ ┣ 📂navigaion
┃ ┃ ┗ 📂search
┃ ┃ ┃ ┣ 📂component
┃ ┃ ┃ ┗ 📂navigation
┃ ┣ 📂placeDetail
┃ ┃ ┣ 📂component
┃ ┃ ┣ 📂model
┃ ┃ ┣ 📂navigation
┃ ┃ ┗ 📂type
┃ ┣ 📂register
┃ ┃ ┣ 📂component
┃ ┃ ┣ 📂model
┃ ┃ ┗ 📂navigation
┃ ┣ 📂report
┃ ┃ ┣ 📂component
┃ ┃ ┣ 📂navigation
┃ ┃ ┗ 📂type
┃ ┗ 📂splash
Title | Content |
---|---|
Architecture | Clean Architecture, MVVM |
Module | SingleModule |
UI Framework | Jetpack Compose |
Dependency Injection | Hilt |
Network | Retrofit2, OkHttp |
Asynchronous Processing | Coroutine, Flow |
Third Party Library | Coil, Timber, Lottie, Naver Map |
Other Tools | Discode, Notion, Figma, Slack |
🛠 Tech Stack 소개
1️⃣ Architecture: Clean Architecture, MVVM
비즈니스 로직과 UI를 명확히 분리하고, 각 계층 간 의존성을 최소화했습니다. 코드의 재사용성을 높이고 유지보수가 용이하며, 특히 테스트 용이성이 크게 향상됩니다.
2️⃣ Dependency Injection: Hilt
구글이 공식 지원하는 Hilt로 보일러플레이트 코드를 최소화하면서도 강력한 DI 기능을 제공합니다. Android 컴포넌트들과의 완벽한 통합으로 테스트 가능한 코드베이스를 구축했습니다.
3️⃣ Network: Retrofit2, OkHttp
Retrofit2의 선언적 API 정의와 OkHttp의 강력한 인터셉터 기능으로 안정적이고 효율적인 네트워크 계층을 구현했습니다.
4️⃣ Other Tools
- GitHub: 코드 리뷰
- Notion: 체계적인 프로젝트 문서화
- Figma: UI/UX 디자인 협업
- Slack: 빠른 팀 소통 및 개발 알림 통합
📦spoony
┣ 📂core
┃ ┣ 📂database
┃ ┃ ┣ 📂di
┃ ┃ ┃ ┗ 📜DatabaseModule.kt
┃ ┃ ┣ 📂entity
┃ ┃ ┃ ┗ 📜SearchEntity.kt
┃ ┃ ┣ 📜SearchDao.kt
┃ ┃ ┗ 📜SearchDatabase.kt
┃ ┣ 📂designsystem
┃ ┃ ┣ 📂component
┃ ┃ ┃ ┣ 📂bottomsheet
┃ ┃ ┃ ┃ ┣ 📜SpoonyAdvancedBottomSheet.kt
┃ ┃ ┃ ┃ ┣ 📜SpoonyBasicBottomSheet.kt
┃ ┃ ┃ ┃ ┗ 📜SpoonyBasicDragHandle.kt
┃ ┃ ┃ ┣ 📂button
┃ ┃ ┃ ┃ ┗ 📜SpoonyButton.kt
┃ ┃ ┃ ┣ 📂chip
┃ ┃ ┃ ┃ ┗ 📜IconChip.kt
┃ ┃ ┃ ┣ 📂dialog
┃ ┃ ┃ ┃ ┣ 📜SingleButtonDialog.kt
┃ ┃ ┃ ┃ ┣ 📜SpoonyBasicDialog.kt
┃ ┃ ┃ ┃ ┗ 📜TwoButtonDialog.kt
┃ ┃ ┃ ┣ 📂image
┃ ┃ ┃ ┃ ┗ 📜SpoonyImage.kt
┃ ┃ ┃ ┣ 📂snackbar
┃ ┃ ┃ ┃ ┣ 📜BasicSnackbar.kt
┃ ┃ ┃ ┃ ┗ 📜TextSnackbar.kt
┃ ┃ ┃ ┣ 📂tag
┃ ┃ ┃ ┃ ┣ 📜IconTag.kt
┃ ┃ ┃ ┃ ┗ 📜LogoTag.kt
┃ ┃ ┃ ┣ 📂textfield
┃ ┃ ┃ ┃ ┣ 📜SpoonyBasicTextField.kt
┃ ┃ ┃ ┃ ┣ 📜SpoonyIconButtonTextField.kt
┃ ┃ ┃ ┃ ┣ 📜SpoonyLargeTextField.kt
┃ ┃ ┃ ┃ ┣ 📜SpoonyLineTextField.kt
┃ ┃ ┃ ┃ ┗ 📜SpoonySearchTextField.kt
┃ ┃ ┃ ┗ 📂topappbar
┃ ┃ ┃ ┃ ┣ 📜CloseTopAppBar.kt
┃ ┃ ┃ ┃ ┣ 📜SpoonyBasicTopAppBar.kt
┃ ┃ ┃ ┃ ┣ 📜TagTopAppBar.kt
┃ ┃ ┃ ┃ ┗ 📜TitleTopAppBar.kt
┃ ┃ ┣ 📂event
┃ ┃ ┃ ┗ 📜SnackbarTrigger.kt
┃ ┃ ┣ 📂theme
┃ ┃ ┃ ┣ 📜Color.kt
┃ ┃ ┃ ┣ 📜Theme.kt
┃ ┃ ┃ ┗ 📜Type.kt
┃ ┃ ┗ 📂type
┃ ┃ ┃ ┣ 📜AdvancedSheetState.kt
┃ ┃ ┃ ┣ 📜ButtonStyles.kt
┃ ┃ ┃ ┣ 📜ChipColor.kt
┃ ┃ ┃ ┗ 📜TagSize.kt
┃ ┣ 📂navigation
┃ ┃ ┣ 📜MainTabRoute.kt
┃ ┃ ┗ 📜Route.kt
┃ ┣ 📂state
┃ ┃ ┗ 📜UiState.kt
┃ ┗ 📂util
┃ ┃ ┣ 📂extension
┃ ┃ ┃ ┣ 📜ColorExt.kt
┃ ┃ ┃ ┣ 📜ModifierExt.kt
┃ ┃ ┃ ┗ 📜StringExt.kt
┃ ┃ ┗ 📜UserId.kt
┣ 📂data
┃ ┣ 📂datasource
┃ ┃ ┣ 📜AuthRemoteDataSource.kt
┃ ┃ ┣ 📜CategoryDataSource.kt
┃ ┃ ┣ 📜ExploreRemoteDataSource.kt
┃ ┃ ┣ 📜MapRemoteDataSource.kt
┃ ┃ ┣ 📜PlaceDataSource.kt
┃ ┃ ┣ 📜PostRemoteDataSource.kt
┃ ┃ ┗ 📜ReportDataSource.kt
┃ ┣ 📂datasourceimpl
┃ ┃ ┣ 📜AuthRemoteDataSourceImpl.kt
┃ ┃ ┣ 📜CategoryDataSourceImpl.kt
┃ ┃ ┣ 📜ExploreRemoteDataSourceImpl.kt
┃ ┃ ┣ 📜MapRemoteDataSourceImpl.kt
┃ ┃ ┣ 📜PlaceDataSourceImpl.kt
┃ ┃ ┣ 📜PostRemoteDataSourceImpl.kt
┃ ┃ ┗ 📜ReportDataSourceImpl.kt
┃ ┣ 📂di
┃ ┃ ┣ 📜DataSourceModule.kt
┃ ┃ ┣ 📜RepositoryModule.kt
┃ ┃ ┣ 📜RetrofitModule.kt
┃ ┃ ┗ 📜ServiceModule.kt
┃ ┣ 📂dto
┃ ┃ ┣ 📂base
┃ ┃ ┃ ┗ 📜BaseResponse.kt
┃ ┃ ┣ 📂request
┃ ┃ ┃ ┣ 📜AddMapRequestDto.kt
┃ ┃ ┃ ┣ 📜PlaceCheckRequestDto.kt
┃ ┃ ┃ ┣ 📜PostScoopRequestDto.kt
┃ ┃ ┃ ┣ 📜RegisterPostRequestDto.kt
┃ ┃ ┃ ┗ 📜ReportPostRequestDto.kt
┃ ┃ ┗ 📂response
┃ ┃ ┃ ┣ 📜AddedMapListResponseDto.kt
┃ ┃ ┃ ┣ 📜AddedMapPostListDto.kt
┃ ┃ ┃ ┣ 📜CategoryResponseDto.kt
┃ ┃ ┃ ┣ 📜FeedsResponseDto.kt
┃ ┃ ┃ ┣ 📜GetPostResponseDto.kt
┃ ┃ ┃ ┣ 📜LocationListResponseDto.kt
┃ ┃ ┃ ┣ 📜PlaceCheckResponseDto.kt
┃ ┃ ┃ ┣ 📜PlaceResponseDto.kt
┃ ┃ ┃ ┣ 📜UserInfoResponseDto.kt
┃ ┃ ┃ ┣ 📜UserSpoonCountResponseDto.kt
┃ ┃ ┃ ┗ 📜ZzimLocationResponseDto.kt
┃ ┣ 📂mapper
┃ ┃ ┣ 📜AddedMapMapper.kt
┃ ┃ ┣ 📜AddedMapPostMapper.kt
┃ ┃ ┣ 📜CategoryMapper.kt
┃ ┃ ┣ 📜FeedsMapper.kt
┃ ┃ ┣ 📜GetPostResponseMapper.kt
┃ ┃ ┣ 📜LocationMapper.kt
┃ ┃ ┣ 📜PlaceMapper.kt
┃ ┃ ┣ 📜UserInfoMapper.kt
┃ ┃ ┗ 📜ZzimLocaitonMapper.kt
┃ ┣ 📂repositoryimpl
┃ ┃ ┣ 📜AuthRepositoryImpl.kt
┃ ┃ ┣ 📜CategoryRepositoryImpl.kt
┃ ┃ ┣ 📜ContentUriRequestBody.kt
┃ ┃ ┣ 📜ExploreRepositoryImpl.kt
┃ ┃ ┣ 📜MapRepositoryImpl.kt
┃ ┃ ┣ 📜PostRepositoryImpl.kt
┃ ┃ ┣ 📜RegisterRepositoryImpl.kt
┃ ┃ ┗ 📜ReportRepositoryImpl.kt
┃ ┗ 📂service
┃ ┃ ┣ 📜AuthService.kt
┃ ┃ ┣ 📜CategoryService.kt
┃ ┃ ┣ 📜ExploreService.kt
┃ ┃ ┣ 📜MapService.kt
┃ ┃ ┣ 📜PlaceService.kt
┃ ┃ ┣ 📜PostService.kt
┃ ┃ ┗ 📜ReportService.kt
┣ 📂domain
┃ ┣ 📂entity
┃ ┃ ┣ 📜AddedMapPostEntity.kt
┃ ┃ ┣ 📜AddedPlaceEntity.kt
┃ ┃ ┣ 📜CategoryEntity.kt
┃ ┃ ┣ 📜FeedEntity.kt
┃ ┃ ┣ 📜LocationEntity.kt
┃ ┃ ┣ 📜PlaceEntity.kt
┃ ┃ ┣ 📜PostEntity.kt
┃ ┃ ┣ 📜RegisterEntity.kt
┃ ┃ ┗ 📜UserEntity.kt
┃ ┗ 📂repository
┃ ┃ ┣ 📜AuthRepository.kt
┃ ┃ ┣ 📜CategoryRepository.kt
┃ ┃ ┣ 📜ExploreRepository.kt
┃ ┃ ┣ 📜MapRepository.kt
┃ ┃ ┣ 📜PostRepository.kt
┃ ┃ ┣ 📜RegisterRepository.kt
┃ ┃ ┗ 📜ReportRepository.kt
┣ 📂presentation
┃ ┣ 📂explore
┃ ┃ ┣ 📂component
┃ ┃ ┃ ┣ 📂bottomsheet
┃ ┃ ┃ ┃ ┣ 📜ExploreLocationBottomSheet.kt
┃ ┃ ┃ ┃ ┣ 📜ExploreLocationDragHandle.kt
┃ ┃ ┃ ┃ ┗ 📜ExploreSortingBottomSheet.kt
┃ ┃ ┃ ┣ 📜ExploreEmptyScreen.kt
┃ ┃ ┃ ┣ 📜ExploreItem.kt
┃ ┃ ┃ ┗ 📜ExploreTopAppBar.kt
┃ ┃ ┣ 📂model
┃ ┃ ┃ ┗ 📜FeedModel.kt
┃ ┃ ┣ 📂navigation
┃ ┃ ┃ ┗ 📜ExploreNavigation.kt
┃ ┃ ┣ 📂type
┃ ┃ ┃ ┗ 📜SortingOption.kt
┃ ┃ ┣ 📜ExploreScreen.kt
┃ ┃ ┣ 📜ExploreState.kt
┃ ┃ ┗ 📜ExploreViewModel.kt
┃ ┣ 📂main
┃ ┃ ┣ 📂component
┃ ┃ ┃ ┗ 📜MainBottomBar.kt
┃ ┃ ┣ 📜MainNavigator.kt
┃ ┃ ┣ 📜MainScreen.kt
┃ ┃ ┗ 📜MainTab.kt
┃ ┣ 📂map
┃ ┃ ┣ 📂component
┃ ┃ ┃ ┣ 📂bottomsheet
┃ ┃ ┃ ┃ ┣ 📜MapBottomSheetDragHandle.kt
┃ ┃ ┃ ┃ ┣ 📜MapEmptyScreen.kt
┃ ┃ ┃ ┃ ┗ 📜MapListItem.kt
┃ ┃ ┃ ┗ 📜MapPlaceDetailCard.kt
┃ ┃ ┣ 📂model
┃ ┃ ┃ ┗ 📜LocationModel.kt
┃ ┃ ┣ 📂navigaion
┃ ┃ ┃ ┗ 📜MapNavigation.kt
┃ ┃ ┣ 📂search
┃ ┃ ┃ ┣ 📂component
┃ ┃ ┃ ┃ ┣ 📜MapSearchEmptyResultScreen.kt
┃ ┃ ┃ ┃ ┣ 📜MapSearchRecentEmptyScreen.kt
┃ ┃ ┃ ┃ ┣ 📜MapSearchRecentItem.kt
┃ ┃ ┃ ┃ ┣ 📜MapSearchResultItem.kt
┃ ┃ ┃ ┃ ┗ 📜MapSearchTopAppBar.kt
┃ ┃ ┃ ┣ 📂navigation
┃ ┃ ┃ ┃ ┗ 📜MapSearchNavigation.kt
┃ ┃ ┃ ┣ 📜MapSearchScreen.kt
┃ ┃ ┃ ┣ 📜MapSearchState.kt
┃ ┃ ┃ ┗ 📜MapSearchViewModel.kt
┃ ┃ ┣ 📜MapScreen.kt
┃ ┃ ┣ 📜MapState.kt
┃ ┃ ┗ 📜MapViewModel.kt
┃ ┣ 📂placeDetail
┃ ┃ ┣ 📂component
┃ ┃ ┃ ┣ 📜IconDropdownMenu.kt
┃ ┃ ┃ ┣ 📜PlaceDetailBottomBar.kt
┃ ┃ ┃ ┣ 📜PlaceDetailIconText.kt
┃ ┃ ┃ ┣ 📜PlaceDetailImageLazyRow.kt
┃ ┃ ┃ ┣ 📜ScoopDialog.kt
┃ ┃ ┃ ┣ 📜StoreInfo.kt
┃ ┃ ┃ ┣ 📜StoreInfoItem.kt
┃ ┃ ┃ ┗ 📜UserProfileInfo.kt
┃ ┃ ┣ 📂model
┃ ┃ ┃ ┗ 📜PostModel.kt
┃ ┃ ┣ 📂navigation
┃ ┃ ┃ ┗ 📜PlaceDetailNavigation.kt
┃ ┃ ┣ 📂type
┃ ┃ ┃ ┗ 📜DropdownOption.kt
┃ ┃ ┣ 📜PlaceDetailRoute.kt
┃ ┃ ┣ 📜PlaceDetailSideEffect.kt
┃ ┃ ┣ 📜PlaceDetailState.kt
┃ ┃ ┗ 📜PlaceDetailViewModel.kt
┃ ┣ 📂register
┃ ┃ ┣ 📂component
┃ ┃ ┃ ┣ 📜AddMenuButtton.kt
┃ ┃ ┃ ┣ 📜CustomDropDownMenu.kt
┃ ┃ ┃ ┣ 📜NextButton.kt
┃ ┃ ┃ ┣ 📜PhotoPicker.kt
┃ ┃ ┃ ┣ 📜RegisterTooltip.kt
┃ ┃ ┃ ┣ 📜SearchResultItem.kt
┃ ┃ ┃ ┗ 📜TopLinearProgressBar.kt
┃ ┃ ┣ 📂model
┃ ┃ ┃ ┣ 📜Category.kt
┃ ┃ ┃ ┗ 📜Place.kt
┃ ┃ ┣ 📂navigation
┃ ┃ ┃ ┣ 📜RegisterNavigation.kt
┃ ┃ ┃ ┗ 📜RegisterRoute.kt
┃ ┃ ┣ 📜RegisterScreen.kt
┃ ┃ ┣ 📜RegisterState.kt
┃ ┃ ┣ 📜RegisterStepOneScreen.kt
┃ ┃ ┣ 📜RegisterStepTwoScreen.kt
┃ ┃ ┗ 📜RegisterViewModel.kt
┃ ┣ 📂report
┃ ┃ ┣ 📂component
┃ ┃ ┃ ┣ 📜ReportCompleteDialog.kt
┃ ┃ ┃ ┗ 📜ReportRadioButton.kt
┃ ┃ ┣ 📂navigation
┃ ┃ ┃ ┗ 📜ReportNavigation.kt
┃ ┃ ┣ 📂type
┃ ┃ ┃ ┗ 📜ReportOption.kt
┃ ┃ ┣ 📜ReportRoute.kt
┃ ┃ ┣ 📜ReportSideEffect.kt
┃ ┃ ┣ 📜ReportState.kt
┃ ┃ ┗ 📜ReportViewModel.kt
┃ ┣ 📂splash
┃ ┃ ┗ 📜SplashActivity.kt
┃ ┗ 📜MainActivity.kt
┗ 📜Spoony.kt
카테고리 | 문서 링크 |
---|---|
Convention | • 안드푼스들의 깃 컨벤션 • 안드푼스들의 코딩 컨벤션 |
작업 트래킹 | • 스푸니 역할 분담 |
프로젝트 설계 | • 스푸니 프로젝트 설계 |