“동산”은 ‘동네 산책’의 줄임말로, 산책 경로를 기록하고 함께 산책을 즐길 수 있는 소셜 산책 서비스 입니다.
주요기능
- 산책로 등록 : 사용자의 산책 경로를 지도에 기록하고 다른 사용자와 공유할 수 있습니다.
- 산책로 따라 걷기 : 다른 사용자가 등록한 산책 경로를 따라 산책할 수 있습니다.
- 크루 가입 : 관심 있는 산책 크루에 가입하고, 현재 크루 멤버 중 몇 명이 산책 중인지 실시간으로 확인할 수 있습니다.
- 같이 산책하기 : 크루에서 ‘같이 산책하기’ 일정에 참여하면, 해당 시간대에 산책중인 참여자 수를 실시간으로 확인할 수 있습니다. 이를 통해 서로 다른 장소에서도 함께 걷는 경험을 나눌 수 있습니다.
Backend
| (사진) | (사진) |
|---|---|
| 김건우 | 조유리 |
| 백엔드 팀원 | 백엔드 팀장 |
Frontend
| (사진) | (사진) |
|---|---|
| 노성원 | 이다은 |
| 프론트엔트 팀원 | 프론트엔트 팀장 |
- 통합 팀장 : 조유리
2025.06.25version
작성자 : 조유리
| 용어 | 설명 | 비고 |
|---|---|---|
| 소셜 로그인에서 제공받는 사용자 이메일 | Apple의 경우 이메일을 닉네임으로 저장 | |
| nickname | 소셜 로그인에서 제공받는 사용자 닉네임 | 소셜 플팻폼에게 전달받는 닉네임은 글자 제한이 없지만, 닉네임을 수정할 때는 1자 이상 9자 이하로만 수정 가능하다. |
| role | 사용자의 권한을 나타내는 값 | e.g.) ROLE_ADMIN(관리자), ROLE_USER(일반 사용자) |
닉네임 수정
사용자는 자신의 닉네임을 수정할 수 있다.
- 비즈니스 로직
- 1자 이상 9자 이하의 문자열로만 수정할 수 있다.
- 단, 글자수가 길어 페이지를 벗어나는 경우, UI 디자인에 따라 말줄임 처리(…)를 한다.
프로필 조회
사용자는 자신의 현재 프로필 정보(닉네임, 이메일, 프로필 사진)를 확인할 수 있다.
- 소셜 플랫폼에서 받은 이메일, 닉네임을 사용자 정보로 저장한다.
- Apple 로그인의 경우 닉네임이 제공되지 않으므로 이메일을 닉네임으로 사용한다.
- 동일한 이메일이라도 provider가 다르면 별개의 계정으로 인식하여 신규 가입 처리한다.
- 신규 회원은 ROLE_USER로 자동 회원가입 처리된다.
- 로그인 시 access token과 refresh token을 쿠키에 발급한다.
- refresh token의 유효성 검증 후 새로운 토큰 세트를 발급한다.
- refresh token이 만료되었거나 변조되었을 경우에는 재로그인이 필요하다.
- 로그아웃 시 서버는 access token과 refresh token 쿠키를 만료 처리한다.
| 용어 | 설명 | 비고 |
|---|---|---|
| provider | 로그인 제공자 | e.g.) NAVER, KAKAO, APPLE |
| access token | 인증 후 발급되는 짧은 수명의 JWT 토큰 | |
| refresh token | access token이 만료되었을 때 재발급에 사용되는 장기 수명 토큰 | 보안을 위해 HttpOnly 쿠키로 저장 |
소셜 로그인
사용자는 소셜 로그인(Naver, Kakao, Apple)으로 로그인할 수 있다.
토큰 재발급
access token이 만료되면 refresh token을 사용하여 access token과 refresh token을 재발급한다.
로그아웃
사용자는 로그아웃할 수 있다.
| 용어 | 설명 | 비고 |
|---|---|---|
| name (북마크 이름) | 사용자가 지정한 북마크의 고유한 이름(사용자 범위 내 유일) 1~255자 |
|
| 사용자 ID | 북마크 소유자의 식별자 | |
| 산책로 ID | 북마크에 포함되는 산책로의 식별자 |
북마크 생성
사용자는 북마크 이름을 입력하여 북마크를 생성할 수 있다.
- 사용자는 자신이 기존에 생성했던 북마크와 동일한 이름의 북마크를 생성할 수 없다.
북마크 이름 수정
사용자는 자신이 생성한 북마크의 이름을 수정할 수 있다.
- 사용자는 자신이 기존에 생성했던 북마크와 동일한 이름으로 수정할 수 없다.
북마크에 산책로 추가&제외
사용자는 자신이 생성한 북마크에 산책로를 추가하거나 제외할 수 있다.
- 하나의 산책로는 여러 개의 북마크에 포함될 수 있다.
- 이미 북마크에 추가된 산책로를 중복으로 추가할 수 없다.
북마크 삭제
사용자는 자신이 생성한 북마크를 삭제할 수 있다.
북마크 목록 조회
사용자가 생성한 북마크 목록을 제공한다.
북마크에 저장된 & 좋아요 한 산책로 조회
사용자는 자신이 생성한 각 북마크 저장된 산책로 목록을 조회할 수 있다.
- 비공개 산책로는 자신이 등록한 산책로인 경우에만 조회 가능하다.
| 용어 | 설명 | 비고 |
|---|---|---|
| name | 산책로 이름 | 1~15자 |
| memo | 산책로 설명 | 0~100자 |
| exposeLevel | 산책로 공개 여부 | PUBLIC (공개), PRIVATE (비공개) |
| hashtags | 해시 태그 | |
| distanceKm | 산책 거리 (km) | km 단위 |
| timeSec | 산책 시간 (초) | 초 단위 |
| course | 산책 경로 | |
| courseImageUrl | 산책 경로 이미지 |
산책로 등록
산책로를 등록할 수 있다.
-
입력 값(request body) : 산책로 등록을 위해 다음 정보를 입력해야 한다
필드명 타입 제약 및 설명 courseImageId Long 코스 이미지 ID (필수) name String 산책로 제목, 최대 15자 (필수) memo String 산책로 메모, 최대 100자 (선택) distance Double 거리(km), 최소 0.2 이상 time Integer 예상 소요 시간(초), 최소 300초 hashtags List 관련 태그 리스트 (필수) walkwayExposeLevel Enum 공개 범위 설정 (PRIVATE, PUBLIC) course List 위도&경로를 리스트로 전달 -
산책 시간이 5분 이상, 거리가 200m 이상을 만족해야 산책로 등록이 가능하다.
-
산책로 코스 이미지를 먼저 등록하고, 산책로 코스 이미지 ID를 사용한다.
산책로 수정
자신이 등록한 산책로의 이름, 메모, hashtag, 공개&비공개 여부를 수정할 수 있다.
산책로 삭제
자신이 등록한 산책로를 삭제할 수 있다.
산책로 이용
산책로를 이용하고, 이용 기록을 저장할 수 있다.
- 산책 시간, 거리를 저장한다.
산책로 좋아요&좋아요 취소
산책로를 좋아요 & 좋아요 취소할 수 있다.
산책로 단건 조회
산책로 정보, 리뷰 통계 정보, 사용자의 좋아요 여부, 사용자의 북마크 여부, 좋아요 개수를 제공합니다.
- 리뷰 통계 정보 : 평균 평점, 리뷰 개수, 각 별점(1~5점)의 비율
- 타인이 등록한 비공개 산책로의 리뷰는 조회할 수 없다.
사용자가 산책로를 각 북마크에 추가했는지 조회
사용자가 산책로를 각 북마크에 추가 했는지 여부를 제공합니다.
- 자신이 등록한 북마크들의 추가 여부를 제공합니다.
- 정렬 : 북마크 생성 시각 기준 내림차순
산책로 검색
사용자의 현재 위치를 기준으로 일정 반경 내에 있는 산책로를 검색합니다.
- 필수 요청 파라미터는 다음과 같다.
- sort (정렬)
- liked : 좋아요 내림차순
- rating : 리뷰 평점 내림차순
- latitude (현재 위치의 위도)
- longitude (현재 위치의 경도)
- distance (검색 반경, km)
- 소수점 아래 2자리
- sort (정렬)
- 타인이 등록한 비공개 산책로는 제공하지 않는다.
사용자가 등록한 산책로 조회
사용자가 등록한 산책로의 정보, 리뷰 개수, 리뷰 평균 별점, 좋아요 개수를 제공합니다.
- 정렬 : 등록한 시각 기준 내림차순
사용자가 좋아요한 산책로 조회
사용자가 좋아요한 산책로의 정보, 리뷰 개수, 리뷰 평균 별점, 좋아요 개수를 제공합니다.
- 정렬 : 좋아요한 시각 기준 내림차순
산책로 이용 내역 및 리뷰 작성 가능 여부 조회 (리뷰 or 산책로)
사용자의 산책 기록 목록을 조회하고, 각 기록에 연결된 산책로 정보, 리뷰, 리뷰 통계, 좋아요 수를 제공한다.
- 타인이 등록한 비공개 산책로의 리뷰는 조회할 수 없다.
| 용어 | 설명 | 비고 |
|---|---|---|
| rating | 별점 | 1~5의 정수 |
| content | 리뷰 내용 | 1~255자 |
리뷰 작성하기
산책을 완료한 산책로의 리뷰를 작성할 수 있다.
- 산책로 거리의 2/3 이상을 걸어야 리뷰 작성이 가능하다.
- 한번의 산책에는 한번의 리뷰만 작성 가능하다.
- 별점과 리뷰 내용을 필수로 작성한다.
- 별점 : 1~5 사이의 정수
- 리뷰 내용 : 1~255자
리뷰 내용 조회
등록된 리뷰의 별점, 리뷰 내용들을 조회할 수 있다.
- 정렬
- 리뷰 등록 시각 최신순(latest),
- 별점이 높은 순(rating)
- 타인이 등록한 비공개 산책로의 리뷰 내용을 조회할 수 없다.
리뷰 별점 조회
리뷰 수, 평균 평점, 각 별점(1~5점)의 비율을 제공한다.
- 타인이 등록한 비공개 산책로의 별점을 조회할 수 없다.
본인이 작성한 리뷰 조회
본인이 작성한 리뷰를 조회할 수 있다.
- 정렬 : 리뷰 작성 시각 최신순
- 타인이 등록한 비공개 산책로의 리뷰는 조회할 수 없다.
| 용어 | 설명 | 비고 |
|---|---|---|
| name | 크루 이름 | 1~20자 중복 불가 필수 값 |
| description | 크루 소개글 | 0~250자 필수 아님 |
| rule | 크루 규칙 | 0~250자 필수 아님 |
| crewImageUrl | 크루 대표 사진 | 필수 아님 |
| crewType | 크루의 공개 여부 설정 | 공개 : PUBLIC 비공개 : PRIVATE 필수 값 |
| password | 비공개 크루 가입을 위한 비밀번호 | 8~20자 해싱 저장 PRIVATE 크루 이면 필수 입력 PUBLIC 크루이면 null |
| capacityType | 크루 가입 인원 제한 여부 | 무제한 : LIMITED 제한 : UNLIMITED 필수 값 |
| memberLimit | 가입 인원 제한 시(capacity_type = LIMITED) 최대 가입 가능 인원 | 2~100명 |
| role | 크루 내 역할 | MANAGER, PARTICIPANT |
- PUBLIC(공개) 크루는 누구나 크루 정보, 게시글, 활동 내역을 조회할 수 있다.
- PRIVATE(비공개) 크루는 가입한 크루원만 크루 정보, 게시글, 활동 내역을 조회할 수 있다.
크루 생성
사용자는 새로운 크루를 생성할 수 있다.
- 입력 값(request body) : 크루 생성을 위해 다음 정보를 입력해야 한다
- 크루 이름
- 1 ~ 20자 (필수 입력)
- 기존 크루 이름과 중복될 수 없음
- 크루 소개글
- 0 ~ 250자 (선택)
- 크루 규칙
- 0 ~ 250자 (선택)
- 크루 공개 여부 (crew_type)
PUBLIC또는PRIVATE중 하나 선택 (필수 입력)
- 비밀번호
PRIVATE인 경우에만 입력 (8~20자, 필수)- 입력된 비밀번호는 해싱되어 저장됨
PUBLIC인 경우에는 null로 처리
- 크루 모집 인원 제한 여부
- 모집 인원 제한 여부를 true/false로 입력 (필수 입력)
- 최대 모집 인원
- 2~100명
- 모집 인원을 제한할 경우 필수로 입력
- 크루 이미지 ID
- ‘크루 이미지 등록 API’를 사용해서 전달받은 이미지ID를 입력한다.
- 필수 값 아님
- 크루 이름
- 크루를 생성한 사용자는 자동으로 해당 크루의 MANAGER로 등록된다.
- 중복되는 이름의 크루를 생성할 수 없다.
크루 수정
크루의 관리자는 크루 정보를 수정할 수 있다.
- 입력 : (크루 등록 입력 값과 동일)
- 비즈니스 로직
- 크루의 관리자만 크루 정보를 수정할 수 있다.
- 수정 요청한 최대 모집 인원이 기존에 크루에 가입한 인원보다 적으면 예외를 반환한다.
크루 탈퇴
사용자는 자신이 가입한 크루를 탈퇴할 수 있다.
- 크루의 관리자인 경우, 크루를 탈퇴할 수 없다.
크루 가입
사용자는 크루에 가입할 수 있다.
- 이미 가입한 크루에는 중복 가입할 수 없다.
- 모집인원이 다 찼을 경우 가입이 불가능하다.
PUBLIC크루 : 누구나 즉시 가입 가능PRIVATE크루 : 올바른 비밀번호를 입력해야 가입 가능- 크루에 가입한 사용자는 자동으로 해당 크루의 PARTICIPANT로 가입된다.
크루 이름 중복 체크
동일한 크루 이름이 이미 있는지 확인한다.
- 크루 이름은 시스템 내에서 고유해야 한다.
크루의 상세 정보 조회
특정 크루의 상세 정보를 보여주고, 해당 주 동안 크루원 전체의 총 산책 거리와 시간을 집계하여 제공한다.
- 사용자는 가입하지 않은 비공개 크루의 피드를 조회할 수 없다.
- 조회 시점의 해당 주(월요일~일요일) 기준으코 크루원 전체의 산책 기록을 합산하여 거리(km)와 시간(시)를 소수점 아래 2자리까지 반올림하여 표시한다.
크루 피드 조회
크루원들의 산책 기록을 조회한다.
- 사용자는 가입하지 않은 비공개 크루의 피드를 조회할 수 없다.
- 정렬 : 산책 완료 시점을 기준으로 최신순으로 정렬된다.
- 커서 기반 페이징을 사용한다.
크루원 랭킹 조회
크루원들의 산책 랭킹을 거리 또는 시간 기준으로 조회한다. 특정 기간(일간/주간/월간)에 대한 랭킹을 제공한다.
- 사용자는 가입하지 않은 비공개 크루의 랭킹을 조회할 수 없다.
- 정렬
- 거리 : 총 산책 거리가 긴 순서대로 정렬된다.
- 시간 : 총 산책 시간이 긴 순서대로 정렬된다.
- 동률 : 거리나 시간이 같으면 멤버 ID 오름차순으로 정렬된다.
- 기간 : 해당 주의 시작은 월요일, 월의 시작은 1일 이다.
- 기록 없는 멤버 : 해당 기간 동안 산책 기록이 없는 크루원도 랭킹에 포함되며, 이들의 거리와 시간은 0으로 처리된다.
- 커서 기반 페이징을 사용한다.
추천 크루 조회
크루원들의 일주일간의 산책 기록을 기준으로 크루를 조회한다.
- 조회 요청한 사용자가 가입한 크루는 조회되지 않는다.
- 정렬
- 산책 기록 수 : 산책 기록이 많은 순으로 정렬된다.
- 수정 시간 : 산책 기록의 수가 같다면 수정 시간의 오름차 순으로 정렬한다.
- 크루 아이디 : 산책 기록, 수정 시간이 같으면 크루 아이디 오름차 순으로 정렬한다.
- 기간 : 해당 주의 월요일 00:00 - 금요일 23:59
- 커서 기반 페이징을 사용한다.
| 용어 | 설명 | 비고 |
|---|---|---|
| capacityType | 인원 제한 여부 | 무제한 : LIMITED 제한 : UNLIMITED 필수 값 |
| memberLimit | 가입 인원 제한 시(capacity_type = LIMITED) 최대 가입 가능 인원 | 2~100명 |
| date | 산책 예정 날짜 | LocalDate |
| time | 산책 예정 시간 | LocalTime |
| cowalkParticipation | 같이 산책하기 참여자 | 한 사용자는 여러 모집글에 참여 가능 |
| cowalkComment | 모집글에 달린 댓글 정보 | 댓글 목록은 모집글 하위 |
같이 산책하기 모집글 작성
같이 산책하기 모집글을 작성할 수 있다.
- 해당 크루에 가입한 사용자만 모집글을 작성할 수 있다.
- 모집 가능 인원은 2~100으로 제한한다.
- 산책하기 모집글을 작성한 사람은 모집글 작성과 동시에 같이 산책하기에 자동으로 참여한다.
같이 산책하기 참여
같이 산책하기에 참여할 수 있다.
- 해당 크루에 가입한 사용자만 참여할 수 있다.
- 모집 인원이 다 찼을 경우 참여할 수 없다.
같이 산책하기 모집글에 댓글 작성
모집글에 댓글을 작성할 수 있다.
- 해당 크루에 가입한 사용자만 댓글을 작성할 수 있다.
같이 산책하기 모집글 전체 조회
같이 산책하기 모집글 전체를 페이징하여 제공한다.
- 정렬 : 모집글 작성 시각 기준 내림차순
같이 산책하기 모집글 단일 조회
특정 모집글을 제공한다.
- 가입하지 않은 비공개 크루의 모집글은 조회할 수 없다.
같이 산책하기 모집글 댓글 조회
특정 모집글의 댓글을 페이징하여 제공한다.
- 가입하지 않은 비공개 크루의 모집글 댓글을 조회할 수 없다.
- 정렬 : 댓글 작성 시각 기준 내림차순
- 무조건 커서 기반 페이징 & 무한 스크롤 방식을 사용한다.
Query String
| key | value | 비고 |
|---|---|---|
| size | 한 페이지에 가져올 데이터 수 | 기본 값 : 10 |
| lastId | 마지막으로 조회된 항목의 ID (커서 역할) | 첫 페이지 : 경우 전달하지 않음 다음 페이지 요청 시 : 마지막으로 받은 데이터의 ID를 전달 |
응답 형식
{
"data": [
{},
{},
],
"hasNext": true
}- data : 조회된 데이터 목록 (리스트 형태)
- hasNext : 다음 페이지가 존재하는지 여부 (true or false)
다양한 크루 활동이 가능하며, 산책중인 크루원을 실시간으로 확인할 수 있습니다.
|
|
|
|
| 7. 크루 활동 | 8. 함께 산책 중인 크루원 확인 | 9. 함께 산책할 크루원 모집 | 10. 함께 산책 참여 |
|
크루를 만들거나 원하는 크루에 가입할 수 있습니다. |
함께 산책 중인 크루원을 실시간으로 확인할 수 있습니다. |
함께 산책할 크루원을 모집할 수 있습니다. |
함께 산책에 참여하고 함께 산책 중인 크루원을 실시간으로 확인할 수 있습니다. |









