Skip to content

prgrms-web-devcourse-final-project/WEB4_5_DOD_FE

Repository files navigation

🐰 클릭 몇 번으로 일정 합의 완료, 이때어때 (Ittaeok)

효율적인 일정 조율을 위한 통합 스케줄링 플랫폼 개인과 그룹의 일정 조율 과정에서 발생하는 비효율성을 해결하고 모든 구성원이 참여하지 못하는 현실적인 상황을 고려하여 유연한 일정 관리 서비스를 제공합니다.

Frame_2608805

프로젝트 소개

  • 바쁜 현대인들의 일정 잡기를 클릭 몇번으로 쉽고 간편하게 해주는 서비스입니다.
  • 나의 가능한 시간을 등록하고 다른 모임원들의 시간을 취합하여 가장 빠른 일정, 긴 시간 볼 수 있는 일정을 확인하고 정할 수 있습니다.
  • (1회성 모임) 1번만 만나는 모임 일정을 조율할 수 있습니다.
  • (그룹 모임) 자주 만나는 모임을 그룹으로 설정하고 해당 그룹원끼리 일정을 계속 생성할 수 있습니다.
  • (오프라인 모임) 모임원들의 출발역 등록 후 모두의 출발지에서 가장 중간 지점을 계산하여 추천 목록을 보여주고 투표하여 중간 지점을 정할 수 있습니다.
  • (온라인 모임) 온라인 미팅 플랫폼을 정하지 못했다면 줌 회의장을 생성해 줍니다.
  • 정해진 일정에서는 다양한 워크스페이스 링크를 등록하여 사용할 수 있습니다.
  • 마이페이지에서 내가 자주 등록하는 역, 기본 정해진 시간을 등록하여 불러오기를 통해 더 쉽게 일정 등록에 사용할 수 있습니다.

팀원 구성

박상윤 박은서 박준규 현혜주 황수지
@ygvbhy @snowari @parkjungyuxx @hxezu @ssujissuji

📦 Tech Stack

  • Next.js v15 (App Router)
  • TailwindCSS
  • TanStack Query
  • Zustand

🌳 프로젝트 구조

src
├── app
│   ├── auth
│   ├── favicon.ico
│   ├── globals.css
│   ├── group
│   ├── layout.tsx
│   ├── loading.tsx
│   ├── meeting
│   ├── mypage
│   ├── not-found.tsx
│   ├── page.tsx
│   ├── README.md
│   ├── schedule
│   └── utils
├── assets
│   ├── icon
│   ├── images
│   └── README.md
├── components
│   ├── auth
│   ├── dashboard
│   ├── election
│   ├── feature
│   ├── home
│   ├── landing
│   ├── layout
│   ├── mypage
│   └── ui
├── lib
│   ├── api
│   ├── profileImages.ts
│   └── utils.ts
├── middleware.ts
├── providers
│   └── TanstackProvider.tsx
├── stores
│   └── authStores.ts
├── svg.d.ts
└── types
    ├── group.d.ts
    ├── kakao.d.ts
    ├── kakaoSearch.ts
    ├── README.md
    ├── schedule.d.ts
    └── station.d.ts

역할 분담

🧛박상윤 ( Team Leader )

이벤트 페이지 기능 구현

  • 드래그 기반 시간대 선택 및 해제
    • 기존 클릭 방식의 비효율성을 개선하기 위해 드래그 이벤트 기반의 시간대 선택 기능 설계
    • 최대 7개의 선택 라인 중 1개 라인 드래그 시, 다른 라인은 드래그 불가하도록 제약 처리
    • 이미 선택된 영역 재선택 시 해제되도록 XOR 연산 로직 적용
    • 백엔드와 협의하여 시간 데이터를 TimeBit(16진수) 형식으로 변환·전송하도록 설계 (["09:00", "09:30"] → TimeBit 변환 후 API 송신)
  • 즐겨찾는 시간대 불러오기 및 적용
    • 마이페이지에 저장된 즐겨찾기 시간대를 불러와 이벤트 시간표에 즉시 적용
    • 기존 데이터와 병합 시에도 XOR 로직 유지로 중복·겹침 문제 방지
    • 상태 관리 구조 최적화로 UI 즉시 반영 구현
  • 모든 참여자 시간표 통합 시각화
    • 참여자 전체의 시간 데이터를 집계 후, 겹치는 정도를 색상 농도로 표현
    • 인원이 많을수록 진하게, 적을수록 연하게 표시하는 시각화 구현
    • Tailwind CSS로 반응형 UI 구현 및 렌더링 최적화
    • TanStack Query의 interval 기능으로 5초 주기 API 호출, 실시간 갱신 효과 제공
  • 일정 조율 결과 산출 및 추천
    • 전체 참여자의 가능 시간대를 분석하여
      • ‘가장 오래 만날 수 있는 시간’
      • ‘가장 빨리 만날 수 있는 시간’ 두 기준으로 각 3개의 추천 시간대 도출
  • 일정 확정 기능
    • 조율 결과 중 선택된 시간대를 이벤트의 최종 일정으로 확정
    • 다른 참여자가 재확정 시도 시, 경고 메시지 출력 후 홈 화면으로 이동 처리

이벤트 초대 기능

  • 카카오 Open API를 활용하여 초대 링크를 카카오톡으로 공유
  • 초대 링크에 포함된 eventId, groupId를 파싱하여 자동 참여 처리
  • 그룹 일정(group=true)일 경우, 해당 그룹 가입과 이벤트 참여를 동시에 처리
  • 비로그인 사용자는 localStorage에 리다이렉트 경로 저장 후, 로그인 완료 시 해당 URL로 복귀

🦸🏻‍♀️박은서

아이디어 기획

  • "when2meet 의 핵심 기능인 모임 시간 조율 서비스 + 흩어져 있는 워크스페이스 통합 관리, 모임 참여자 출발지를 기반으로 최적 중간 지점을 찾아주는 서비스 컨셉 발안
  • 사용자 시나리오 설계 및 기능 범위 제안

ui/ux 설계

  • 초기 와이어 프레임 및 일정 상세 페이지, 투표 페이지 레이아웃 설계

모임 중간 지점 찾기 & 모임 장소 투표 플로우 구현

  • 출발지 지정하기
    • 카카오 장소 검색 API를 이용해 역/장소 검색
    • 키워드 검색 결과에서 검색 키워드와 일치하는 부분 강조
    • 사용자가 선택한 장소 좌표를 API 로 제출해 내 출발지 등록
  • 출발지 등록 완료 및 대기 단계
    • 일정 멤버 여부 검증 (비멤버 접근 시 토스트 알림 & 홈으로 리다이렉트)
    • 일정 멤버 중 출발지 미등록 인원 수를 Axios + TanStack Query 기반 API 연동으로 실시간(5초 폴링)으로 반영
    • 카카오톡 공유 기능 제공
      • 미등 록 인원 있을 경우 투표 링크 공유, 전원 등록 완료시 중간 장소 투표 분기
    • Kakao Map 연동으로 등록한 위치 표시
  • 중간 지점 투표 단계
    • 일정에 포함된 멤버 여부 검증
    • 지정한 출발 장소의 좌표와 중간 지점의 좌표를 Odsay API를 통해 예상 소요 시간 계산
    • 투표 진행 상태 표시
      • 투표 전 : 투표 가능, 선택된 후보가 없으면 투표 버튼 비활성화
      • 투표 후 : 재투표 불가
    • 아직 투표하지 않은 멤버가 있는 경우 인원 수를 Axios + TanStack Query 기반 API 연동으로 실시간(5초 풀링)으로 반영
    • 모든 멤버가 투표를 완료하면 투표 결과 보기 버튼 활성화
    • 출발 위치와 중간 위치가 같은 경우 예외 처리 (0분)
  • 중간 지점 투표 결과
    • 일정에 포함된 멤버 여부 검증
    • 투표에서 가장 표를 많이 받은 역( WINNER) 표시
    • 내 위치 기준, 해당 역 까지 예상 소요 시간 계산
    • Kakao Map에 해당 장소 표시

🥷박준규

그룹 멤버 초대 기능 및 카카오톡 공유하기 API 구현

  • 카카오톡 공유 API 연동으로 손쉬운 초대 흐름 제공
  • 초대 링크에 fromInvite=true 쿼리 파라미터 포함 → 자동으로 그룹 멤버로 등록
  • 비로그인 사용자는 redirect URL을 localStorage에 저장 → 로그인 후 원래 위치로 자동 복귀
  • 초대 여부 및 로그인 상태를 기준으로 4가지 상황(초대/비초대 , 로그인/비로그인)을 분기 처리
  • 초대 흐름을 직관적으로 구성해 사용자 혼란을 줄이고 진입 경험을 자연스럽게 연결

그룹 페이지

  • 그룹 일정 불러오기 기능 구현
    • 불러온 일정 데이터를 지나간 일정과 다가올 일정으로 분리
    • UX 개선을 위해 다가올 일정은 가장 가까운 미래부터 오름차순 정렬, 지난 일정은 가장 최근 지난 것부터 내림차순 정렬
    • 시각적으로 UI를 다르게 표현해 사용자가 구분하기 쉽게 설계
    • 그룹 페이지에서 각 일정 링크 복사 기능 구현으로 초대 공유 편의성 향상.
  • 그룹 통계 페이지
    • 그룹 통계 시각화 (Chart.js 활용)
    • 통계 데이터가 없는 경우 빈 상태 UI 구성 및 신규 일정 생성 유도
  • 그룹 멤버 페이지
    • 그룹 멤버 목록 및 권한 관리 기능
      • 방장 임명 / 회수
      • 멤버 강제 내보내기
        • 그룹 멤버가 아닌 사용자는 대시보드 페이지로 리다이렉트 처리
  • 그룹 페이지 프리패칭 최적화
    • 통계, 그룹원, 그룹 일정 데이터를 페이지 진입 전에 프리패칭
    • 일정은 scheduleId별로 쿼리 키 분리 → 부분 캐싱 및 리패칭 용이
    • 로딩 최소화로 빠른 초기 렌더링과 사용자 경험 개선

온라인 일정 및 회의장 관리 기능

  • 온라인 회의장 관리 기능 구현
    • 사용자가 기존에 보유한 회의 링크가 없는 경우 → 버튼 클릭 한 번으로 Zoom 회의 링크 자동 생성 및 등록 → 복잡한 절차 없이 즉시 회의장 생성 가능, 사용자 편의성 향상
    • 기존 회의 링크가 있는 경우 → 직접 입력하여 등록 가능
  • 일정 수정 및 삭제 기능 구현
  • 일정 상세 정보 수정 및 삭제 처리 UI 구현
  • 플랫폼별 URL 유효성 검사 적용
    • Zoom, Google Meet 등 주요 플랫폼 형식의 URL만 등록 가능하도록 제한
    • 잘못된 URL 입력 방지 → 실수로 인한 오류 최소화

워크스페이스 관리 기능

  • 워크스페이스 등록 / 수정 / 삭제 기능 구현
    • 이름, 플랫폼, 회의 링크 등 워크스페이스 정보 입력 및 관리
  • URL 유효성 검사 적용
    • 잘못된 회의 플랫폼 링크 등록 방지
    • 사용자 경험 개선 및 안정적인 사용 유도

커스텀 일정 캘린더 컴포넌트 구현

  • 주간 → 월간 확장 지원 가능한 일정 캘린더 컴포넌트 개발
  • Props 기반 단일/다중 날짜 선택 기능 제공 → 다양한 일정 선택 케이스에 대응 가능
  • 재사용성과 확장성을 고려한 컴포넌트 설계로 다른 페이지에서도 활용 가능

상태 관리 및 데이터 최적화

  • Axios + TanStack Query 조합으로 group, schedule 관련 API 연동
  • 쿼리 키 기반 캐싱 → invalidateQueries를 통한 최신 데이터 유지 (새로고침 없이 상태 동기화)
  • 인증 구조상 fetch를 사용할 수 없는 환경에서 효율적인 API 관리와 비동기 흐름 제어 구현

비로그인 접근 제어

  • 그룹, 일정 등 주요 페이지에 비로그인 사용자 접근 제한
  • 로그인 여부 확인 후 미인증 사용자는 로그인 페이지로 리디렉션
  • 보안 강화 및 사용자 흐름 제어

랜딩 페이지 구현 (GSAP 기반 인터랙션 적용)

  • GSAP(ScrollTrigger 포함)를 활용해 스크롤 기반 인터랙션 및 애니메이션 구현
    • 섹션별 콘텐츠 등장, 요소 강조, 자연스러운 사용자 흐름 유도
  • 시선 흐름을 고려한 동적 UI 구성으로 사용자의 관심을 끌고 서비스 메시지를 효과적으로 전달
  • 반응형 레이아웃 및 텍스트/이미지 애니메이션 최적화 → 다양한 디바이스에서도 일관된 사용자 경험 제공

로딩페이지 구현

  • 글로벌 로딩 컴포넌트 구현

퍼블리싱 작업

  • 대시보드 및 일정 페이지
  • 그룹 메인/생성/수정/통계/구성원 관리/안내 페이지
  • 일정 상세/수정 페이지
  • 공통 UI 컴포넌트(Button, Calendar, ScheduleCard 등) 퍼블리싱

🧝‍♀️현혜주

디자인 총괄

  • 서비스 아이덴티티 및 브랜드 톤앤매너 정의
  • 컬러 시스템 및 폰트 가이드 구축
  • UI/UX 전체 설계 및 구조 기획 (반응형)
  • 컴포넌트 기반 디자인 시스템 제작
  • 3D 비주얼 요소 제작 및 적용
  • UI 일관성 확보를 위한 디자인 QA 수행

사용자 인증

  • 로그인 페이지 UI 구현
  • 소셜 로그인 플로우 설계(Google / Kakao)
  • 콜백 처리 및 사용자 인증 상태 연동 흐름 설계
  • TanStack Query를 활용한 사용자 정보 패칭 로직 구축
  • Axios Instance를 활용한 쿠키 기반 인증 구현과 인터셉터 처리 설계
  • 비로그인 접근 제어 함수 구현

대시보드 및  일정 리스트 페이지

  • 선택된 날짜 기준으로 개인화된 일정 및 그룹 정보 조회
  • TanStack Query를 활용해 데이터 페칭 및 캐싱 최적화로 성능 및 UX 향상
    • 월 단위 일정 데이터를 캐싱하여 동일 월 내 재요청 방지
    • 쿼리의 select 옵션 활용으로 필요한 데이터만 추출, 불필요한 렌더링 최소화
  • 로딩 시 스켈레톤 UI 제공으로 부드러운 화면 전환 구현
  • 일정 미존재 시 빈 상태 UI 구성 및 신규 일정/그룹 생성 유도
  • 일정 삭제 시 invalidateQueries를 활용해 실시간 데이터 동기화 처리

오프라인 일정 상세 페이지

  • 모임 장소 유무에 따른 UI 분기 처리
  • 카카오맵 API 연동, 지정된 위도·경도 기반 위치 표시
  • 모임 장소 편집 기능 구현
  • 검색 기반 모임 장소 설정
    • 카카오 장소 검색 API를 통해 실시간 장소 목록 제공 및 선택 처리
    • 사용자 입력에 debounce 기법을 적용해 불필요한 API 호출 방지

그룹 생성/수정 페이지

  • 그룹 생성/수정/삭제 기능 구현
  • 각 작업 성공 시 TanStack Query로 관련 데이터 캐시를 실시간으로 무효화하여 최신 상태 유지
  • 그룹 ID에 따른 기존 그룹 이름 및 설명 데이터를 불러와 초기 렌더 시 폼에 자동 반영

모임 유형/그룹 일정 추가 방식 선택 페이지

  • next/navigation을 활용하여 선택된 유형에 따라 적절한 페이지로 라우팅 처리
  • framer-motion을 통한 전환 애니메이션 및 Tip 컴포넌트 사용으로 UX 향상
  • 기존 개인 일정을 그룹 일정으로 이관하는 비즈니스 로직 구현
  • 개인 일정 리스트 조회 및 선택이 가능한 직관적인 UI 설계
    • TanStack Query의 useMutation을 활용하여 API 호출 후 invalidateQueries로 실시간 데이터 동기화 처리
    • 데이터가 많은 경우에도 원활한 UX 제공을 위한 스켈레톤 로딩 UI 적용

🧟‍♀️황수지

디자인 및 퍼블리싱

  • 서비스 메인 캐릭터 기획 및 디자인
  • 공통 컴포넌트 제작(alertBox, Header, Tip 등)
  • 마이페이지 퍼블리싱

마이페이지

  • 유저 정보 조회 - 프로필 수정 후에도 refetch를 통해 최신 상태로 동기화
  • 유저 프로필 이미지, 유저 이름 수정 - PATCH API와 연결하고 수정 성공시 UI에 실시간으로 반영되도록 처리
  • 근처역 등록 수정 및 저장
  • 구글 캘린더 등록 및 삭제 - 구글 계정 및 구글 캘린더 ID 유효성 검사를 한 후 등록할 수 있도록 처리
  • 로그아웃 및 탈퇴 API 연결 - 로그아웃 및 탈퇴 후 로그인 페이지로 리다이렉트

개발기간

  • 전체 개발 기간 : 2025. 06. 26 ~ 2025. 07. 31
  • 디자인 및 퍼블리싱 : 2025. 06. 26 ~ 2025. 07. 09
  • 기능구현 : 2025. 07. 10 ~ 2025. 07. 31

🚀 Getting Started

npm install
npm run dev

About

프로그래머스 최종 프로젝트 7팀 FE

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 5

Languages