여러 스터디 모임을 조회하고 생성, 관리할 수 있는 플랫폼입니다.
꾸준한 스터디 참여가 힘들다면 스터디뱃지로 성공해보세요!
출석률에 따른 💰벌금/보상 시스템💰이 적극적인 참여를 도와줍니다.
일정 등록, 출석 체크, 출석률에 따른 벌금과 보상 기능,
이달의 출석왕 선정 등으로 스터디 모임을 적극적이고 재밌게 진행해보세요!
| 한슬 | 민호 | 윤호 |
|---|---|---|
|
|
|
|
| 일정/장소/알림 | 스터디 채널/스터디원/출석 | 회원가입/로그인/결제/배포 |
| 분류 | 기술 | 활용 |
|---|---|---|
| 프로그래밍 언어 | ||
| 빌드 도구 | ||
| 프레임워크 | ||
| 라이브러리/모듈 | 보안 | |
| 배치 처리 | ||
| 알림 | ||
| 스케줄링 | ||
| 로그인 | ||
| 로그인 | ||
| 테스트 도구 | ||
| 인증/인가 | 로그인 | |
| 로그인 | ||
| 데이터베이스 | ||
| 클라우드 서비스 | 서버 | |
| 데이터베이스 서버 | ||
| 파일 저장 | ||
| 서버 관리 | ||
| CI/CD | CI | |
| CD | ||
| 배포 | 보안 인증서 | |
| Reverse Proxy, HTTP to HTTPS | ||
| 문서 | ||
| 도구 | ||
| 프로젝트 이슈 관리 |
| 도구 | 활용 |
|---|---|
| 진행상황 공유 | |
| 문서 정리 | |
| 음성 회의 |
| 기능 | 설명 |
|---|---|
| 회원 관리 | 회원가입 및 로그인 |
| 소셜 로그인(카카오, 네이버) | |
| 결제 기능 지원 | |
| 회원 정보 수정 | |
| 비밀번호 재설정 | |
| 스터디 그룹 관리 | 스터디 모임 생성 및 관리 |
| 참가자 승인, 거절 | |
| 참가자 역할 분담 및 퇴출 | |
| 이달의 출석왕 선정 | |
| 출석 체크 및 통계 | 출석 체크 10분전 리마인드 알림 기능 |
| 일정의 출석 체크 기능 | |
| 출석률에 따른 환급 포인트 제공 | |
| 출석률 통계 | |
| 일정 관리 | 스터디 리더가 단일 일정 및 반복 일정 등록, 수정, 삭제 |
| 일정 조회 | |
| 일정 관련 스터디 멤버에게 알림 기능 | |
| 오프라인 일정일 경우 장소 선택 가능 | |
| 알림 시스템 | 실시간 알림 (SSE 사용) |
| 알림 조회 기능 | |
| 알림 읽음 처리 |
| API Category | Description |
|---|---|
| 🗺️ Place API | 장소 정보를 저장하고 조회할 수 있는 기능을 제공합니다. 오프라인 일정 시 장소를 지도에 표시할 수 있습니다. |
| 📅 Schedule API | 일정 관리 기능을 제공합니다. 단일 일정과 반복 일정을 저장, 조회, 수정, 삭제할 수 있습니다. |
| 🔔 Notification API | 사용자에게 알림을 보내고 조회할 수 있는 기능을 제공합니다. SSE를 사용하여 실시간 알림을 구현합니다. |
by Hanseul
- API 엔드포인트:
/api/places(POST) - 설명: 새로운 장소를 저장하는 API
- 요청 형식:
{ "name": "서울 타워", "lat": 37.5511694, "lng": 126.9882266 } - 응답 형식:
{ "id": 1, "name": "서울 타워", "lat": 37.5511694, "lng": 126.9882266, "address": "서울특별시 용산구" }
장소 저장 flow
- 지도 api에서 선택한 장소 저장
- 위도 값(lat)> -90 ~ 90
- 경도 값(lng)> -180 ~ 180
- 만일 이전에 같은 위/경도 값으로 저장한 장소가 존재할 때?
- 이름이 같으면 그대로 db에서 return
- 이름이 같지 않으면 이름 수정 후 return
- 주소는 위/경도 전환 값이므로 달라지지 않았을 것이라고 생각해두고 진행.
- API 엔드포인트:
/api/places/{id}(GET) - 설명: 저장된 장소를 조회하는 API
- 응답 형식:
{ "id": 1, "name": "서울 타워", "lat": 37.5511694, "lng": 126.9882266, "address": "서울특별시 용산구" }
by Hanseul
스터디 채널의 일정을 관리하는 API입니다. 단일 일정과 반복 일정을 저장, 조회, 수정, 삭제할 수 있습니다.
- API 엔드포인트:
/api/study-channels/{studyChannelId}/single-schedules(POST) - 설명: 특정 스터디 채널의 단일 일정을 저장하는 API
- 요청 형식:
{ "memberId": 2, "scheduleName": "스터디 모임", "scheduleContent": "알고리즘 스터디", "scheduleDate": "2023-08-01", "scheduleStartTime": "18:00", "scheduleEndTime": "20:00", "placeId": 1 } - 응답:
HTTP 201 Created
- API 엔드포인트:
/api/study-channels/{studyChannelId}/repeat-schedules(POST) - 설명: 특정 스터디 채널의 반복 일정을 저장하는 API
- 요청 형식:
{ "memberId": 2, "scheduleName": "정기 회의", "scheduleContent": "프로젝트 진행상황 공유", "scheduleDate": "2023-08-01", "scheduleStartTime": "10:00", "scheduleEndTime": "11:00", "repeatCycle": "WEEKLY", "repeatEndDate": "2023-12-31", "placeId": 1 } - 응답:
HTTP 201 Created
- API 엔드포인트:
/api/study-channels/{studyChannelId}/schedules(GET) - 설명: 특정 스터디 채널에 존재하는 모든 일정을 조회하는 API
- 응답 형식:
[ { "id": 1, "scheduleName": "스터디 모임", "scheduleContent": "알고리즘 스터디", "scheduleDate": "2023-08-01", "scheduleStartTime": "18:00", "scheduleEndTime": "20:00", "isRepeated": false, "placeId": 1 }, { "id": 2, "scheduleName": "정기 회의", "scheduleContent": "프로젝트 진행상황 공유", "scheduleDate": "2023-08-01", "scheduleStartTime": "10:00", "scheduleEndTime": "11:00", "isRepeated": true, "repeatCycle": "WEEKLY", "repeatEndDate": "2023-12-31", "placeId": 1 } ]
- API 엔드포인트:
/api/study-channels/{studyChannelId}/schedules(GET) - 설명: 특정 스터디 채널에 존재하는 일정을 연도와 월 기준으로 조회하는 API
- 요청 파라미터:
year: 조회할 연도month: 조회할 월
- 예시:
/api/study-channels/1/schedules?year=2024&month=07 - 응답 형식: 위와 동일
- API 엔드포인트:
/api/study-channels/{studyChannelId}/single-schedules/{scheduleId}(GET) - 설명: 스터디 채널에 존재하는 단일 일정의 상세 정보를 조회하는 API
- 응답 형식:
{ "id": 1, "scheduleName": "스터디 모임", "scheduleContent": "알고리즘 스터디", "scheduleDate": "2023-08-01", "scheduleStartTime": "18:00", "scheduleEndTime": "20:00", "isRepeated": false, "placeId": 1 }
- API 엔드포인트:
/api/study-channels/{studyChannelId}/repeat-schedules/{scheduleId}(GET) - 설명: 스터디 채널에 존재하는 반복 일정의 상세 정보를 조회하는 API
- 응답 형식:
{ "id": 2, "scheduleName": "정기 회의", "scheduleContent": "프로젝트 진행상황 공유", "scheduleDate": "2023-08-01", "scheduleStartTime": "10:00", "scheduleEndTime": "11:00", "isRepeated": true, "repeatCycle": "WEEKLY", "repeatEndDate": "2023-12-31", "placeId": 1 }
- API 엔드포인트:
/api/study-channels/{studyChannelId}/schedules(PUT) - 설명: 단일 일정 -> 단일 일정, 반복 일정 -> 반복 일정, 단일 일정 -> 반복 일정으로 수정하는 API
-
단일 일정 -> 단일 일정: 단일 일정의 세부 정보를 수정
- 요청 형식:
{ "memberId": 2, "scheduleId": 1, "scheduleName": "변경된 스터디 모임", "scheduleContent": "변경된 알고리즘 스터디", "scheduleDate": "2023-08-02", "scheduleStartTime": "19:00", "scheduleEndTime": "21:00", "placeId": 1, "originType": "SINGLE", "editType": "SINGLE" }
- 요청 형식:
-
반복 일정 -> 반복 일정: 반복 일정의 세부 정보를 수정
- 요청 형식:
{ "memberId": 2, "scheduleId": 2, "scheduleName": "변경된 정기 회의", "scheduleContent": "변경된 프로젝트 진행상황 공유", "scheduleDate": "2023-08-02", "scheduleStartTime": "19:00", "scheduleEndTime": "21:00", "placeId": 1, "repeatCycle": "WEEKLY", "repeatEndDate": "2023-12-31", "originType": "REPEAT", "editType": "REPEAT" }
- 요청 형식:
-
단일 일정 -> 반복 일정: 단일 일정을 반복 일정으로 변경
- 요청 형식:
{ "memberId": 2, "scheduleId": 1, "scheduleName": "변경된 스터디 모임", "scheduleContent": "변경된 알고리즘 스터디", "scheduleDate": "2023-08-02", "scheduleStartTime": "19:00", "scheduleEndTime": "21:00", "placeId": 1, "repeatCycle": "WEEKLY", "repeatEndDate": "2023-12-31", "originType": "SINGLE", "editType": "REPEAT" }
- 요청 형식:
- 응답:
HTTP 200 OK
- API 엔드포인트:
/api/study-channels/{studyChannelId}/schedules/isAfterEvent(PUT) - 설명: 반복 일정을 단일 일정으로 수정하는 API
- 요청 형식:
{ "memberId": 2, "scheduleId": 2, "scheduleName": "변경된 정기 회의", "scheduleContent": "변경된 프로젝트 진행상황 공유", "scheduleDate": "2023-08-02", "scheduleStartTime": "19:00", "scheduleEndTime": "21:00", "placeId": 1 } - 요청 파라미터:
Same: 이후 반복 일정도 동일하게 수정할지 여부 (true/false)
- 설명:
-
Same이true일 경우: 이후 반복 일정도 동일하게 수정flow가 궁금하다면?
- 선택한 수정 일정이 처음 날짜일 때:
- 기존 반복 일정 삭제
- 새로운 단일 일정 저장
- 선택한 수정 일정이 마지막 날짜일 때:
- 기존 반복 일정의 종료 날짜를 이전 주기로 변경
- 새로운 단일 일정 저장
- 선택한 수정 일정이 시작 날짜나 마지막 날짜가 아닐 때:
- 시작 날짜 바로 다음 주기일 때:
- 시작 날짜와 선택한 날짜를 단일 일정으로 저장
- 기존 반복 일정 삭제
- 끝나는 날짜 바로 전 주기일 때와 중간 날짜일 때:
- 선택한 날짜를 단일 일정으로 저장
- 기존 반복 일정의 종료 날짜를 이전 주기로 변경
- 시작 날짜 바로 다음 주기일 때:
- 선택한 수정 일정이 처음 날짜일 때:
-
Same이false일 경우: 선택한 날짜만 단일 일정으로 수정 + 기존 반복 일정 변경flow가 궁금하다면?
- 선택한 수정 일정이 처음 날짜일 때:
- 기존 반복 일정의 시작 날짜를 다음 주기로 변경
- 새로운 단일 일정 저장
- 선택한 수정 일정이 마지막 날짜일 때:
- 기존 반복 일정의 종료 날짜를 이전 주기로 변경
- 새로운 단일 일정 저장
- 선택한 수정 일정이 시작 날짜나 마지막 날짜가 아닐 때:
- 시작 날짜 바로 다음 주기일 때:
- 시작 날짜와 선택한 날짜를 단일 일정으로 저장
- 기존 반복 일정의 종료 날짜를 이전 주기로 변경
- 끝나는 날짜 바로 전 주기일 때:
- 끝나는 날짜와 선택한 날짜를 단일 일정으로 저장
- 기존 반복 일정의 종료 날짜를 이전 주기로 변경
- 중간 날짜일 때:
- 기존 반복 일정을 두 개의 반복 일정으로 분할
- 선택한 날짜를 단일 일정으로 저장
- 시작 날짜 바로 다음 주기일 때:
- 선택한 수정 일정이 처음 날짜일 때:
-
- 응답:
HTTP 200 OK
- API 엔드포인트:
/api/study-channels/{studyChannelId}/schedules(DELETE) - 설명: 단일 일정을 삭제하는 API
- 요청 형식:
{ "memberId": 2, "scheduleId": 1, "selectedDate": "2023-08-01" } - 응답:
HTTP 200 OK
- API 엔드포인트:
/api/study-channels/{studyChannelId}/schedules/isAfterEvent(DELETE) - 설명: 반복 일정을 삭제하는 API
- 요청 형식:
{ "memberId": 2, "scheduleId": 2, "selectedDate": "2023-08-01" } - 요청 파라미터:
Same: 이후 반복 일정도 동일하게 삭제할지 여부 (true/false)
- 설명:
-
Same이true일 경우: 이후 반복 일정도 동일하게 삭제Details
flow가 궁금하다면?
- 선택한 삭제 일정이 처음 날짜일 때:
- 기존 반복 일정 삭제
- 선택한 삭제 일정이 마지막 날짜일 때:
- 기존 반복 일정의 종료 날짜를 이전 주기로 변경
- 선택한 삭제 일정이 시작 날짜나 마지막 날짜가 아닐 때:
- 시작 날짜 바로 다음 주기일 때:
- 시작 날짜와 선택한 날짜를 단일 일정으로 저장
- 기존 반복 일정 삭제
- 끝나는 날짜 바로 전 주기일 때와 중간 날짜일 때:
- 선택한 날짜를 단일 일정으로 저장
- 기존 반복 일정의 종료 날짜를 이전 주기로 변경
- 시작 날짜 바로 다음 주기일 때:
- 선택한 삭제 일정이 처음 날짜일 때:
-
Same이false일 경우: 선택한 날짜만 삭제Details
flow가 궁금하다면?
- 선택한 삭제 일정이 처음 날짜일 때:
- 기존 반복 일정의 시작 날짜를 다음 주기로 변경
- 선택한 삭제 일정이 마지막 날짜일 때:
- 기존 반복 일정의 종료 날짜를 이전 주기로 변경
- 선택한 삭제 일정이 시작 날짜나 마지막 날짜가 아닐 때:
- 시작 날짜 바로 다음 주기일 때:
- 시작 날짜와 선택한 날짜를 단일 일정으로 저장
- 기존 반복 일정의 종료 날짜를 이전 주기로 변경
- 끝나는 날짜 바로 전 주기일 때:
- 끝나는 날짜와 선택한 날짜를 단일 일정으로 저장
- 기존 반복 일정의 종료 날짜를 이전 주기로 변경
- 중간 날짜일 때:
- 기존 반복 일정을 두 개의 반복 일정으로 분할
- 선택한 날짜를 단일 일정으로 저장
- 시작 날짜 바로 다음 주기일 때:
- 선택한 삭제 일정이 처음 날짜일 때:
-
- 응답: `HTTP 200 OK
by Hanseul
알림을 관리하는 API입니다. 클라이언트와의 세션 연결, 알림 조회, 읽음 처리, 안 읽은 알림 조회 기능을 제공합니다.
- API 엔드포인트:
/api/notifications/subscribe(GET) - 설명: 클라이언트 측에서 세션을 연결하는 API
- 요청 헤더:
Last-Event-ID(선택): 마지막 이벤트 ID
- 응답:
SseEmitter객체를 반환하여 실시간 이벤트 스트림을 연결합니다.
- API 엔드포인트:
/api/notifications(GET) - 설명: 사용자에게 온 모든 알림을 조회하는 API
- 요청 파라미터:
page(선택, 기본값: 1): 조회할 페이지 번호
- 정렬 방식:
createdAt내림차순 - 응답 형식:
{ "content": [ { "id": 1, "notificationType": "SCHEDULE_CREATE", "content": "새로운 일정이 생성되었습니다.", "url": "/schedules/1", "isRead": false, "createdAt": "2023-08-01T10:00:00" }, { "id": 2, "notificationType": "SCHEDULE_UPDATE", "content": "일정이 수정되었습니다.", "url": "/schedules/2", "isRead": false, "createdAt": "2023-08-01T09:00:00" } ], "pageable": { "sort": { "sorted": true, "unsorted": false, "empty": false }, "pageNumber": 0, "pageSize": 20, "offset": 0, "paged": true, "unpaged": false }, "totalElements": 2, "totalPages": 1, "last": true, "size": 20, "number": 0, "sort": { "sorted": true, "unsorted": false, "empty": false }, "numberOfElements": 2, "first": true, "empty": false }
- API 엔드포인트:
/api/notifications(PATCH) - 설명: 사용자가 알림을 읽음 처리하는 API
- 요청 형식:
{ "notificationId": 1 } - 응답:
HTTP 200 OK
- API 엔드포인트:
/api/notifications/unread(GET) - 설명: 사용자에게 온 알림 중 안 읽은 알림을 조회하는 API
- 요청 파라미터:
page(선택, 기본값: 1): 조회할 페이지 번호
- 정렬 방식:
createdAt내림차순 - 응답 형식: 위의 알림 전체 조회 응답 형식과 동일
| 순번 | 담당자 | 내용 | 경로 |
|---|---|---|---|
| 1 | 정한슬 | 테이블에 NULL 값 설정 관련 고민 | schedule_field_null |
| 2 | 정한슬 | AWS 로드밸런서를 통해 https로 배포시 unhealthy 문제 | health_check_unhealthy |
| 3 | 정한슬 | https/ ssl 관련 재설정(비용 문제) | https_ssl |
| 4 | 정한슬 | Nginx를 프록시 서버로 두었을 경우 SSE 관련 문제 | server-sent-event_with_nginx |
