흩어져 있는 팝업스토어 정보를 제공하고 인스타그램 연동으로 부가 기능을 제공하는 서비스
- 프로젝트 멤버 소개
- 서비스 소개
- 기술 스택
- 시스템 아키텍처
- 주요 기능
- 협업 관리
- 프로젝트 기간
- 프로젝트 관련 문서
|
|
|
|
|
|
|
|
🙂 김채연 (기획) |
🙂 이재은 (디자이너) |
🙂 이동준 (iOS) |
🙂 서준영 (iOS) |
🙂 김기현 (iOS) |
🙂 윤재성 (backend) |
-
팝업스토어 시장 규모 확대 및 소비자 관심 증대
-
높은 팝업스토어 방문 경험
75.6% 팝업스토어 방문 경험 있다
-
팝업스토어 방문 계기 & 방문 목적
“그냥 지다가던 길에 우연히” ⇒ 단순 호기심에 방문하는 경향 뚜렷
- 하지만 팝업스토어 방문 경험자의 절반 가량(53.6%)이 가고 싶은 곳을 일부러 찾아간 적이 있고,
- 전시나 체험 요소가 많은 팝업스토어에서는 오래 머물고 싶다(55.6%, 동의율)는 응답이 과반으로 평가되는 등
팝업스토어에서만 느낄 수 있는 새로운 경험에 대한 니즈도 높은 것으로 파악됨
-
기업의 긍정적인 팝업스토어 마케팅 효과
81.3% 팝업스토어는 브랜드나 콘텐츠를 소비자에게 각인 시키는 데 효과적인 것 같다
-
-
젊은 연령층일수록 팝업스토어에 대한 관심도와 만족도가 높음
SOM팝풀 초기 사용자 서울 및 주요 대도시에 거주하는 20-30대로 인스타그램을 활발히 사용하는 소셜 미디어 유저들SAM국내 팝업스토어 관심자 주로 20-30대 젊은 층으로 특별한 쇼핑 경험을 추구하는 소비자들TAM전 세계 팝업스토어 관심자 팝업스토어에 관심 있는 모든 사람들로 특히 트렌디한 쇼핑 경험을 즐기는 소비자들
흩어져 있는 팝업스토어 정보를 제공하고 인스타그램 연동으로 부가 기능을 제공하는 앱 서비스
PopPool은 PopUpStore + Pool 의 약자로, 팝업의 장이라는 의미의 이름입니다.
- 흩어져 있는 팝업 스토어 정보를 관심사 기반으로 정리하여 제공해주는 서비스가 없다.
- 대부분 SNS 특히 인스타그램에서 팝업스토어 정보를 수집하는데 필요한 때에 필요한 정보와 후기를 찾기가 쉽지 않다.
- 다양한 계정에서 얻은 정리되지 않은 북마크한 정보들
- 가장 영향도 높은 인스타그램 후기 정보 탐색의 어려움
- 관심사 기반의 팝업스토어 정보를 추천해주는 서비스
- 북마크 정보를 뒤적이지 않아도, 다양한 앱과 계정을 옮겨다니지 않아도 하나의 앱에서 관련 정보와 후기까지 한 번에 볼 수 있는 서비스
-
관심사 기반 팝업스토어 큐레이션
- “관심사, 성별, 연령대”만 알려주세요! 나머지는 팝풀이 할게요.
더이상 인스타그램 저장함을 뒤져서 북마크한 콘텐츠를 찾지 않아도, 사진첩을 올려서 캡쳐한 사진을 찾지 않아도 돼요. 팝풀이 딱 맞는 팝업스토어를 추천해드릴게요:)
- 📍 팝풀이님을 위한 맞춤 팝업 큐레이션 : ‘성별, 연령대, 관심사’ 기준으로 개인별 최근 본 팝업스토어의 데이터와 활동 이력을 분석해 맞춤 팝업스토어를 추천합니다.
- 📍 팝풀이들은 지금 이런 팝업에 가장 관심 있어요! : 팝풀 유저들이 가장 많이 찾아보고 활동한 가장 인기있는 팝업스토어 Top 10을 만나보세요!
- 📍 제일 먼저 올리는 신규 오픈 팝업 : 신규 오픈한지 2주가 되지 않은 신상 팝업스토어만 모아서 보여드려요.
- “관심사, 성별, 연령대”만 알려주세요! 나머지는 팝풀이 할게요.
더이상 인스타그램 저장함을 뒤져서 북마크한 콘텐츠를 찾지 않아도, 사진첩을 올려서 캡쳐한 사진을 찾지 않아도 돼요. 팝풀이 딱 맞는 팝업스토어를 추천해드릴게요:)
-
쉽고 빠른 팝업스토어 탐색
-
내 주변 혹은 원하는 위치에 어떤 팝업스토어가 있는지 지도에서 한 눈에 볼 수 있어요!
- 지역과 카테고리 옵션을 선택해 원하는 팝업스토어 정보만 골라 지도에서 볼 수 있어요
- 물론, 전체 목록으로도 볼 수 있습니다.
-
현재는 팝업스토어 이름만 검색할 수 있지만, 팝풀 유저들이 원하는 조건으로 검색할 수 있도록 검색엔진을 계속해서 고도화 할 예정이에요!
-
-
생생한 코멘트
- 팝업스토어를 다녀온 팝풀 유저들이 남긴 생생한 후기와 기대평을 만나보세요!
- 📍 팝업스토어에 대한 궁금증, 기대평 그리고 생생한 후기까지 코멘트와 사진을 자유롭게 남길 수 있어요.
- 📍 팝업스토어 방문 후 인스타그램에 올렸던 팝업스토어 사진을 후기로 올리고 싶은데 사진이 어디있지? 앨범을 다시 찾아보지 않아도 가져오고 싶은 인스타그램 콘텐츠의 링크만 복사 붙여넣기만 해주면 그대로 사진을 가져올 수 있어요:)
- 📍 도움이 됐다고 생각하는 다른 사람의 코멘트에 ‘도움돼요’ 버튼을 눌러 반응을 남겨주세요. 반응이 많아질수록 더 정확한 팝업스토어 정보와 코멘트를 볼 수 있어요.
- 팝업스토어를 다녀온 팝풀 유저들이 남긴 생생한 후기와 기대평을 만나보세요!
-
둘러보기
- 가입을 하지 않아도 팝풀이 제공하는 팝업스토어 정보를 탐색할 수 있어요! 단, 팝풀 유저에게만 제공되는 다양한 서비스를 이용하려면 가입/로그인이 필수예요.
| 구분 | 기술스택 | 상세내용 | 버전 |
|---|---|---|---|
| 공통 | 형상관리 | Git | |
| 커뮤니케이션 | Notion, Discord | - | |
| iOS | Framework | - UIkit | - |
| Architecture | - Clean Architecture | - | |
| Design Pattern | - MVVM + Input/Output Pattern | - | |
| Asnyc/Await | - RxSwift | - | |
| Network | - Alamofire / Network Layer | - | |
| Asnyc/Await | - RxSwift | - | |
| BackEnd | DB | MySQL | 8.0.32 |
| JPA | - | ||
| QueryDSL | 5.0.0 | ||
| Java | JDK | 17.0.12 | |
| Spring | Spring Boot | 3.2.6 | |
| Spring Security | 6.2.4 | ||
| JWT | jjwt | 0.11.5 | |
| IDE | Intellij(Community) | 23.3.5 | |
| Build | Gradle | 8.7 | |
| API Docs | OpenAPI(Swagger) | 3.0.1 | |
| Infra | Server | AWS EC2 | - |
| DB | AWS RDS | - | |
| Object Storage | AWS S3 | - | |
| Server | Deploy | Jenkins | - |
src
├─ main
│ ├─ java
│ │ └─ com
│ │ └─ application
│ │ └─ poppool
│ │ ├─ domain
│ │ │ ├─ admin
│ │ │ │ ├─ notice
│ │ │ │ │ ├─ controller
│ │ │ │ │ │ ├─ AdminNoticeController.java
│ │ │ │ │ │ └─ AdminNoticeControllerDoc.java
│ │ │ │ │ ├─ dto
│ │ │ │ │ │ └─ request
│ │ │ │ │ │ ├─ CreateNoticeRequest.java
│ │ │ │ │ │ └─ UpdateNoticeRequest.java
│ │ │ │ │ └─ service
│ │ │ │ │ └─ AdminNoticeService.java
│ │ │ │ └─ popup
│ │ │ │ ├─ controller
│ │ │ │ │ ├─ AdminPopUpStoreController.java
│ │ │ │ │ └─ AdminPopUpStoreControllerDoc.java
│ │ │ │ ├─ dto
│ │ │ │ │ ├─ request
│ │ │ │ │ │ ├─ CreatePopUpStoreRequest.java
│ │ │ │ │ │ └─ UpdatePopUpStoreRequest.java
│ │ │ │ │ └─ response
│ │ │ │ │ ├─ GetAdminPopUpStoreDetailResponse.java
│ │ │ │ │ └─ GetAdminPopUpStoreListResponse.java
│ │ │ │ └─ service
│ │ │ │ └─ AdminPopUpStoreService.java
│ │ │ ├─ auth
│ │ │ │ ├─ controller
│ │ │ │ │ ├─ AuthController.java
│ │ │ │ │ └─ AuthControllerDoc.java
│ │ │ │ ├─ dto
│ │ │ │ │ ├─ info
│ │ │ │ │ │ ├─ ApplePublicKeys.java
│ │ │ │ │ │ └─ KakaoToken.java
│ │ │ │ │ ├─ request
│ │ │ │ │ │ ├─ AppleLoginRequest.java
│ │ │ │ │ │ └─ KakaoLoginRequest.java
│ │ │ │ │ └─ response
│ │ │ │ │ └─ LoginResponse.java
│ │ │ │ ├─ enums
│ │ │ │ │ ├─ SocialType.java
│ │ │ │ │ └─ TokenType.java
│ │ │ │ ├─ repository
│ │ │ │ │ └─ RefreshTokenRepository.java
│ │ │ │ └─ service
│ │ │ │ ├─ apple
│ │ │ │ │ ├─ AppleAuthFeignClient.java
│ │ │ │ │ └─ AppleAuthService.java
│ │ │ │ └─ kakao
│ │ │ │ ├─ KakaoAuthFeignClient.java
│ │ │ │ └─ KakaoAuthService.java
│ │ │ ├─ aws
│ │ │ │ └─ health
│ │ │ │ └─ HealthCheckController.java
│ │ │ ├─ bookmark
│ │ │ │ ├─ entity
│ │ │ │ └─ repository
│ │ │ ├─ category
│ │ │ │ ├─ entity
│ │ │ │ │ └─ CategoryEntity.java
│ │ │ │ ├─ enums
│ │ │ │ │ └─ Category.java
│ │ │ │ ├─ repository
│ │ │ │ │ └─ CategoryRepository.java
│ │ │ │ └─ service
│ │ │ │ └─ CategoryService.java
│ │ │ ├─ comment
│ │ │ │ ├─ controller
│ │ │ │ │ ├─ CommentController.java
│ │ │ │ │ └─ CommentControllerDoc.java
│ │ │ │ ├─ dto
│ │ │ │ │ └─ request
│ │ │ │ │ ├─ CreateCommentRequest.java
│ │ │ │ │ └─ UpdateCommentRequest.java
│ │ │ │ ├─ entity
│ │ │ │ │ └─ CommentEntity.java
│ │ │ │ ├─ enums
│ │ │ │ │ └─ CommentType.java
│ │ │ │ ├─ repository
│ │ │ │ │ ├─ CommentRepository.java
│ │ │ │ │ ├─ CommentRepositoryCustom.java
│ │ │ │ │ └─ CommentRepositoryImpl.java
│ │ │ │ └─ service
│ │ │ │ └─ CommentService.java
│ │ │ ├─ file
│ │ │ │ ├─ controller
│ │ │ │ │ ├─ FileController.java
│ │ │ │ │ └─ FileControllerDoc.java
│ │ │ │ ├─ dto
│ │ │ │ │ ├─ request
│ │ │ │ │ │ └─ PreSignedUrlRequest.java
│ │ │ │ │ └─ response
│ │ │ │ │ └─ PreSignedUrlResponse.java
│ │ │ │ └─ service
│ │ │ │ └─ FileService.java
│ │ │ ├─ home
│ │ │ │ ├─ controller
│ │ │ │ │ ├─ HomeController.java
│ │ │ │ │ └─ HomeControllerDoc.java
│ │ │ │ ├─ dto
│ │ │ │ │ ├─ request
│ │ │ │ │ └─ response
│ │ │ │ │ └─ GetHomeInfoResponse.java
│ │ │ │ └─ service
│ │ │ │ └─ HomeService.java
│ │ │ ├─ image
│ │ │ │ ├─ entity
│ │ │ │ │ ├─ CommentImageEntity.java
│ │ │ │ │ └─ PopUpStoreImageEntity.java
│ │ │ │ └─ repository
│ │ │ │ ├─ CommentImageRepository.java
│ │ │ │ └─ PopUpStoreImageRepository.java
│ │ │ ├─ interest
│ │ │ │ └─ dto
│ │ │ │ ├─ request
│ │ │ │ └─ response
│ │ │ ├─ like
│ │ │ │ ├─ controller
│ │ │ │ │ ├─ LikeController.java
│ │ │ │ │ └─ LikeControllerDoc.java
│ │ │ │ ├─ entity
│ │ │ │ │ └─ LikeEntity.java
│ │ │ │ ├─ repository
│ │ │ │ │ └─ LikeRepository.java
│ │ │ │ └─ service
│ │ │ │ └─ LikeService.java
│ │ │ ├─ location
│ │ │ │ ├─ controller
│ │ │ │ │ ├─ LocationController.java
│ │ │ │ │ └─ LocationControllerDoc.java
│ │ │ │ ├─ dto
│ │ │ │ │ ├─ request
│ │ │ │ │ └─ response
│ │ │ │ │ ├─ GetViewBoundPopUpStoreListResponse.java
│ │ │ │ │ └─ SearchPopUpStoreByMapResponse.java
│ │ │ │ ├─ entity
│ │ │ │ │ └─ LocationEntity.java
│ │ │ │ ├─ repository
│ │ │ │ │ └─ LocationRepository.java
│ │ │ │ └─ service
│ │ │ │ └─ LocationService.java
│ │ │ ├─ notice
│ │ │ │ ├─ controller
│ │ │ │ │ ├─ NoticeController.java
│ │ │ │ │ └─ NoticeControllerDoc.java
│ │ │ │ ├─ dto
│ │ │ │ │ └─ response
│ │ │ │ │ ├─ GetNoticeDetailResponse.java
│ │ │ │ │ └─ GetNoticeListResponse.java
│ │ │ │ ├─ entity
│ │ │ │ │ └─ NoticeEntity.java
│ │ │ │ ├─ repository
│ │ │ │ │ └─ NoticeRepository.java
│ │ │ │ └─ service
│ │ │ │ └─ NoticeService.java
│ │ │ ├─ popup
│ │ │ │ ├─ controller
│ │ │ │ │ ├─ PopUpStoreController.java
│ │ │ │ │ └─ PopUpStoreControllerDoc.java
│ │ │ │ ├─ dto
│ │ │ │ │ └─ resonse
│ │ │ │ │ ├─ GetClosedPopUpStoreListResponse.java
│ │ │ │ │ ├─ GetOpenPopUpStoreListResponse.java
│ │ │ │ │ ├─ GetPopUpStoreDetailResponse.java
│ │ │ │ │ └─ GetPopUpStoreDirectionResponse.java
│ │ │ │ ├─ entity
│ │ │ │ │ └─ PopUpStoreEntity.java
│ │ │ │ ├─ repository
│ │ │ │ │ ├─ PopUpStoreRepository.java
│ │ │ │ │ ├─ PopUpStoreRepositoryCustom.java
│ │ │ │ │ └─ PopUpStoreRepositoryImpl.java
│ │ │ │ └─ service
│ │ │ │ └─ PopUpStoreService.java
│ │ │ ├─ search
│ │ │ │ ├─ controller
│ │ │ │ │ ├─ SearchController.java
│ │ │ │ │ └─ SearchControllerDoc.java
│ │ │ │ ├─ dto
│ │ │ │ │ └─ SearchPopUpStoreResponse.java
│ │ │ │ └─ service
│ │ │ │ └─ SearchService.java
│ │ │ ├─ sign_up
│ │ │ │ ├─ controller
│ │ │ │ │ ├─ SignUpController.java
│ │ │ │ │ └─ SignUpControllerDoc.java
│ │ │ │ ├─ dto
│ │ │ │ │ ├─ request
│ │ │ │ │ │ └─ SignUpRequest.java
│ │ │ │ │ └─ response
│ │ │ │ │ ├─ GetCategoryListResponse.java
│ │ │ │ │ └─ GetGenderResponse.java
│ │ │ │ └─ service
│ │ │ │ └─ SignUpService.java
│ │ │ ├─ token
│ │ │ │ ├─ entity
│ │ │ │ │ ├─ BlackListTokenEntity.java
│ │ │ │ │ └─ RefreshTokenEntity.java
│ │ │ │ ├─ repository
│ │ │ │ │ ├─ BlackListTokenRepository.java
│ │ │ │ │ └─ RefreshTokenRepository.java
│ │ │ │ └─ service
│ │ │ │ ├─ BlackListTokenService.java
│ │ │ │ └─ RefreshTokenService.java
│ │ │ └─ user
│ │ │ ├─ controller
│ │ │ │ ├─ UserController.java
│ │ │ │ ├─ UserControllerDoc.java
│ │ │ │ ├─ UserProfileController.java
│ │ │ │ └─ UserProfileControllerDoc.java
│ │ │ ├─ dto
│ │ │ │ ├─ request
│ │ │ │ │ ├─ CheckedSurveyListRequest.java
│ │ │ │ │ ├─ UpdateMyInterestCategoryRequest.java
│ │ │ │ │ ├─ UpdateMyProfileRequest.java
│ │ │ │ │ └─ UpdateMyTailoredInfoRequest.java
│ │ │ │ └─ response
│ │ │ │ ├─ GetBlockedUserListResponse.java
│ │ │ │ ├─ GetBookmarkPopUpStoreListResponse.java
│ │ │ │ ├─ GetMyCommentedPopUpStoreListResponse.java
│ │ │ │ ├─ GetMyCommentResponse.java
│ │ │ │ ├─ GetMyPageResponse.java
│ │ │ │ ├─ GetMyRecentViewPopUpStoreListResponse.java
│ │ │ │ ├─ GetProfileResponse.java
│ │ │ │ └─ GetWithDrawlSurveyResponse.java
│ │ │ ├─ entity
│ │ │ │ ├─ BlockedUserEntity.java
│ │ │ │ ├─ BookmarkPopUpStoreEntity.java
│ │ │ │ ├─ RoleEntity.java
│ │ │ │ ├─ UserEntity.java
│ │ │ │ ├─ UserInterestCategoryEntity.java
│ │ │ │ ├─ UserPopUpStoreViewEntity.java
│ │ │ │ ├─ UserRoleEntity.java
│ │ │ │ └─ WithDrawalSurveyEntity.java
│ │ │ ├─ enums
│ │ │ │ ├─ Gender.java
│ │ │ │ ├─ Role.java
│ │ │ │ └─ WithDrawlSurvey.java
│ │ │ ├─ repository
│ │ │ │ ├─ BlockedUserRepository.java
│ │ │ │ ├─ BlockedUserRepositoryCustom.java
│ │ │ │ ├─ BlockedUserRepositoryImpl.java
│ │ │ │ ├─ BookmarkPopUpStoreRepository.java
│ │ │ │ ├─ RoleRepository.java
│ │ │ │ ├─ UserInterestCategoryRepository.java
│ │ │ │ ├─ UserPopUpStoreViewRepository.java
│ │ │ │ ├─ UserRepository.java
│ │ │ │ └─ WithDrawlRepository.java
│ │ │ └─ service
│ │ │ ├─ UserProfileService.java
│ │ │ └─ UserService.java
│ │ ├─ global
│ │ │ ├─ audit
│ │ │ │ ├─ AdminEntityListener.java
│ │ │ │ ├─ BaseAdminEntity.java
│ │ │ │ ├─ BaseEntity.java
│ │ │ │ ├─ BaseTimeAdminEntity.java
│ │ │ │ ├─ BaseTimeEntity.java
│ │ │ │ └─ JpaAuditConfig.java
│ │ │ ├─ config
│ │ │ │ ├─ QuerydslConfig.java
│ │ │ │ ├─ S3Config.java
│ │ │ │ └─ SwaggerConfig.java
│ │ │ ├─ converter
│ │ │ │ ├─ BooleanToYNConverter.java
│ │ │ │ ├─ CategoryConverter.java
│ │ │ │ ├─ CommentTypeConverter.java
│ │ │ │ ├─ EnumToStringConverter.java
│ │ │ │ ├─ GenderConverter.java
│ │ │ │ ├─ StringToCategoryConverter.java
│ │ │ │ └─ WithDrawlSurveyConverter.java
│ │ │ ├─ enums
│ │ │ │ └─ BaseEnum.java
│ │ │ ├─ exception
│ │ │ │ ├─ ApiControllerExceptionAdvice.java
│ │ │ │ ├─ BadRequestException.java
│ │ │ │ ├─ BaseException.java
│ │ │ │ ├─ ConcurrencyException.java
│ │ │ │ ├─ ErrorCode.java
│ │ │ │ ├─ ExceptionResponse.java
│ │ │ │ ├─ NotFoundException.java
│ │ │ │ └─ UnAuthorizedException.java
│ │ │ ├─ jwt
│ │ │ │ ├─ JwtAuthenticationFilter.java
│ │ │ │ ├─ JwtProperties.java
│ │ │ │ └─ JwtService.java
│ │ │ ├─ security
│ │ │ │ ├─ CustomAccessDeniedHandler.java
│ │ │ │ ├─ CustomAuthenticationEntryPoint.java
│ │ │ │ ├─ CustomUserDetailsService.java
│ │ │ │ └─ SecurityConfig.java
│ │ │ └─ utils
│ │ │ ├─ AgeGroupUtils.java
│ │ │ ├─ QueryDslUtils.java
│ │ │ ├─ SecurityUtils.java
│ │ │ └─ TimeUtils.java
│ │ └─ PopPoolApplication.java
│ └─ resources
│ ├─ application-dev.yml
│ ├─ application-local.yml
│ ├─ application.yml
│ ├─ data.sql
│ ├─ static
│ └─ templates
└─ test
├─ java
│ └─ com
│ └─ application
│ └─ poppool
│ └─ PopPoolApplicationTests.java
└─ resources
└─ application-test.yml

