Skip to content

Latest commit

 

History

History
440 lines (321 loc) · 14.9 KB

File metadata and controls

440 lines (321 loc) · 14.9 KB

재산 관리 서비스

image

목차

  1. 개발 기간
  2. 코드 컨벤션 규칙
  3. 프로젝트 개요 및 서비스 개요
  4. 요구사항 분석
  5. 프로젝트 동작 예시
  6. 프로젝트 일정관리
  7. ERD
  8. 프로젝트 패키지 구조
  9. API 명세
  10. 테스트
  11. TIL 및 회고

2023-11-09 ~ 2023-11-18 (10일)

자세히 (클릭)

공통 API Response Dto


다음과 같이 응답 형식을 정합니다.

public class ApiResponse {

  private static final String STATUS_SUCCESS = "success";
  private static final String STATUS_FAIL = "fail";
  private static final String STATUS_ERROR = "error";

    ...
}
//성공
{
  "status": "success",
  "message": null,
  "data": {
    data1
  }
}

//일반 에러
{
  "status": "fail",
  "message": "fail message",
  "data": null
}

//예외 발생
{
  "status": "error",
  "message": "error message",
  "data": null
}

Commit Convention


  • Commit message

    • 구글 자바 컨벤션
  • Branch name

    • Github 브랜치 전략
    • issue Name 동일
  • issue & Pull Request Template 사용

    • 지정된 템플릿을 사용하여, 설명과 할일 등을 명시하기
  • Git Projects 사용

    • Git Projects를 사용하여, 진행상황 시각화하기

Code convention


주석 Convention


  • 아래와 같은 형식으로 주석달기
/**
 * 동작 기능 설명
 *
 * @param 파라미터 명      파라미터에 관한 설명
 * ...
 * @return 반환 설명
 */
public 타입 메소드명 or 클래스명(파라미터 타입,파라미터 ){
  • 구현하지 못한 부분 TODO 로 남기기
//TODO or /** TODO
  • 모든 클래스와 메소드, 변수에도 주석 달기
public class 클래스명 {
  //...


  /**
   * 변수명 설명 (Entity의 id 등) 
   */
  private Long id;

본 서비스는 사용자들이 개인 재무를 관리하고 지출을 추적하는 데 도움을 주는 서비스입니다.

  • 사용자들이 예산을 설정하고 지출을 모니터링하며 재무 목표를 달성하는 데 도움이 됩니다.

  • 여러 통계를 확인하면서, 매일 지출 컨설팅을 받아 소비 습관을 바꾸는 데 도움이 됩니다.

서비스 개요 자세히 (클릭)
#### 1. 회원은 회원가입을 해야 서비스를 이용할 수 있습니다.

- 복잡한 절차 없이 회원가입이 가능합니다.

#### 2. 예산 설정 및 추천 서비스

- 월별 총 예산을 설정합니다.
- 본 서비스는 카테고리 별 예산을 추천하여 사용자의 과다 지출을 방지할 수 있습니다.

#### 3. 지출 작성

- 사용자는 지출 을 금액, 카테고리 등을 지정하여 등록 합니다.
- 언제든지 수정 및 삭제 할 수 있습니다.

#### 4. 지출 컨설팅

- 월별 설정한 예산을 기준으로 오늘 소비 가능한 지출 을 알려줍니다.
- 매일 발생한 지출 을 카테고리 별로 안내받습니다.

#### 5. 지출 통계

- `지난 달 대비` , `지난 요일 대비`, `다른 유저 대비` 등 여러 기준 카테고리 별 지출 통계를 확인 할 수 있습니다.

서비스 개요에 맞게 요구사항을 분석하여 작성하였습니다.

개발 중 새로운 의문이 들면, 다시 기록하였습니다.

요구사항 분석 자세히 (클릭)
### 1. 유저

1. 사용자 회원가입
    1. `계정명`, `패스워드` 입력하여 회원가입
2. 사용자 로그인
    1. 로그인시 `JWT` 발급
    2. 이후 모든 API 요청 Header에 JWT 포함 후 유효성 검증 필수
3. 사용자 로그아웃
    1. 로그아웃시 DB에 있는 Refresh 토큰 삭제

### 2. 예산설정 및 설계

1. 지출 카테고리 목록
    1. `식비` , `교통` 등 일반적인 지출 카테고리 목록 반환

2. 예산 설정
    1. `카테고리`, `예산` 로 설정.
    2. 예산 설계 추천 시스템 (API)
        - `카테고리` 를 지정 안할 때, `카테고리` 별 배분 금액 추천.
        - 기존 모든 유저들의 카테고리 별 예산을 통계를 구해, 자동으로 카테고리에 배분.
            - 이때, 통계가 10프로 이하인 카테고리들은 모두 묶어 기타로 제공.
        - 계산식
            - `(예산 * 카테고리의 통계(((카테고리의 총 예산 금액)/(전체 총 예산 금액))* 100)) /100`
    3. 수정/삭제 가능

### 3. 지출 기록

1. 지출 속성
    1. `지출 일시`, `지출 금액`, `카테고리`, `메모`, `합계제외여부` 필수 포함
    2. 추가적인 필드 사용 가능
2. 지출 CRUD
    1. `생성`, `수정`, `읽기(상세)`, `읽기(목록)`, `삭제`, `합계제외 변경`
3. 지출 읽기(목록)
    1. 조회 기준: `기간(필수 입력)`, `카테고리`, `금액(최소, 최대 금액)`
    2. 조회된 모든 지출의 `지출 합계`, `카테고리 별 지출 합계` 포함
    3. `합계제외` 처리한 지출은 목록에는 포함되지만, 모든 `지출 합계`에서는 제외
    4. 페이징 기능 포함

### 4. 지출 컨설팅

1. 오늘 지출 가능한 금액 추천
    1. `월별` 예산을 만족 시키는 오늘 사용가능한 `총액``카테고리 별 금액` 추천
    2. 이번 달의 `남은 일수` 고려
    3. 0원 또는 음수이면 안되고 `최소 추천 금액`을 설정

2. 유저 상황에 맞는 `조언 멘트`

   기준치 계산 = `지금까지 사용한 지출 비율 계산` / `원래 사용해야 할 예산`
    1. 매달 1일 일 때
        - 이번 달에도 열심히 예산관리를 해봐요!
    2. 잘 아끼고 있을 때 (기준치 1.3이상)
        - 잘 아끼고 있어요. 현명한 소비를 하고 계시네요
    3. 적당히 사용 중 일 때 (기준치 1.3 ~ 1.0 이상)
        - 적당히 사용 중이시네요. 조절된 소비는 중요해요
    4. 기준을 넘었을 때 (기준치 1.0 미만)
        - 기준을 조금 넘었어요. 지출을 다시 검토해보는 것도 좋겠어요.
    5. 예산을 초과했을 때 (기준치 0.0)
        - 예산을 초과했어요. 소비 패턴을 다시 살펴보는 게 좋겠어요.
3. 100원 단위 `반올림한 금액`으로 추천
4. 스케쥴러 및 웹훅으로 `알람` 구현 (선택 사항)
5. 오늘 지출한 내용 안내
    1. `총액`, `카테고리 별 금액` 안내
    2. `적정 금액`, `지출 금액`, `위험도` 를 카테고리 별로 안내

### 5. 지출 통계

> 사용자의 통계데이터 생성을 위해 Dummy 데이터를 생성합니다.

- `지난 달` 대비 `총액`, `카테고리 별` 소비율
    - 지난 달의 오늘 일차까지 해당하는 과거 모든 데이터 기록 대비
- `지난 요일` 대비 소비율
    - 오늘 요일에 해당되는 과거 모든 데이터 기록 대비
- `다른 유저` 대비 소비율
    - 다른 유저의 오늘에 해당하는 예산
    - 다른 유저의 소비율과 나의 소비율 대한 평균 비율

### 6. 추가

- Docker 적용
- AWS EC2, RDS를 이용한 배포
- Discord 알람 사용

### + 의문

#### 1. 기존 모든 유저들의 카테고리 별 예산을 통계를 구할 때, 계산하는데 오래걸리지 않을까?

- 만약 서비스가 커질 것을 예상하면, 카테고리 별로 모든 유저들의 사용 %를 가진 컬럼으로 관리 할 수 있을 것 같다.

#### 2. 예산 설계 추천 시스템에서 꼭 회원이 요구한 돈에 딱 맞게 추천해줘야할까?

- 결국 소수점으로 떨어지에, 100 단위로 정확하게 주는건 불가능.
- 두가지 경우로 구현 가능
    1. 요구한 돈에서 +- 300원 오차 발생하지만, 정확한 퍼센트로 추천. (채택)
    2. 돈에 딱 맞게 추천하지만, 정확한 퍼센트는 아님.

Discord webHook 을 통해 구현하였습니다.

1. 회원 상황에 맞는 멘트 호출

image

2. 회원의 오늘 카테고리별 지출 추천

image

Git Projects 사용

Git Projects 링크

처음 모습 (클릭)

image

종료 후 모습 (클릭)

image

Erd Cloud

image

자세히 (클릭)
src
├─ docs
│  └─ asciidoc
├─ main
│  ├─ java
│  │  └─ com
│  │     └─ personal
│  │        └─ smartbudgetcraft
│  │           ├─ domain
│  │           │  ├─ auth
│  │           │  │  ├─ api
│  │           │  │  └─ application
│  │           │  │     └─ security
│  │           │  ├─ category
│  │           │  │  └─ cost
│  │           │  │     ├─ dao
│  │           │  │     └─ entity
│  │           │  ├─ deposit
│  │           │  │  ├─ api
│  │           │  │  ├─ application
│  │           │  │  ├─ dao
│  │           │  │  ├─ dto
│  │           │  │  │  ├─ request
│  │           │  │  │  └─ response
│  │           │  │  └─ entity
│  │           │  ├─ expenditure
│  │           │  │  ├─ api
│  │           │  │  ├─ application
│  │           │  │  ├─ constant
│  │           │  │  ├─ dao
│  │           │  │  │  └─ querydsl
│  │           │  │  ├─ dto
│  │           │  │  │  ├─ request
│  │           │  │  │  └─ response
│  │           │  │  └─ entity
│  │           │  └─ member
│  │           │     ├─ api
│  │           │     ├─ application
│  │           │     ├─ dao
│  │           │     │  ├─ budgettracking
│  │           │     ├─ dto
│  │           │     │  ├─ request
│  │           │     │  └─ response
│  │           │     └─ entity
│  │           │        └─ budgettracking
│  │           ├─ global
│  │           │  ├─ config
│  │           │  │  ├─ jpa
│  │           │  │  ├─ p6spy
│  │           │  │  ├─ redis
│  │           │  │  │  ├─ dao
│  │           │  │  ├─ security
│  │           │  │  │  ├─ annotation
│  │           │  │  │  ├─ data
│  │           │  │  │  ├─ filter
│  │           │  │  │  ├─ handler
│  │           │  │  ├─ valid
│  │           │  │  │  └─ annotation
│  │           │  │  └─ web
│  │           │  ├─ dto
│  │           │  │  └─ response
│  │           │  ├─ entity
│  │           │  ├─ error
│  │           │  ├─ external
│  │           │  │  └─ discord
│  │           │  │     ├─ api
│  │           │  │     └─ application
│  │           │  └─ schedule
│  │           └─ SmartBudgetCraftApplication.java
│  └─ resources
...

Spring Rest Docs 기반 API 명세서

image

✅ 70/70 (2.745s)

Mockito & JUnit5 기반 계층별 단위

image

N+1을 해결하는 BatchSize와 fetchJoin의 차이는 무엇일까?

필터링 query문 VS Stream

localDate와 Date 차이

정확한 계산 빅데시마 무조건 써야할까?

RefreshToken은 왜 Redis를 권장할까?