Giter VIP home page Giter VIP logo

daily-budget's Introduction

manage-budget-mo

daily-budget's People

Contributors

mojh7 avatar

daily-budget's Issues

setup: 프로젝트 생성 및 초기 환경 설정

📃 설명

  • Spring Boot 프로젝트 생성 및 초기 환경 설정

✅ 작업 내용

  • Spring Boot 프로젝트 생성
  • jpa, mysql 등 필요 의존성 추가
  • log 설정
  • 공통으로 사용될 클래스 구현
    • 커스텀 예외 처리 관련 클래스 추가
    • API 응답 클래스 추가
    • entity 공통으로 사용할 base entity 클래스 추가
  • application.yml 설정
  • db 모델링, entity만 추가

💬 기타 사항

feat: 지출 상세 조회 API 구현

📃 설명

  • 유저가 자신의 특정 지출의 상세 내용을 조회할 수 있다

✅ 작업 내용

  • 지출 상세 조회 구현
  • 테스트 작성

💬 기타 사항

feat: 회원 도메인 구현

📃 설명

  • 나중에 추가하려 했는데 예산, 지출 관련 구현 로직에서 결국 회원 정보 사용하니 나중에 추가하면 두 번 작업해야 되니 미리 추가
  • 해당 이슈에서 로그인이랑 회원가입만 넣으려고 했는데 하다보니 로그아웃, 토큰 재발급도 포함

✅ 작업 내용

  • 시큐리티 설정
  • 회원가입
  • 로그인
  • 로그아웃
  • 토큰 재발급

💬 기타 사항

refactor: Enum type 유효성 검증 방법 수정

📃 개선 사항

As-Is

기존의 enum 클래스 안에 @JsonCreator 적용한 함수를 만들고 입력된 문자열이 해당 enum 필드에 매칭되는지 확인하고 없으면 null로 반환, 그리고 custom validator에서 단순히 null 체크하는 방식으로 enum 유효성 검증

  • patch 수정 처럼 dto 필드로 null이 들어올 수도 있는데 enum type의 필드가 입력되지 않아서 null인지 아니면 입력 값으로 들어온 값이 enum 필드랑 매칭이 되지 않아서 null인지 구분할 수가 없었음

To-Be

  1. request dto에서 입력받을 때 enum type이 아닌 string으로 받고 기존 방법에서 enum 클래스 안에서 필드와 매칭되는지 판별했던 것을 custom validator에서 처리하도록 수정
  2. custom validation annotation에서 null값을 허용할지 말지 판별하는 변수를 두고 custom validator에서 판단하도록 수정

✅ 작업 내용

  • Enum type 유효성 검증 방법 수정

💬 기타 사항

예산 관리 API 개발

📃 설명

  • 목표 : 유저들의 개인 재무 관리, 지출 추적에 도움을 주는 서비스
    • 유저들이 설정한 예산과 지출 데이터를 통해 재무 목표를 달성하는데 도움을 주고자 합니다
  • 월별 예산을 등록하면 내가 하루에 얼마 정도 써야되는지 오늘 가용 예산과 오늘 쓴 지출 정보 알림을 받는다
기능 Method URL 개발 여부
유저 회원가입 POST /api/members/signup O
유저 정보 수정 PATCH /api/members
로그인 POST /api/auth/login O
로그아웃 POST /api/auth/logout O
토큰 재발급 POST /api/auth/reissue O
카테고리 목록 조회 GET /api/categories O
예산 설정 PUT /api/budgets O
예산 설계 GET /api/budgets/recommend
지출 생성 POST /api/expenditures O
지출 목록 조회 GET /api/expenditures?queryparams... O
지출 상세 조회 GET /api/expenditures/{expenditureId} O
지출 수정 PATCH /api/expenditures/{expenditureId} O
지출 삭제 DELETE /api/expenditures/{expenditureId} O
오늘 지출 추천 GET /api/expenditures/recommend
오늘 예산 안내 GET /api/budgets/daily
지출 통계 GET /api/expenditures/stats

✅ 작업 내용

💬 기타 사항

test: 지출 생성 테스트 추가

📃 설명

  • 지출 생성 관련 테스트 작성

✅ 작업 내용

  • 지출 생성 서비스 테스트
  • 지출 생성 컨트롤러 테스트

💬 기타 사항

feat: 카테고리 목록 조회 API 구현

📃 설명

  • 당장 개발 용도로는 카테고리 일부만 넣고 추후에 추가
  • GET /api/categories

✅ 작업 내용

  • 카테고레 정의
  • 카테고리 목록 조회

💬 기타 사항

참고 & 고민

  • 카테고리를 db에서 따로 테이블로 분리 했지만 서버에서도 결국 enum으로 관리해야 될 것 같다
    • 카테고리가 요청 필드로 입력되면 dto에서 검증하기 위해 enum 타입을 따로 가져야할 듯
  • 카테고리가 db에 입력된 값과 서버의 enum에서 정의한 값이 같은지 검증이 필요할 것 같다(추후에 추가)
    • 해당 테스트만큼은 h2말고 실제 db(mysql)에 접근해서 비교하는 테스트 설정이 필요한 것 같다
    • 그리고 개발 서버나 라이브 서버 같은 곳에서 특히 실제 db의 값과 비교할 수 있도록??

DB

📃 내용

member

컬럼 타입 제약 조건 설명
id bigint pk, not null, unsigend, auto increment 고유 식별자
account_id varchar(20) unique, not null 사용자 계정 id
password char(60) not null 사용자 비밀번호
role varchar(20) not null 권한(현재는 ROLE_USER만 존재)
name varchar(20) not null 사용자 이름
allow_daily_budget_noti tinyint(1) not null, default(0) 오늘 가용 예산 알림 허용 여부
allow_daily_expenditure_noti tinyint(1) not null, default(0) 오늘 사용한 지출 알림 허용 여부
created_at timestamp not null 데이터 생성 일시
updated_at timestamp - 데이터 수정 일시

기타

  • role(권한 정보)은 필드만 추가, 당장 권한 체크해야할 api는 없음
  • (푸시)알림 기능(오늘 지출 추천, 오늘 지출 안내)에 대한 on/off 필드나 테이블 따로 연결
    • 오늘 지출 추천, 오늘 지출 안내 묶어서 1개로 보나 각각 따로 2개로 보나
    • 이것도 테이블에 빼서 연결하면(푸시 알림 종류가 여러 개 될 때 가정?) 1:n 연관 관계
    • 필드로만 한다면 알림 종류1, 알림 종류2 이런 방식으로 저장하고 파싱해서 서버에서 사용?

budget

컬럼 타입 제약 조건 설명
id bigint pk, not null, unsigend, auto increment 고유 식별자
member_id bigint fk, not null, unsigend 멤버 fk
budget_year int not null, unsigend 예산 년 정보
budget_month int not null, unsigend 예산 월 정보
total_amount bigint not null, unsigend 예산 총액
created_at timestamp not null 데이터 생성 일시
updated_at timestamp - 데이터 수정 일시

기타

  • 예산 데이터의 년/월 데이터를 단순히 long타입 년/월 필드만 가지고 있기 vs 날짜 관련 타입 데이터로 가지고 있기

category

필드

컬럼 타입 제약 조건 설명
id bigint pk, not null, unsigend, auto increment 고유 식별자
name varchar(40) not null, unique 카테고리 이름

budget_category or category_budget

카테고리별 예산

컬럼 타입 제약 조건 설명
id bigint pk, not null, unsigend, auto increment 고유 식별자
budget_id bigint fk, not null, unsigned 예산 fk
category_id bigint fk, not null, unsigned 카테고리 fk
amount bigint not null, unsigned 해당 카테고리에 대한 예산 금액
created_at timestamp not null 데이터 생성 일시
updated_at timestamp - 데이터 수정 일시

expenditure

컬럼 타입 제약 조건 설명
id bigint pk, not null, unsigend, auto increment 고유 식별자
member_id bigint fk, not null, unsigend 멤버 fk
category_id bigint fk, not null, unsigend 카테고리 외래키
amount bigint not null, unsigend 금액
memo CHAR(40) not null 메모
exclude_from_total tinyint(1) not null, default(0) 합계 제외 여부
expenditure_at timestamp not null 지출 일시
created_at timestamp not null 데이터 생성 일시
updated_at timestamp - 데이터 수정 일시

💬 기타 사항

feat: 지출 삭제 API 구현

📃 설명

  • 일단 최근의 soft delete 방식으로 구현 한 번 해보기도 했고 지출 통계, 알림 등 다른 중요 기능들 개발 해야되니 빠른 구현을 위해 hard delete 방식 선택

✅ 작업 내용

  • 지출 삭제 API 구현
  • 테스트 작성

💬 기타 사항

feat: 지출 목록 조회 API 구현

📃 설명

  • 조회된 모든 내용의 지출 합계, 카테고리 별 지출 합계 같이 반환
  • 조회 옵션
    • 기간으로 조회 필수
    • 특정 카테고리만 조회
    • 최소, 최대 금액으로 조회
  • 합계제외 처리한 지출은 목록에는 포함되어 조회되지만, 모든 지출 합계에서는 제외

✅ 작업 내용

  • 기간으로 지출 목록 조회 구현
  • 특정 카테고리만 조회 구현
  • 최소 ~ 최대 금액으로 조회 구현
  • 응답 데이터에 지출 합계, 카테고리 별 지출 합계 필드 포함
  • 테스트 코드 작성

💬 기타 사항

feat: 지출 생성 API 구현

📃 설명

  • 지출 일시, 지출 금액, 카테고리, 메모 를 입력하여 생성합니다.

✅ 작업 내용

  • 지출 생성 API 구현

💬 기타 사항

  • 추가 필드는 나중에 필요할 때 추가

개발 초기 - 요구 사항 정리 및 개발 내용 정리

📃 내용

A. 유저

예산, 지출 관련 개발 먼저할 예정이라 우선순위 낮음

1. 유저 회원가입 POST /api/members/signup

2. 로그인 POST /api/auth/login

기타 (optional)

  • 로그인 /api/auth/login vs /api/members/login
  • 로그아웃 POST /api/auth/logout
  • 토큰 재발급 POST /api/auth/reissue
  • 유저 정보 수정 PATCH /api/members
    • 알림 허용 on/off

B. 예산설정 및 설계

1. 예산 설정 PUT /api/budgets

  • POST vs PUT vs PATCH
  • 요구 사항을 보면 다음과 같이 해야 될듯?
    • 최초 예산 설정 -> 예산 데이터 생성
    • 기존에 이미 예산 설정 -> 예산 데이터 수정
  • PUT 적절해 보임
    • 정석은 기존 리소스 없을 때 새로 생성 -> 201 created
    • 이미 있는 리소스 수정 성공 -> 200 or 204
  • 처음 구상은 유저와 예산 데이터 관계를 1:1로만 생각했는데 월별로 예산 데이터를 설정해야 자연스러울 듯
    • 유저와 예산이 1:n 관계가 되도록 모델링
    • 뱅샐 월별로 예산 데이터 따로 존재
  • 예산 설정 한계
    • 뱅셀 전체 예산 1원 이상 ~ 1조 미만, 카테고리별 예산도 1조 미만으로 설정되나 모든 카테고리 예산 합이 1조 미만이어야됨

2. 카테고리 목록 GET /api/categories

  • 카테고리에 뭘 넣을건지 찾아보기
  • 뱅샐
    • 식비, 카페/간식, 술/유흥, 생활, 온라인 쇼핑, 패션/쇼핑, 뷰티/미용, 교통, 자동차, 주거/통신
    • 의료/건강, 금융, 문화/여가, 여행/숙박, 교육/학습, 자녀/육아, 반려동물, 경조/선물
  • 토스
    • 교육, 이체, 쇼핑, 식비, 교통/자동차, 편의점/마트/잡화, 주거/통신, 보험/세금/기타금융, 카테고리 없음
  • 당장 개발 용도로는 식비, 교통, 쇼핑, 마트, 통신, 금융, 의료 정도로 정하고 추후에 추가

3. 예산 설계(=추천) GET /api/budgets/recommend

  • 카테고리 지정 없이 총액 설정하면
    • 적절하게 카테고리별 예산 자동 생성
  • 유저들이 설정한 카테고리 별 예산을 통계내어 적용
    • ex) 1. 평균적으로 식비 40%, 주거 30%이면 이에 맞게 추천, 10% 이하 카테고리 다 합쳐서 n% 기타로

기타 (optional)

  • 통계 데이터 활용
  • 목적 : 단순 평균 말고 좀 더 유의미한 데이터를 가공할 수 있도록 판단 근거 찾기

어떻게? -> 유저 데이터의 평균치 사용하는 것이 보통은 적절한 방법인가?

  • 노이즈? 튀는 값 제거를 위해 상, 하위 몇 % 짜르고 난 뒤 데이터로 평균?
    • 해당 프로젝트 기준으로 0~너무 낮은 값 입력한 사람, 아니면 자산이 실제로 너무 많거나(소수), 과장된 금액을 등록한 데이터들 필터링하고 최대한 유의미한 데이터들로 평균내는게 좋아보임
  • 상(0 ~ 33), 중(33 ~ 66), 하(66~100) 그룹 나눠서 평균내고 내가 속한 그룹내의 평균으로 설정? -> 그룹 나누는 기준 연봉으로?

평균을 내는 대상(그룹)
뱅샐

  • 분석탭 -> 내 자산 순위 -> 그룹(20대 후반 남성) 중 OOO님은 상위 n %에 속해요
    • 내가 속한 그룹보다 계좌/현금 n% 많아요 or 적어요, 부채 n% 많아요 or 적어요 등 투자, 실물자산까지
  • 그룹 지어서 통계 낼거면 유저(member) 데이터에 추가적인 필드들 필요
  • 어떤 데이터들 추가 수집할 건지 고민 - 나이, 성별, 연봉 등?

C. 지출 기록

지출 CRUD

  • 생성한 유저만 권한 가짐
    • role 필요없고, 단순 id(pk), accountId 비교 정도

1. 지출 생성 POST /api/expenditures

2. 지출 목록 조회 GET /api/expenditures?queryparams...

  • (필수)기간으로 조회
  • 조회된 모든 내용에 지출 합계, 카테고리 별 지출 합계 반환
  • 특정 카테고리만 조회
  • 최소, 최대 금액으로 조회

3. 지출 상세 조회 GET /api/expenditures/{expenditureId}

4. 지출 수정 PATCH /api/expenditures/{expenditureId}

5. 지출 삭제 DELETE /api/expenditures/{expenditureId}

기타 (optional)

  • soft vs hard?
    • 보통 삭제하는 경우가 잘 못 기입한 지출 데이터 삭제하려나? 싶음
    • 그러면 통계 반영에 의미 없는 데이터니 hard가 맞나?
    • 하지만 유저가 주로 무슨 지출 데이터를 삭제하냐를 또 봐줘야할 경우도 있을 것 같아서 soft?
      • 진짜로 잘 못 삭제 -> 현재는 지출 데이터를 수기 입력이지만 실서비스 app들은 내 카드, 통장 내역 알아서 긁어와서 지출 데이터 매핑해주는데 유저가 많이 삭제하는 데이터 값 데이터 다루게 되면 쓰레기값 많이 기입 되는 케이스를 찾을 수 있지 않나??(특정 은행 api, 카드사 api의 데이터만 유효하지 않은 데이터가 많이 기입된다거나 등)
      • 아니면 지금 당장 유효하게 사용할 경우를 못 찾지만 이후 내부적인 통계에서 활용될 여지가 있는 데이터니 미리 soft 전략을 채택? (soft -> hard 가 hard -> soft 전환보다 쉬울듯)

#### 합계제외 POST or PATCH /api/expenditures/exclude-total

  • 지출 update api에서 request body로 포함해도 될듯?

D. 지출 컨설팅

지출 추천이랑 안내는 API도 열어두고 스케줄링 돌려서 알림도 따로 해야되나?

#### 오늘 지출 추천 GET /api/expenditures/recommend

오늘 예산 안내 GET /api/budgets/daily

  • 오늘 예산 안내라는게 좀 더 자연스러운 표현인 듯
  • 스케줄링 or 배치성 작업
  • 알림 발송(매일 08:00)
  • 기간 전체 예산을 초과 하더라도 0원 또는 음수의 예산 추천 x
    • 최소 금액 자유롭게 지정인데 이 것을 정하는게 쉽지 않음
    • 지속적인 소비 습관을 생성하기 위한게 목적, 예산 초과하더라도 적정한 금액을 추천 받아야 함

기타 (optional)
적절한 금액?

  • 일정 구간 별 다음 구간으로 목표 설정해서 금액 조절
    • ex) 100만 설정 현재 105만 썼으면, 구간을 120% 150% 175% 200% 이렇게 잡는다고 하면 목표 예산 금액을 100 -> 120만으로 바꾸고 120만 - 105만 / 남은 일로 설정

오늘 지출 안내 GET /api/expenditures/daily

  • 스케줄링 or 배치성 작업
  • 알림 발송(매일 20:00)

알림 우선 순위

  • 희망 : line > discord = slack
    • 따로 클라이언트가 있는게 아니라서 line으로 받아보는게 서비스 사용 양상이랑 제일 비슷해 보임
  • 예상 난이도 : discord < line

E. 지출 통계

지출 통계 GET /api/expenditures/stats

  • 지난 달 대비 총액, 카테고리 별 소비율
  • 지난 요일 대비 소비율
    • ex) 오늘 월요일 -> 지난 월요일에 소비한 모든 기록 대비 소비율 -> 월요일 평소 대비 80%
  • 다른 유저 대비 소비율
    • 오늘 기준 다른 유저가 예산 대비 사용한 평균 비율 대비 나의 소비율
    • 다른 유저 지출 평균 50%, 나는 60% -> 120%로 반환

💬 기타 사항

희망사항
통계 관련 데이터 배치 처리

  • API 호출할 때 실시간 계산 처리 x -> 특정 시간 배치 돌려서 미리 처리하는 게 좋아 보임
    • 실제로는 데이터가 몇백 ~ 몇억 건 될 테니깐?
  • 스프링 배치 러닝 커브가 좀 있지 않으려나?
  • 작업 기간 생각해서 실시간 처리 -> 배치 처리, 스케줄러 -> 배치 변경

시간이 좀 더 필요한 기능

  • B 예산 설계(=추천), D 지출 추천과 안내 ,E 지출 통계

유저 시나리오에서 가장 최소 단위로 필요한게 월별 총 예산을 설정하고 매일 소비 가능한 지출과 매일 발생한 지출을 카테고리별로 안내받는 것인데
이를 위해 필요한 순서

  • D > E >= B
  • D의 오늘 지출 추천에서 기간 전체 예산 초과해도 0원 또는 음수의 예산을 추천 받지 않아야 하기 위해 적절한 금액 알려줄 때, 적절한 금액 선정하기가 어려우니 고정된 최소 금액으로 하고 이후 변경

fix: JWT payload 수정과 토큰 재발급 버그 수정

📃 내용

  • 계정 id 정보 private claim 에서 registered claim인 subject로 변경
  • 토큰 재발급 새로 발급한 토큰이 아닌 기존 토큰 그대로 반환하는 버그 수정

✅ 작업 내용

  • jwt에서 계정 id 정보 subject로 변경
  • 토큰 재발급 오타 수정
  • 토큰 관련 코드에서 try-catch 중 일부 catch에서 예외 처리 코드 수정

💬 기타 사항

feat: 예산 설정 API 구현

📃 설명

  • 해당 기간 별 예산 설정
    • 년, 월 정보만 받아서 월 단위 예산만 설정하도록 구현 예정
    • 예산은 카테고리 필수로 지정
    • ex) 식비 : 40만원, 교통 : 20만원
  • 유저는 언제든지 예산 정보 변경 가능

✅ 작업 내용

  • 예산 설정 API 구현

💬 기타 사항

feat: 지출 수정 API 구현

📃 설명

  • 지출 일시, 지출 금액, 카테고리, 메모, 합계 제외 필드로 수정 요청

✅ 작업 내용

  • 지출 수정 API 구현

💬 기타 사항

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.