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 분산 락
2023.11.07 - [Database] - [Redis] 레디스 설치 및 기본 기능
[Redis] 레디스 설치 및 기본 기능
Redis 설치 https://redis.io/docs/install/install-redis/install-redis-on-linux/ Install Redis on Linux How to install Redis on Linux redis.io 위의 Redis 공식 사이트에서 설치할 수 있다. Window의 경우 ubuntu 리눅스 서버 설치 후에
innovation123.tistory.com
2023.11.07 - [Database] - [Redis] Redisson 분산 락을 간단하게 적용해 보기
[Redis] Redisson 분산 락을 간단하게 적용해보기
문제 상황 어떤 데이터에 대해 매우 빠르게 수정이 일어날 때 동시성 문제가 발생할 수 있다. 예를 들어 A라는 데이터를 수정하는 로직이 0.1초 소요되는데, 0.001초 간격으로 A라는 데이터를 수정
innovation123.tistory.com
2023.11.10 - [Database] - [Redis] Redisson 분산락(DistributedLock) AOP 적용
[Redis] Redisson 분산락(DistributedLock) AOP 적용
이전 글 2023.11.07 - [Database] - [Redis] Redisson 분산 락을 간단하게 적용해 보기 분산 락 AOP 이용하기 build.gradle 아래 implementation을 추가한다. dependencies { //... implementation 'org.springframework.boot:spring-boot-star
innovation123.tistory.com
카카오 로그인
2023.10.15 - [Spring/Spring Security] - [Spring] 카카오 로그인 API 사용 방법
[Spring] 카카오 로그인 API 사용 방법
Kakao Developers 이미지 설명에 각 이미지 내용에 대한 위치(경로) 적어뒀으니 참고해 주세요. 1. KakaoDevelopers 접속 https://developers.kakao.com/ Kakao Developers 카카오 API를 활용하여 다양한 어플리케이션을
innovation123.tistory.com
[Spring Security] 스프링 시큐리티 SecurityContext에 직접 Authentication(PrincipalDetails) 넣기
REST API 방식에서의 Kakao Login과 SpringSecurity에 대한 글을 찾다가 들어오신 분을 위해 말씀드립니다. 이 글은 Thymeleaf를 통해 뷰를 구성하고, Spring MVC @Controller 방식의 formLogin과 KakaoLogin을 혼용하기
innovation123.tistory.com
JWT Token SpringSecurity
추가 예정
'[ 기타 ] > 개인 프로젝트' 카테고리의 다른 글
[Java/Spring]초보 백엔드 개발자 게시판 프로젝트 - 명세서 만들어보기 (2) | 2023.05.29 |
---|