Daily Pay는 사용자들이 개인 재무를 관리하고 지출을 추적하는 데 도움을 주는 애플리케이션입니다. 본 서비스는 유저들의 예산, 지출 내역을 기반으로 예산 추천, 오늘 지출 추천, 오늘 지출 점검 등의 도움을 제공합니다.
v1.0.0
: 23.11.09 ~ 23.11.16 (=8일) (45시간)
v1.1.0
: 23.11.20 ~ 24.01.01 (=43일) (49시간)
- A. 유저는 본 서비스의 애플리케이션에 들어와 회원가입을 통해 서비스를 이용합니다.
- B. 예산 설정 및 설계 서비스
월별
총 예산을 설정합니다.- 본 서비스는
카테고리
별 예산을 설계(=추천)하여 사용자의 과다 지출을 방지합니다.
- C. 지출 기록
- 사용자는
지출
을금액
,카테고리
등을 지정하여 등록 합니다. 언제든지 수정 및 삭제 할 수 있습니다.
- 사용자는
- D. 지출 컨설팅
월별
설정한 예산을 기준으로 오늘 소비 가능한지출
을 알려줍니다.- 매일 발생한
지출
을카테고리
별로 안내받습니다.
- E. 지출 통계
지난 달 대비
,지난 요일 대비
,다른 유저 대비
등 여러 기준카테고리 별
지출 통계를 확인 할 수 있습니다.
(자세히)
- Spring Security + JWT
- 추후 소셜 로그인 등으로 전환 될 가능성을 고려하여 [아이디,비밀번호]가 아닌 [이메일,비밀번호]로 테이블을 구성하였습니다.
인증 이후 유저 정보 접근 방식 개선 #32
- Spring Security의 UserDetails을 오버라이딩하는 CustomUserDetails 구현
- 이메일, 비밀번호 외에도 다양한 정보를 Security context에 저장해 두고 사용합니다.
@Currentuser
로 Controller 에서 간편하게 유저 정보 접근 가능- 테스트 시 @WithMockUser 대신 사용할
@WithMockCurrentUser
어노테이션 구현 #86
(자세히)
- {user id, 년월, 카테고리}를 unique한 복합키로 가집니다. (향후 API 구현에 이용할 예정)
- 카테고리는 식비 , 교통 등 일반적인 지출 카테고리를 의미합니다.
- 관리를 용이하게 하기위해 카테고리는 Enum으로 구현하였습니다.
- 유저가 예산설정에 사용할 수 있도록 모든 카테고리 목록을 반환하는 API입니다.
- 해당 기간 별 설정한 예산을 설정합니다.
- 예산은 카테고리를 필수로 지정합니다.
- 사용자는 언제든지 예산 금액을 변경할 수 있습니다.
- 전체 유저의 예산 액을 통해
카테고리 별 평균 예산 비율
을 계산합니다. 카테고리 별 평균 예산 비율
과유저의 예산총액
을 기반으로 카테고리별 예산액을 추천합니다.
(자세히)
- 요구사항 : 지출 일시, 지출 금액, 카테고리 와 메모 를 입력하여 생성합니다
- 삭제에는 soft delete 적용하였습니다.
- 지출을 생성, 수정, 읽기(상세), 읽기(목록), 삭제 , 합계제외 할 수 있습니다.
- 생성한 유저만 위 권한을 가집니다.
- 읽기(목록) 은 아래 기능을 가지고 있습니다.
- 필수적으로 기간 으로 조회 합니다.
- 조회된 모든 내용의 지출 합계 , 카테고리 별 지출 합계 를 같이 반환합니다.
- 목록 조회 시
Paging
,동적 정렬
을 적용하여 원하는 지출 내역만 검색할 수 있습니다.
- 합계제외 처리한 지출은 목록에 포함되지만, 모든 지출 합계에서 제외됩니다.
(자세히)
해당 API를 통해 유저는 아래 정보를 얻을 수 있습니다.
- 오늘 쓸수 있는 총액 : 목표 달성을 위해 오늘 얼마를 써야하는지 (남은 예산/ 남은날짜)
- 카테고리 별 금액 : 오늘 쓸 수 있는 총액을 카테고리 별로 세분화
- 유저의 상황에 맞는 응원 멘트 (잘 아끼고 있을 때/ 적당히 사용중일때 등.. )
이번 달 남은 예산 : 14만원
오늘 쓸 수 있는 금액 : 3만원
카테고리 별 금액:
[
- 식료품 : 2만원
- 교통비 : 7000원
- 기타 : 3000원
}
응원멘트 : "이번 달 예산을 넘어섰어요! 열심히 절약해야겠네요"
해당 API를 통해 유저는 아래 정보를 얻을 수 있습니다.
오늘 지출한 총액
: 오늘 소비한 총액카테고리 별 통계
- 일자 기준 오늘 적정 금액 (오늘 기준 사용했으면 적절했을 금액)
- 일자 기준 오늘 지출 금액 (오늘 기준 사용한 금액)
- 위험도 : 카테고리별 적정 금액, 지출 금액의 차이를 위험도로 나타냅니다. (퍼센테이지)
- ex) 문화생활비 카테고리에서, 1일~ 오늘까지 사용한 금액 30,000원/ 한 달 예산 100,000원 이면 30%
- ex) 문화생활비 카테고리에서, 1일~ 오늘까지 사용한 금액 200,000원/ 한 달 예산 100,000원 이면 200%
- 유저의 피로도가 가중 될 수 있습니다 (→지속적인 소비 습관 형성에 악영향을 줍니다.)
- 만약 문화 생활비 예산이 한달에 30만원이고, 유저가 1일에 그 30만원을 다 썼다면, 2안의 경우 유저는 1달 내내 위험도를 초과했다는 알림을 받아야합니다.
[2안의 문제점]
1일 -> 30만원 / 1만원 => 위험도 3000%
2일 -> 30만원 / 2만원 => 위험도 1500%
3일 -> 30만원 / 3만원 => 위험도 1000%
...
30일 -> 30만원 /30만원 => 위험도 100%
예산 : 30만원
- 오늘까지 권장 지출 : 14만원
- 이번 달 지출 금액: 16만원
카테고리 별 통계 :
[
[식비, 위험도 9%, 90300원 남음, 9700원 지출, 예산 10만원]
[생활, 위험도 50%, 49150원 남음, 50850원 지출, 예산 10만원]
...
]
(자세히)
사용자에게 통계 데이터를 제공합니다.
통계 API 동작 확인을 위해 Dummy 데이터를 생성하였습니다.- 유저의 지난달 소비 데이터
- 유저의 7일전 (지난주, 같은요일) 소비 데이터
- 다른 유저의 오늘 소비 데이터
- 저희 서비스의 테스트를 위해서는 '오늘' 기준으로 일주일 전, 한 달 전의 데이터가 필요합니다. 따라서 동적 생성을 위해 코드로 더미데이터를 생성하였습니다.
- SQL 프로시저로 직접 SQL문을 작성할 수도 있지만, 스크립트 문 특성상 유지보수가 어려울 것 같아 java 코드로 작성하였습니다.
- 데이터 저장 시 saveAll을 써서 단건씩 저장보다 성능을 높였습니다.
Get
/api/v1/statistics?condition={통계 조건}
- (1) 지난 달 대비 총액 및 카테고리 별 소비율 : last-month
- (2) 지난주 같은 요일 대비 소비율: last-week
- (3) 다른 유저 대비 소비율 : other-user
- URL :
http://server:port/swagger-ui/index.html
- 인증 API를 제외한 다른 API들은 Acceess Token을 필요로 합니다.
DAILY PAY : 예산관리 애플리케이션 v1.0.0 회고
[Spring Security + JWT] Access, Refresh 토큰을 DB에 저장해야하는 이유