1. 기획
프로젝트 소개 및 제작 동기
TimeTidy는 사용자에게 쉬운 일정 관리와 직관적인 일정 공유를 제공하는 일정 관리 사이트이다. 많은 일정 관리 사이트들을 사용해본 결과, 내 기준 직관적으로 와닿는 일정 관리 사이트들이 없었다. 물론 많은 사이트들에는 좋은 기능들이 많았지만, 특히 todoist는 유료로 기능들이 제한되어 있어 사용하기 어려웠다. 학생 신분이라 정기적으로 결제하여 서비스를 이용하는데는 부담이 있었고 기존 서비스를 운영하는 사이트들에 비해 기능은 제한적이고 많은 기능을 담을 수는 없었지만, 그래도 나름 내 기준에는 직관적이고 유료로 제한되었던 캘린더 기능을 간단하게나마 구현하고자 하였다.
일정 관리 어플리케이션 시장 분석 및 동향
우선 일정 관리 어플리케이션을 만들기 위해서는 시장 분석 및 동향을 알아야만 했다. 일정 관리 어플리케이션의 시장 규모는 연간 약 10억 달러씩 증가하는 추세를 보이고 있다. 이는 일정 관리 시장에 대해 긍정적인 전망을 보여주었다.
그리고 일정 관리 사용자 분포는 어떻게 되어있는지도 궁금했다. 개인 사용자가 35%로 가장 많은 이용자층을 차지하고 있다. 이 프로젝트 또한 나 자신이 사용하기 위해 만들것이기 때문에 개인 사용자 타겟 층에 적합하다고 생각했다.
마지막으로 일정 관리 서비스 유형은 웹 기반이 45%로 많은 비중을 차지하고 있다. 프로젝트 또한 웹사이트로 진행할 생각이기 때문에 이 부분에 대해서도 문제없이 진행할 수 있겠다고 생각했다.
기술 스택
Language
java, javascript
Framework
spring boot
DB
oracle
Tool
sts4, dbeaver
2. 설계
요구사항 설계 및 기능 산정
먼저 일정 관리 사이트들을 둘러본 후 꼭 들어가야할 핵심 기능들을 나열했다. 기능마다 번호를 매기고 기능 옆에는 기능을 어떻게 구현해야할지에 대한 간단한 상세 글을 작성하였다. 그리고 각 기능에 대해 바로 구현할지 아니면 나중에 구현할지에 대한 여부와 각 기능을 구현하는데 필요한 라이브러리를 기재하였다.
그리고 일정 관리 사이트의 핵심 기능이 바로 일정 기록이기 때문에 일정에 들어가야할 데이터 목록을 정리하였다. 기본 육하원칙에 따라 작성하도록 하였다.
UI 설계
ERD 설계
기획에서 ERD 설계가 가장 오래 걸리지 않았나 싶었다. 초반 설계는 빨리 끝났지만 나중에 필요한 view나 컬럼들을 수정하여 추가해야하는 상황이 왔다. 물론 프로젝트에서 백엔드 경험이 없다보니 어쩌면 당연한 일일지도 모르겠다. 가장 중요한 테이블은 일정 테이블로 일정 기록에 있어 중요한 데이터들이 들어간다. 제목, 호스트 아이디, 참여자 아이디, 시작 시각, 종료 시각, 장소, 설명 등의 컬럼이 들어간다. 또한 일정 테이블은 나머지 테이블과 일대다 관계를 갖는데 한 회원이 여러 개의 일정을 가질 수 있고, 한 페이지 당 여러 개의 일정을 가질 수 있다. 소셜 또한 마찬가지이다. 그러나 알림은 일정 테이블 입장에서 다대일 관계를 가진다. 한 개의 일정에 여러 참여자(소셜)에게 알림이 갈 수 있기 때문이다. 그 외에는 회원 테이블이 모든 테이블과 일대다 관계를 가진다.
Flow 설계
디테일 페이지는 페이지 삭제, 일정 추가, 일정 삭제, 일정 수정 등의 기능을 사용할 수 있다. 일정 추가에서는 참여자 여부에 따라 일정 공유가 가능하다.
소셜 페이지에서는 소셜 목록 페이지와 소셜 추가 페이지로 나뉘는데 소셜 목록 페이지에서는 현재 소셜 목록 조회와 소셜 삭제를 할 수 있다. 소셜 삭제를 하면 상대 유저에서의 소셜 목록도 삭제된다. 소셜 추가 페이지에서는 소셜 추가가 가능한데 소셜 추가를 하면 바로 소셜 추가가 되는것이 아닌 대기중 상태로 변경된다.
알림 페이지에서는 소셜 페이지나 디테일 페이지에서 소셜 추가를 하거나 일정 공유를 하면 상대 유저에게 알림 메세지가 온다. 알림 페이지는 상대에게 온 알림을 조회하여 승인하거나 거부할 수 있고 일정 아이디의 유무에 따라 소셜 추가가 되거나 일정 공유가 될 수 있다. 당연히 승인, 거부 모두 알림 메세지를 삭제한다.
UseCase 다이어그램
내 프로젝트에는 액터는 관리자 없이 사용자 하나 밖에 존재하지 않아서 액터는 한개만 사용하였다. 여러 기능의 유스케이스들을 로그인에 <<include>>를 연결하였다. 이유는 로그인이 없으면 비회원은 사용하지 못하는 기능들이기 때문이다. 그외에 일정 생성, 삭제, 수정, 조회는 페이지를 생성해야 가능한 기능이기 때문에 <<include>> 관계로 정의하였다. 또한 일정 공유 기능을 일정 생성의 옵션 기능이기 때문에 <<extend>> 관계로 정의했다.
3. 구현
페이지 및 일정 생성
캘린더
구글 로그인
로그인은 구글 소셜 로그인 기능으로 구현하였다. 요즘 모든 사이트들이 소셜 로그인으로 회원가입을 대체하는 추세라 소셜 로그인 기능으로 구현했다. 동작은 사용자가 구글에 소셜 로그인을 진행하면 구글은 code 파라미터 값을 반환하고 그 값을 spring security에 전달한다. 전달된 값을 통해 구글에게 사용자 정보를 요청하고 구글은 사용자 정보를 반환해준다. 그럼 그 정보를 토대로 회원 생성 및 세션을 연결하게 된다. 원래는 토큰을 받아 JWT 토큰 발급을 받을 계획이었으나 시간이 빠듯한 관계로 기능 구현하지 못하였다. 다음 프로젝트에는 JWT 토큰을 발급받아 유효 기간 설정 및 리프레시 토큰 발급 등의 기능을 처리할 예정이다.
소셜
알림
4. 테스트 및 회고
체크리스트
테스트는 개발하면서 진행하는 것이 아닌 개발 후에 진행하였다. 테스트 주도 개발 (TDD) 방식으로 진행해볼까도 생각했지만 개발 속도가 저하될 수 있어서 채택하지는 않았다. 다음에는 테스트 주도 개발 방식을 적용해볼 생각이다. 나머지 테스트는 모두 통과하였으나 딱 하나, 일정 수정 기능 중 장소 수정 시 카카오맵이 임베드되지 않는 버그가 발생했다. 그래서 버그를 최종 수정 완료하여 테스트에 성공하였다.
회고
개인으로 진행하는 프로젝트는 이번이 처음이었던 만큼 기획, 설계, 개발, 테스트 모두 혼자하기에 시간이 부족하였지만, 스스로 애정을 가지고 프로젝트를 진행하여 나름 성공적으로 프로젝트를 마무리할 수 있었던 것 같다. 또한 시간 문제로 구현하지 못한 기능들을 나중에 추가하여 프로젝트를 완성시키고 싶다.