Skip to content

흩어져 있는 팝업스토어 정보를 제공하고 인스타그램 연동으로 부가 기능을 제공하는 서비스

Notifications You must be signed in to change notification settings

PopPool/backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

팝풀(PopPool)

흩어져 있는 팝업스토어 정보를 제공하고 인스타그램 연동으로 부가 기능을 제공하는 서비스

앱 스토어 링크

목차

  1. 프로젝트 멤버 소개
  2. 서비스 소개
  3. 기술 스택
  4. 시스템 아키텍처
  5. 주요 기능
  6. 협업 관리
  7. 프로젝트 기간
  8. 프로젝트 관련 문서

👪 프로젝트 멤버 소개

🙂 김채연
(기획)

🙂 이재은
(디자이너)

🙂 이동준
(iOS)

🙂 서준영
(iOS)

🙂 김기현
(iOS)

🙂 윤재성
(backend)

✏️ 기획 배경

  • 팝업스토어 시장 규모 확대 및 소비자 관심 증대

    • 높은 팝업스토어 방문 경험

      75.6% 팝업스토어 방문 경험 있다

    • 팝업스토어 방문 계기 & 방문 목적

      “그냥 지다가던 길에 우연히” ⇒ 단순 호기심에 방문하는 경향 뚜렷

      • 하지만 팝업스토어 방문 경험자의 절반 가량(53.6%)이 가고 싶은 곳을 일부러 찾아간 적이 있고,
      • 전시나 체험 요소가 많은 팝업스토어에서는 오래 머물고 싶다(55.6%, 동의율)는 응답이 과반으로 평가되는 등

      팝업스토어에서만 느낄 수 있는 새로운 경험에 대한 니즈도 높은 것으로 파악됨

    • 기업의 긍정적인 팝업스토어 마케팅 효과

      81.3% 팝업스토어는 브랜드나 콘텐츠를 소비자에게 각인 시키는 데 효과적인 것 같다

  • 젊은 연령층일수록 팝업스토어에 대한 관심도와 만족도가 높음

    • 팝업스토어 방문 후 만족도

      • 저연령일수록 팝업스토어 방문 후의 만족감이 높음

    • 2030 세대의 높은 관심도

      53.6% 내가 가고 싶은 팝업스토어에 방문하기 위해 ‘일부러 찾아간 경험이 있다.

    • 팝업스토어 정보는 주로 “인스타그램”

      • 1020 세대는 대부분 행사, 이벤트, 핫플 소식 소개하는 ‘인스타그램 계정’에서 정보를 얻음
      • 인스타그램은 올해 이용자들의 편의를 높이는 기능들을 추가했다. 이에 따라 크리에이터는 물론 비즈니스 계정들이 마케팅을 위해 사용하는 사례가 증가했다. 특히 Z세대가 방문 인증하기 좋아하는 ‘팝업스토어’를 소개하는 계정이 늘었다.(뉴스기사 출처)

Target

  • SOM 팝풀 초기 사용자 서울 및 주요 대도시에 거주하는 20-30대로 인스타그램을 활발히 사용하는 소셜 미디어 유저들
  • SAM 국내 팝업스토어 관심자 주로 20-30대 젊은 층으로 특별한 쇼핑 경험을 추구하는 소비자들
  • TAM 전 세계 팝업스토어 관심자 팝업스토어에 관심 있는 모든 사람들로 특히 트렌디한 쇼핑 경험을 즐기는 소비자들

💡 서비스 소개

흩어져 있는 팝업스토어 정보를 제공하고 인스타그램 연동으로 부가 기능을 제공하는 앱 서비스

PopPool은 PopUpStore + Pool 의 약자로, 팝업의 장이라는 의미의 이름입니다.

Painpoint

  • 흩어져 있는 팝업 스토어 정보를 관심사 기반으로 정리하여 제공해주는 서비스가 없다.
  • 대부분 SNS 특히 인스타그램에서 팝업스토어 정보를 수집하는데 필요한 때에 필요한 정보와 후기를 찾기가 쉽지 않다.
    • 다양한 계정에서 얻은 정리되지 않은 북마크한 정보들
    • 가장 영향도 높은 인스타그램 후기 정보 탐색의 어려움

Solution

  • 관심사 기반의 팝업스토어 정보를 추천해주는 서비스
  • 북마크 정보를 뒤적이지 않아도, 다양한 앱과 계정을 옮겨다니지 않아도 하나의 앱에서 관련 정보와 후기까지 한 번에 볼 수 있는 서비스

📕 주요 기능

  1. 관심사 기반 팝업스토어 큐레이션

    1. “관심사, 성별, 연령대”만 알려주세요! 나머지는 팝풀이 할게요. 더이상 인스타그램 저장함을 뒤져서 북마크한 콘텐츠를 찾지 않아도, 사진첩을 올려서 캡쳐한 사진을 찾지 않아도 돼요. 팝풀이 딱 맞는 팝업스토어를 추천해드릴게요:)
      1. 📍 팝풀이님을 위한 맞춤 팝업 큐레이션 : ‘성별, 연령대, 관심사’ 기준으로 개인별 최근 본 팝업스토어의 데이터와 활동 이력을 분석해 맞춤 팝업스토어를 추천합니다.
      2. 📍 팝풀이들은 지금 이런 팝업에 가장 관심 있어요! : 팝풀 유저들이 가장 많이 찾아보고 활동한 가장 인기있는 팝업스토어 Top 10을 만나보세요!
      3. 📍 제일 먼저 올리는 신규 오픈 팝업 : 신규 오픈한지 2주가 되지 않은 신상 팝업스토어만 모아서 보여드려요.
  2. 쉽고 빠른 팝업스토어 탐색

    1. 내 주변 혹은 원하는 위치에 어떤 팝업스토어가 있는지 지도에서 한 눈에 볼 수 있어요!

      1. 지역과 카테고리 옵션을 선택해 원하는 팝업스토어 정보만 골라 지도에서 볼 수 있어요
      2. 물론, 전체 목록으로도 볼 수 있습니다.
    2. 현재는 팝업스토어 이름만 검색할 수 있지만, 팝풀 유저들이 원하는 조건으로 검색할 수 있도록 검색엔진을 계속해서 고도화 할 예정이에요!

  3. 생생한 코멘트

    1. 팝업스토어를 다녀온 팝풀 유저들이 남긴 생생한 후기와 기대평을 만나보세요!
      1. 📍 팝업스토어에 대한 궁금증, 기대평 그리고 생생한 후기까지 코멘트와 사진을 자유롭게 남길 수 있어요.
      2. 📍 팝업스토어 방문 후 인스타그램에 올렸던 팝업스토어 사진을 후기로 올리고 싶은데 사진이 어디있지? 앨범을 다시 찾아보지 않아도 가져오고 싶은 인스타그램 콘텐츠의 링크만 복사 붙여넣기만 해주면 그대로 사진을 가져올 수 있어요:)
      3. 📍 도움이 됐다고 생각하는 다른 사람의 코멘트에 ‘도움돼요’ 버튼을 눌러 반응을 남겨주세요. 반응이 많아질수록 더 정확한 팝업스토어 정보와 코멘트를 볼 수 있어요.
  4. 둘러보기

    1. 가입을 하지 않아도 팝풀이 제공하는 팝업스토어 정보를 탐색할 수 있어요! 단, 팝풀 유저에게만 제공되는 다양한 서비스를 이용하려면 가입/로그인이 필수예요.

🛠️ 기술 스택

iOS

Swift UIkit RxSwift Clean Architecture MVVM GitHub

BackEnd

Java SpringBoot JPA QueryDsl Swagger JWT MySQL GitHub AWS Jenkins

상세 기술스택 및 버전

구분 기술스택 상세내용 버전
공통 형상관리 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 -

🗂️ 시스템 아키텍처


📁 Back-End 소스 코드 폴더 구조

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

👥 협업 관리


📆 프로젝트 기간

24.06.15 ~ 24.09.31


📋 프로젝트 관련 문서


About

흩어져 있는 팝업스토어 정보를 제공하고 인스타그램 연동으로 부가 기능을 제공하는 서비스

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •