LIKELION 13th DanGoa!
25.07.21 - 25.08.26
서경대학교 앞 지역 상권은 학교 학생들의 주요 소비처임에도 불구하고 현재 활성화 되어있지 않아 학교 근처 번화가인 성신으로 유출되고 있는 상태입니다.
그 과정에서 학교 학생들을 수소문 해 본 결과, 소수의 학교 앞 상권은 입소문과 단골 중심으로 운영되고 있음을 알았습니다.
저희는 그 이후 “단골”을 키워드로 잡고 실행한 설문조사에서 “쿠폰을 챙기는 게 번거롭다” 등의 불편함을 확인했으며,
특히 학생·청년층은 온라인 위주의 생활방식 속에서 지역 상권에 대한 접근성이 낮아지고, 상인들은 온라인 홍보나 고객 관리에 어려움을 겪어 지역 경제와 생활이 단절되는 문제가 드러났습니다.
단추는 “단추와 실”처럼 가게와 소비자를 연결하는 플랫폼으로,
지역 상권과 주민을 다시 이어주는 역할을 함과 동시에, 사용자의 소비 경험을 미션과 스탬프라는 방식으로 기록하고 추억할 수 있게 합니다.
또한, 단골 경험을 AI 기반 추천, 미션, 디지털 적립 서비스로 확장해 지역 경제를 활성화하고, 상인과 소비자 모두가 지속적인 관계를 맺을 수 있도록 설계되었습니다.
현재는 성북구를 주요 타깃 지역으로 설정하고 있으나, 향후 타 지역으로 확장할 예정입니다.
더 나아가 서울 페이나 지역 화폐와의 연계를 통해 결제 수단을 다양화하고, 지역 기반 소비를 촉진함으로써 지역 경제 활성화에 기여하고자 합니다.
![]() |
|
|---|---|
| @naooung 김나경 | @shinchaerin79 신채린 |
src/main/java/com/likelion/danchu
├── domain # 도메인별 기능 모듈
│ ├── auth # 인증/인가
│ ├── coupon # 쿠폰 도메인
│ ├── hashtag # 해시태그 도메인
│ ├── menu # 메뉴 도메인
│ ├── mission # 미션 도메인
│ ├── openAI # OpenAI 사용 도메인
│ ├── stamp # 스탬프 도메인
│ ├── store # 가게 도메인
│ └── user # 사용자 도메인
│
├── global # 전역 설정 및 공통 모듈
│ ├── common # 공통 유틸/상수/헬퍼
│ ├── config # 스프링/외부 라이브러리 설정(@Configuration)
│ ├── exception # 전역 예외/에러코드/ExceptionHandler
│ ├── jwt # JWT 토큰 관련
│ ├── response # 공통 API 응답
│ └── security # Spring Security 설정 및 커스텀 필터/핸들러
│
├── infra # 외부 인프라 연동 어댑터 계층
│ ├── kakao # 카카오 API 설정
│ ├── openAI # OpenAI 설정
│ ├── redis # Redis 설정
│ └── s3 # AWS S3 업로드/다운로드 등
│
└── DanchuApplication # 스프링 부트 실행 클래스
-
도메인 중심 설계
• domain 패키지를 인증/인가(auth), 쿠폰(coupon), 미션(mission), 가게(store), 사용자(user) 등 기능 단위로 구분하였습니다.
• 각 도메인은 Entity, Repository, Service, Controller를 독립적으로 관리하여 비즈니스 로직을 명확히 분리하였습니다. -
전역(Global) 계층
• global 패키지에 공통 모듈을 분리 관리하였습니다.
• config를 통해 스프링 및 외부 라이브러리 설정을 관리하였으며,
• security 및 jwt 모듈을 통해 Spring Security 기반 인증/인가와 JWT 발급 및 검증을 처리하였습니다.
• exception 모듈에서 전역 예외를 처리하고 에러 코드를 관리하였으며,
• response 모듈을 통해 모든 API 응답을 일관된 포맷으로 제공하였습니다. -
인프라(Infra) 계층
• infra 패키지를 두어 외부 서비스 연동을 관리하였습니다.
• 카카오 OAuth, OpenAI API, Redis, AWS S3 등을 독립적으로 모듈화하여 도메인 로직과 infra stucture를 분리하였습니다. -
보안 및 표준화
• Spring Security와 JWT를 활용하여 인증 및 인가 절차를 표준화하였습니다.
• 전역 예외 처리(@RestControllerAdvice)를 적용하여 안정적인 에러 핸들링을 구현하였습니다.
• 모든 API 응답을 GlobalResponse 형식으로 통일하여 일관된 데이터 전달 방식을 유지하였습니다. -
모니터링 시스템
• 운영 환경의 안정성을 확보하기 위해 모니터링 시스템을 구축하였습니다.
• Dozzle을 통해 실시간 로그를 확인할 수 있도록 하였으며,
• Prometheus와 Grafana를 도입하여 서버 및 애플리케이션 메트릭을 수집 및 시각화하였습니다.
- 🎉 Start: Start New Project [:tada]
- ✨ Feat: 새로운 기능을 추가 [:sparkles]
- 🐛 Fix: 버그 수정 [:bug]
- 🎨 Design: CSS 등 사용자 UI 디자인 변경 [:art]
- ♻️ Refactor: 코드 리팩토링 [:recycle]
- 🔧 Settings: Changing configuration files [:wrench]
- 🗃️ Comment: 필요한 주석 추가 및 변경 [:card_file_box]
- ➕ Dependency/Plugin: Add a dependency/plugin [:heavy_plus_sign]
- 📝 Docs: 문서 수정 [:memo]
- 🔀 Merge: Merge branches [:twisted_rightwards_arrows:]
- 🚀 Deploy: Deploying stuff [:rocket]
- 🚚 Rename: 파일 혹은 폴더명을 수정하거나 옮기는 작업만인 경우 [:truck]
- 🔥 Remove: 파일을 삭제하는 작업만 수행한 경우 [:fire]
- ⏪️ Revert: 전 버전으로 롤백 [:rewind]
- develop 브랜치에서 feature/* 브랜치 생성
- 개발 완료 후 → feature/* → develop 병합
- develop 브랜치에서 refactor/* 브랜치 생성
- 수정 완료 후 → refactor/* → develop 병합
- develop → main 병합 후 운영 배포
- main 브랜치는 항상 운영 가능한 상태 유지
이슈 생성 → 브랜치 생성 → PR 생성 → 코드 리뷰 & Approve → Merge 순서
⭐️ PR 및 Merge 과정을 통해 협업 효율성, 코드 품질, 이력 관리의 명확성을 확보
본 프로젝트는 GitHub Actions 기반 CI/CD가 구축되어 있으며, 메인 브랜치에 코드가 머지되면 자동으로 빌드 및 배포됩니다.
- Server: https://api.danchu.site
- Swagger 문서: https://api.danchu.site/swagger-ui/index.html
Swagger 문서는 보안을 위해 Nginx Basic Auth가 적용되어 있습니다.
필요 시, 별도로 제공되는 Swagger 계정 정보를 사용하여 접속해 주세요.
배포 환경 접근이 어려운 경우, 아래 명령어로 로컬에서 실행할 수 있습니다.
# 프로젝트 빌드 및 실행
./gradlew bootRun
⚠️ 본 서비스의 주요 기능(가게/미션 추천, 스탬프 적립 및 쿠폰 관리, 마이페이지 등)은
사용자별 데이터를 기반으로 제공되므로 로그인이 반드시 필요합니다.
- 회원가입, 로그인, Access Token 재발급 API를 제외한 모든 요청은 발급받은 Access Token을
Request Header에 포함해야 합니다.
Authorization: Bearer {AccessToken}
- 테스트 계정 로그인을 원할 경우, 아래 엔드포인트를 이용하세요.
POST /api/auth/login/test