Github
https://github.com/HSRyuuu/FitnessRecord
1. 개요
- 프로젝트 명: FitnessRecord
- 개발 기간: 2023.10.18 ~ 2023.11.18
- 개발 인원: 1명
- 주요 기능: 운동(웨이트 트레이닝) 기록, 루틴 공유 커뮤니티 서비스
2. Skills
- Java 11, Spring Boot 2.7.16, gradle 8.2.1
- Spring Data JPA, Spring Security
- MariaDB, Redis
- JUnit5
- IntelliJ Idea
기타 사용 기술 상세
- JWT
- redisson (분산 락, JWT Token 관리)
- google GSON
- Gmail smtp 메일 발송
- Swagger
3. 요구 사항
1) 인증, 인가
Spring security 이용
- 로그인 시 JWT accessToken과 refreshToken이 발행된다.
- 이후 Authorization 헤더에 Bearer {token}을 추가하여 권한을 확인한다.
토큰 관리
- redis로 refreshToken과 로그아웃 된 accessToken을 관리한다.
- refreshToken으로 reissue 요청 시 accessToken을 새로 발행한다.
- 로그아웃 시 해당 refreshTokend을 삭제하고, accessToken에 대한 blackList를 추가하여,
이후 해당 accessToken으로 로그인할 시 거부되도록 한다.
2) 회원 관리
이메일 회원
- 이메일, 비밀 번호를 통해 로그인할 수 있다.
- 이메일로 회원가입 할 수 있다.
- 회원가입 시 인증 메일이 발송되고, 메일 인증을 완료되어야지만 서비스를 이용할 수 있다.
- 이메일 발송 시에 5초 정도의 시간이 소요되므로 비동기로 처리한다.
- 이메일 인증 기한은 24시간이다. 기한 내에 인증하지 못한 경우 새로운 인증 키로 재발송한다.
카카오 회원
- "/login-page"에서 소셜 로그인을 통해 회원가입, 로그인할 수 있다.
- (REST API를 제공하는 애플리케이션이지만 인증 코드를 불러오는 부분까지만 thymeleaf form을 사용한다.)
- 처음 로그인 시에는 간편 회원가입이 되고, 이후에는 로그인이 된다.
회원 바디 데이터 기록
- 회원은 키, 몸무게, 골격근량, 체지방량을 입력할 수 있다.
- 회원이 바디 데이터를 추가할 때마다 몸 상태 변화가 기록된다.
- 회원 Body 데이터 추가는 하루에 한 번만 가능하다. 여러 번 추가 시 기존 데이터가 수정되게 된다.
- 회원은 특정 날짜의 바디 데이터를 삭제할 수 있다.
- 회원은 특정 기간의 바디 데이터 변화 리스트를 조회할 수 있다.
3) 운동 종목 관리
BASIC
- 기본적으로 서비스에서 제공하는 운동 종목 BASIC_TRAINING 존재
- ADMIN 권한을 가진 유저는 BasicTraining을 추가, 수정, 삭제할 수 있다.
CUSTOM
- 회원 개인별 운동 종목을 추가, 수정, 삭제할 수 있다.
- CUSTOM_TRAINING에서 관리한다.
4) 회원 운동 기록
회원 별 운동 기록 제공
- 회원은 자신의 운동 내역(TRAINING_RECORD 테이블)을 기록할 수 있다.
- 운동 내역은 세트별(SET_RECORD 테이블)로 기록한다.
- SET_RECORD는 TRAINING_RECORD에 포함된다.
- SET_RECORD는 추가, 삭제만 가능하다.
- SET_RECORD 수정시 LOCK(분산 락)을 획득하도록 하여 동시성문제를 해결한다.
- 일정 기간 사이의 운동 기록을 조회할 수 있다.
운동 기록 데이터 정리 스케쥴링
- 하루가 끝나면 운동 기록 별로 가슴/등/하체/어깨/이두/삼두/기타 대분류로 운동 volume을 기록한다.(VOLUME_RECORD) 매일 오전 2시로 Scheduling
- 과거(하루 이전)의 SetRecord 수정 시에 VolumeRecord도 업데이트된다.
- 한 주가 끝나면 주간 운동 기록을 유저 별로 따로 저장한다. (WEEKLY_RECORD) 매주 화요일 2주 전의 데이터 저장
회원 별 운동 기록 열람
일정 기간 내의 운동 volume 기록을 열람할 수 있다.
5) 루틴 만들기
- 회원은 자신만의 루틴을 만들 수 있다.
- 하나의 루틴은 여러 개의 ROUTINE_ELEMENT로 구성된다.
- ROUTINE_ELEMENT를 ROUTINE에 추가, 삭제할 수 있다.
- 추가, 삭제 시 순서(OrderNumber)가 1부터 순차적으로 증가되는 것이 유지되도록 한다.
- ROUTINE_ELEMENT의 내용을 수정할 수 있다.
- 순서(OrderNumber)는 수정이 불가하고, 삭제, 추가만 가능하다.
루틴 공유 게시판
- 게시판 메인에는 hot 게시글 10개와, 일반 게시글을 보여준다.
- hot 게시물은 최근 24시간 내에 좋아요를 가장 많이 받은 10개의 게시물
- 일반 게시물은 최근 20개의 게시물(페이징 처리)
루틴 공유 게시글
- 회원은 자신의 루틴을 공유할 수 있다.
- 게시글 생성, 수정, 삭제 가능
- 게시글 조회 시 views(조회수)가 1씩 증가한다. redis 분산 락 사용
- 한번 유저가 조회 시 30분간 다시 조회수를 올릴 수 없도록 한다.
- Redis k-v 맵에 User, 게시글 조회 정보 30분간 저장
- 게시글에 likes(좋아요)를 누르고, 취소할 수 있다. redis 분산 락 사용
- 루틴 공유 게시글을 확인하고 댓글을 달 수 있다.
- 다른 회원의 루틴을 저장할 수 있다.
4. DB테이블 (ERD)
5. API 설계
1) USER 관련
더보기
로그인, 로그아웃
사이트 유저 회원가입, 이메일 인
소셜 로그인을 위한 view 페이지
카카오 로그인 Redirect 페이
사용자 바디 데이터
2) 운동 종목 관련
더보기
BASIC_TRAINING
CUSTOM_TRAINING
3) 운동 기록 관련
더보기
운동 기록(TRAINING_RECORD)
SET_RECORD
4) 루틴 관련
더보기
루틴 추가
루틴 요소
5) 루틴 공유 게시판 관련
더보기
루틴 공유 게시판
루틴 게시글 쓰기
루틴 게시글 상호작용
루틴 게시글 댓글
6. 아쉬운 점, 개선할 점
계획했던 것들을 끝내지 못했다.
원래 계획은 조금 더 살을 붙여서 게시판에 Elastic Search 사용, Youtube API 이용해서 운동 영상 첨부, 사용자 업적 달성에 따른 알림 기능 등을 생각해 봤지만, 시간 관계상 못한 부분이 많다. 이 프로젝트에 모든 시간을 쏟을 수 없었기 때문에 생각보다 시간이 부족했던 것 같다. 개발 시간 단축도 중요하고, 이런 계획을 세울 때 개발 시간 예측을 조금 더 보수적으로 해야겠다는 생각이 든다.
단순 CRUD가 너무 많다.
머릿속으로 생각한 이 서비스의 목적은 웨이트 트레이닝을 하는 이용자가 자신의 운동을 기록하고 그 정보를 이용하여 더 나은 운동 계획을 세울 수 있게 되고, 자신의 루틴을 만들고 루틴을 공유하는 정도였다. 그러나 생각보다 내부적으로 CRUD를 구현해야 할 것들이 너무 많았다. 사실 여러 개의 테이블에 대해 기본적인 CRUD를 구현하는 것은 너무 단순하고 반복작업일 뿐이다. 물론 ROUTINE_ELEMENT 요소들의 OrderNumber를 유지하는 부분 정도는 생각할 거리가 있었다. 이 프로젝트를 포트폴리오 용도로 사용하기에는 단순 반복 CRUD가 너무 많다는 생각이 든다. 눈으로 보이는 기능을 줄이더라도 CRUD 이외의 여러 가지 기술들을 조금 더 밀도 있게 사용하는 것이 더 나을 것 같다는 생각이 든다.
기획에 더 신경 쓰자.
기획 당시보다 기능이 점점 많아졌고, 이 글을 쓰는 지금 정리하며 보니 Routine의 경우 추가(CREATE)하는 로직만 구현되어 있고, 수정, 삭제 등은 구현되어 있지 않은 것을 발견했다. 물론 내가 백엔드 개발자이고, 기획자가 아니지만 전체적인 틀을 한번 제대로 잡고 시작하는 것도 중요한 것 같다.
마무리하며..
지금은 갑작스럽게 팀프로젝트를 시작하게 되어 일단 이 프로젝트는 잠시 멈추고 팀프로젝트에 집중해야 한다. 이후에 시간이 된다면 이 프로젝트를 리팩터링 하고, 살을 붙여서 더 발전시킬 여지는 많은 것 같다. 그래도 나름 한 달 동안 프로젝트를 진행하며 개발적으로나, 개발 외적으로 얻은 게 많은 것 같다.
7. 사용한 기술 정리 글 링크
Redis 분산 락
카카오 로그인
JWT Token SpringSecurity
더보기
추가 예정
반응형
'Projects & Playground' 카테고리의 다른 글
[Java / Playground] Rest API 호출 모듈 만들기 / RestTemplate (0) | 2024.12.15 |
---|---|
[java/Playground] Apache POI 엑셀 파일 다루기 (0) | 2024.09.04 |
[Java/Spring]초보 백엔드 개발자 게시판 프로젝트 - 명세서 만들어보기 (2) | 2023.05.29 |