project-thumbnail

Plandar

개인 일정관리 웹 서비스

2023-02-21~2023-06-30

프로젝트 소개

  • 인원: 3명
  • 기간: 2022.01.01 ~ 2022.02.28
  • 소개: 플랜더는 개인 일정 관리를 위한 웹 서비스입니다. 사용자는 플랜더를 통해 자신의 일정을 등록하고 관리할 수 있습니다. 달력 형태로 드래그/드롭을 통해 일정을 생성/수정할 수 있으며 카테고리/태그 기능을 통해 원하는 일정을 쉽게 찾을 수 있습니다.
  • 개인 역할
    • 월 달력 일정 랜더링 기능 구현
    • modal을 통한 일정 생성/수정 기능 구현
    • DB 스키마, API 설계 및 User 관련 API를 TDD 형식으로 구현
    • JWT를 통한 유저 인증 구현
    • typeorm-transactions를 통한 트랜잭션 처리
    • Swagger를 통한 API 문서화
    • Docker + Github Action을 통한 CI/CD 구현

기술 스택

LANGUAGE

  • typescript@^4.9.5: 정적 타이핑을 통해 코드의 안정성을 높이고 가독성을 높이기 위해 사용합니다. 제너럴, 타입 상속 둥 타입 가드를 통해 타입 안정성을 높입니다.

FRONT-END

  • react@^18.2.0: 컴포넌트 기반 스트럭처를 통해 재사용성을 높이고 가독성을 높입니다. hooks를 사용하여 비즈니스 로직을 분리하고 가독성을 높입니다.
  • @tanstack/react-query@^4.24.10: 데이터를 관리하고 캐싱을 사용하여 API 요청을 최적화합니다. 낙관적 업데이트를 통해 사전에 UI를 반영하여 사용자 경험을 향상시킵니다.
  • axios@^1.3.4: API 요청을 보내기 위해 axios를 사용합니다. interceptor를 사용하여 인증 여부를 확인합니다.
  • moment@^2.29.4: 날짜와 시간을 다루기 위해 moment를 사용합니다. moment를 사용하여 날짜 포맷을 변경하고 시간을 계산합니다.
  • zustand@^4.3.5: 상태 관리 라이브러리로 zustand를 사용합니다. zustand를 사용하여 전역 상태를 관리하고 상태 변경을 구독합니다.
  • @emotion/react@^11.10.6: emotion을 사용하여 css-in-js를 구현합니다. emotion을 사용하여 컴포넌트 스타일을 캡슐화하고 가독성을 높입니다.
  • @storybook/react@^6.5.16: storybook를 사용하여 컴포넌트의 상태에 따른 UI를 확인하며 개발을 진행합니다.

BACK-END

  • nestjs@^9.0.0: NestJS를 사용하여 서버를 구성합니다. Repository pattern을 통해 model과 service의 결합도를 낮추고 유지보수성을 높입니다.
  • @nestjs/jwt@^10.0.2: JWT를 사용하여 access token과 refresh token을 발급합니다. 해당 token을 통해 사용자 인증을 구현합니다.
  • @nestjs/swagger@^6.2.1: Swagger를 사용하여 API 문서를 자동으로 생성합니다. Swagger를 사용하여 API 요청을 테스트하고 문서를 확인합니다.
  • typeorm@^0.3.12: TypeORM을 사용하여 데이터베이스를 구축합니다. TypeORM을 사용하여 model과 schema를 매핑하고 데이터베이스를 구축합니다.
  • mysql2@^3.1.2: MySQL을 사용하여 데이터베이스를 구축합니다. MySQL을 사용하여 데이터베이스를 구축하고 데이터를 저장합니다.
  • passport@^0.6.0: Passport를 사용하여 인증을 구현합니다. Passport를 사용하여 구글, 카카오 로그인을 구현합니다.

DEVOPS

  • aws ec2: AWS EC2를 사용하여 서버 인스턴스를 생성하고 도메인을 연결합니다. nginx를 사용하여 reverse proxy를 구성하고 letsencrypt를 사용하여 SSL 인증서를 발급하여 https를 적용합니다.
  • docker: Docker를 사용하여 컨테이너화된 서비스를 구축합니다.
  • github actions: Github Actions를 사용하여 CI/CD 파이프라인을 구축합니다. PR이 올라올 때마다 빌드 및 테스트를 진행하고 배포를 진행합니다.

ETC

  • notion: Notion을 사용하여 프로젝트 일정과 기록을 관리합니다.
  • figma: Figma를 사용하여 디자인 시스템을 구축하고 컴포넌트를 디자인합니다.

Architecture

post_image

Structure

post_image

기능 소개

로그인/로그 아웃

post_image
OAuth를 통한 로그인 기능을 구현했습니다. 사용자가 구글/카카오 로그인을 통해 서비스에 접근할 수 있습니다.
하단 로그아웃 버튼을 통해 로그아웃할 수 있습니다.

사이드 바

post_image
작은 달력을 통해 선택된 날짜와 오늘 날짜를 확인할 수 있습니다. 버튼을 통해 이전 달/다음 달로 이동할 수 있으며 오늘 버튼 클릭시 오늘 날짜로 이동합니다. 상단 헤더에서 일/주/월 선택시 큰 달력에서 보여지고 있는 날짜를 확인할 수 있습니다.
post_image
카테고리/태그에 대한 생성/수정/삭제 기능을 제공합니다. 사용자는 원하는 카테고리/태그를 생성하고 일정을 등록할 때 해당 카테고리/태그를 선택할 수 있습니다.
post_image
좌측 버튼을 통해 사이드 바를 열고 닫을 수 있으며 원하는 기능을 선택할 수 있습니다.

헤더

post_image
일정 추가 버튼 클릭시 일정 추가 모달이 나타납니다. 이전/다음 버튼을 통해 이전 달/다음 달로 이동할 수 있으며 오늘 버튼 클릭시 오늘 날짜로 이동합니다. 상단 헤더에서 일/주/월 선택시 큰 달력에서 보여지고 있는 날짜를 확인할 수 있습니다.

생성/수정 모달

생성/수정

생성/수정

헤더 상단 버튼을 클릭하거나 달력을 클릭하거나 드래그/드롭을 통해 일정을 생성/수정할 수 있습니다. 일정 수정/생성시 modal이 나타나며 원하는 일정을 등록할 수 있습니다.
post_image
날짜 선택시 기존 미니 달력을 재사용하였으며 시간 선택시 리스트에서 시간을 선택하거나 직접 입력할 수 있습니다.
post_image
카테고리 선택시 리스트에서 카테고리를 선택하거나 존재하지 않는 카테고리를 직접 생성하고 메인 색상을 선택할 수 있습니다.
post_image
태그 선택시 엔터키를 통해 태그를 적용/생성할 수 있습니다.

간단/상세 정보 모달

post_image
특정 일정에 마우스를 올리거나 클릭시 간단/상세 정보 모달이 나타납니다. 간단 정보 모달에서는 일정의 제목과 시작/종료 시간을 확인할 수 있으며 상세 정보 모달에서는 일정의 제목, 시작 시간, 종료 시간, 카테고리, 태그, 내용을 확인할 수 있습니다.
상세 모달에서는 수정/삭제 버튼을 통해 일정을 수정/삭제할 수 있습니다.
해당 모달은 일정의 위치에 따라서 동적으로 나타나며 일정의 위치에 따라서 모달이 화면을 벗어나지 않도록 조정합니다. (윈도우 사이즈 변경시 모달 위치 조정)

월 달력

post_image
월 달력을 통해 종일/시간 일정을 확인할 수 있습니다. 각 일정의 시작 시간과 종료 시간을 확인할 수 있으며 해당 시간과 생성 날짜를 통해 일정의 순서를 설정합니다.
post_image
달력을 클릭하거나 드래그/드롭을 통해 일정을 생성/수정할 수 있습니다. 일정 수정/생성시 modal이 나타나며 원하는 일정을 등록할 수 있습니다.

일/주 달력

post_image
일/주 달력을 통해 일정을 확인할 수 있습니다. 일/주 달력에 상단에는 종일 일정을 확인할 수 있으며 하단에는 시간 일정을 확인할 수 있습니다.
시간 일정은 종일 일정과 마찬가지로 셀을 클릭하거나 드래그/드롭을 통해 일정을 생성/수정할 수 있습니다.
또한, 일정의 시작과 끝을 드래그하여 일정의 시간을 변경할 수 있습니다.

참고