Skip to content

HanSeulChung/StudyBadge

 
 

Repository files navigation

Study Badge란?

여러 스터디 모임을 조회하고 생성, 관리할 수 있는 플랫폼입니다.

꾸준한 스터디 참여가 힘들다면 스터디뱃지로 성공해보세요!

출석률에 따른 💰벌금/보상 시스템💰이 적극적인 참여를 도와줍니다.

일정 등록, 출석 체크, 출석률에 따른 벌금과 보상 기능,

이달의 출석왕 선정 등으로 스터디 모임을 적극적이고 재밌게 진행해보세요!

👨‍💻 Backend Member 👨‍💻

한슬 민호 윤호
한슬
민호
윤호
일정/장소/알림 스터디 채널/스터디원/출석 회원가입/로그인/결제/배포

🚀 Tech Stack 🚀

분류 기술 활용
프로그래밍 언어
빌드 도구
프레임워크
라이브러리/모듈 보안
배치 처리
알림
스케줄링
로그인
로그인
테스트 도구
인증/인가 로그인
로그인
데이터베이스
클라우드 서비스 서버
데이터베이스 서버
파일 저장
서버 관리
CI/CD CI
CD
배포 보안 인증서
Reverse Proxy, HTTP to HTTPS
문서
도구
프로젝트 이슈 관리

🤝 Collaborative Tools 🤝

도구 활용
진행상황 공유
문서 정리
음성 회의

🖋️ ERD 🖋️

스터디뱃지 프로젝트 ERD

✨ Key Features ✨

기능 설명
회원 관리 회원가입 및 로그인
소셜 로그인(카카오, 네이버)
결제 기능 지원
회원 정보 수정
비밀번호 재설정
스터디 그룹 관리 스터디 모임 생성 및 관리
참가자 승인, 거절
참가자 역할 분담 및 퇴출
이달의 출석왕 선정
출석 체크 및 통계 출석 체크 10분전 리마인드 알림 기능
일정의 출석 체크 기능
출석률에 따른 환급 포인트 제공
출석률 통계
일정 관리 스터디 리더가 단일 일정 및 반복 일정 등록, 수정, 삭제
일정 조회
일정 관련 스터디 멤버에게 알림 기능
오프라인 일정일 경우 장소 선택 가능
알림 시스템 실시간 알림 (SSE 사용)
알림 조회 기능
알림 읽음 처리

🌠 My Features 🌠

API Category Description
🗺️ Place API 장소 정보를 저장하고 조회할 수 있는 기능을 제공합니다. 오프라인 일정 시 장소를 지도에 표시할 수 있습니다.
📅 Schedule API 일정 관리 기능을 제공합니다. 단일 일정과 반복 일정을 저장, 조회, 수정, 삭제할 수 있습니다.
🔔 Notification API 사용자에게 알림을 보내고 조회할 수 있는 기능을 제공합니다. SSE를 사용하여 실시간 알림을 구현합니다.

🗺️ Place API 🗺️

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

  1. 지도 api에서 선택한 장소 저장
    • 위도 값(lat)> -90 ~ 90
    • 경도 값(lng)> -180 ~ 180
  2. 만일 이전에 같은 위/경도 값으로 저장한 장소가 존재할 때?
    • 이름이 같으면 그대로 db에서 return
    • 이름이 같지 않으면 이름 수정 후 return
    • 주소는 위/경도 전환 값이므로 달라지지 않았을 것이라고 생각해두고 진행.

🗺️ 장소 조회

  • API 엔드포인트: /api/places/{id} (GET)
  • 설명: 저장된 장소를 조회하는 API
  • 응답 형식:
    {
      "id": 1,
      "name": "서울 타워",
      "lat": 37.5511694,
      "lng": 126.9882266,
      "address": "서울특별시 용산구"
    }

📅 Schedule API 📅

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
  1. 단일 일정 -> 단일 일정: 단일 일정의 세부 정보를 수정

    • 요청 형식:
      {
        "memberId": 2,
        "scheduleId": 1,
        "scheduleName": "변경된 스터디 모임",
        "scheduleContent": "변경된 알고리즘 스터디",
        "scheduleDate": "2023-08-02",
        "scheduleStartTime": "19:00",
        "scheduleEndTime": "21:00",
        "placeId": 1,
        "originType": "SINGLE",
        "editType": "SINGLE"
      }
  2. 반복 일정 -> 반복 일정: 반복 일정의 세부 정보를 수정

    • 요청 형식:
      {
        "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"
      }
  3. 단일 일정 -> 반복 일정: 단일 일정을 반복 일정으로 변경

    • 요청 형식:
      {
        "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)
  • 설명:
    1. Sametrue일 경우: 이후 반복 일정도 동일하게 수정

      flow가 궁금하다면?

      • 선택한 수정 일정이 처음 날짜일 때:
        • 기존 반복 일정 삭제
        • 새로운 단일 일정 저장
      • 선택한 수정 일정이 마지막 날짜일 때:
        • 기존 반복 일정의 종료 날짜를 이전 주기로 변경
        • 새로운 단일 일정 저장
      • 선택한 수정 일정이 시작 날짜나 마지막 날짜가 아닐 때:
        • 시작 날짜 바로 다음 주기일 때:
          • 시작 날짜와 선택한 날짜를 단일 일정으로 저장
          • 기존 반복 일정 삭제
        • 끝나는 날짜 바로 전 주기일 때와 중간 날짜일 때:
          • 선택한 날짜를 단일 일정으로 저장
          • 기존 반복 일정의 종료 날짜를 이전 주기로 변경

    2. Samefalse일 경우: 선택한 날짜만 단일 일정으로 수정 + 기존 반복 일정 변경

      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)
  • 설명:
    1. Sametrue일 경우: 이후 반복 일정도 동일하게 삭제

      Details

      flow가 궁금하다면?

      • 선택한 삭제 일정이 처음 날짜일 때:
        • 기존 반복 일정 삭제
      • 선택한 삭제 일정이 마지막 날짜일 때:
        • 기존 반복 일정의 종료 날짜를 이전 주기로 변경
      • 선택한 삭제 일정이 시작 날짜나 마지막 날짜가 아닐 때:
        • 시작 날짜 바로 다음 주기일 때:
          • 시작 날짜와 선택한 날짜를 단일 일정으로 저장
          • 기존 반복 일정 삭제
        • 끝나는 날짜 바로 전 주기일 때와 중간 날짜일 때:
          • 선택한 날짜를 단일 일정으로 저장
          • 기존 반복 일정의 종료 날짜를 이전 주기로 변경

    2. Samefalse일 경우: 선택한 날짜만 삭제

      Details

      flow가 궁금하다면?

      • 선택한 삭제 일정이 처음 날짜일 때:
        • 기존 반복 일정의 시작 날짜를 다음 주기로 변경
      • 선택한 삭제 일정이 마지막 날짜일 때:
        • 기존 반복 일정의 종료 날짜를 이전 주기로 변경
      • 선택한 삭제 일정이 시작 날짜나 마지막 날짜가 아닐 때:
        • 시작 날짜 바로 다음 주기일 때:
          • 시작 날짜와 선택한 날짜를 단일 일정으로 저장
          • 기존 반복 일정의 종료 날짜를 이전 주기로 변경
        • 끝나는 날짜 바로 전 주기일 때:
          • 끝나는 날짜와 선택한 날짜를 단일 일정으로 저장
          • 기존 반복 일정의 종료 날짜를 이전 주기로 변경
        • 중간 날짜일 때:
          • 기존 반복 일정을 두 개의 반복 일정으로 분할
          • 선택한 날짜를 단일 일정으로 저장

  • 응답: `HTTP 200 OK

🔔 알림(SSE, Server Sent Event) 🔔

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 내림차순
  • 응답 형식: 위의 알림 전체 조회 응답 형식과 동일

Trouble Shooting

순번 담당자 내용 경로
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

🔗 Link 🔗

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 99.9%
  • Shell 0.1%