Skip to content

Wanted-Pre-Onboarding-Backend7-R/budget-manager

Repository files navigation

BudgetManager - 예산 관리 웹 백엔드 서버

본 서비스는 사용자들이 개인 예산을 설정하고 지출을 추적/모니터링하여 개인 재무 목표를 달성하는 데 도움을 주는 웹 애플리케이션입니다.


0. 목차


1. 프로젝트 소개

1-A. 유저스토리

요구사항 링크

  • A. 유저는 본 사이트에 들어와 회원가입을 통해 서비스를 이용합니다.
  • B. 예산 설정 및 설계 서비스
    • 월별 총 예산을 설정합니다.
    • 본 서비스는 카테고리 별 예산을 설계(=추천)하여 사용자의 과다 지출을 방지합니다.
  • C. 지출 기록
    • 사용자는 지출금액, 카테고리 등을 지정하여 등록 합니다. 언제든지 수정 및 삭제 할 수 있습니다.
  • D. 지출 컨설팅
    • 월별 설정한 예산을 기준으로 오늘 소비 가능한 지출 을 알려줍니다.
    • 매일 발생한 지출카테고리 별로 안내받습니다.
  • E. 지출 통계
    • 지난 달 대비 , 지난 요일 대비, 다른 유저 대비 등 여러 기준 카테고리 별 지출 통계를 확인 할 수 있습니다.

1-B. 기술 스택

  • 언어 및 프레임워크: Java Spring Boot

  • DB 및 데이터 접근 기술: Spring Data JPA QueryDSL MySQL H2

  • 인증/인가: Spring Security JWT

  • 기타: Swagger Gradle


2. API 설계


3. ERD 설계


4. 구현과정(설계 및 의도)


5. 트러블슈팅 및 회고


6. 규칙

Code 컨벤션 - click
  • 변수명: boolean인 경우 형용사, 그 외 명사

  • 함수명: 동사 현재형으로 시작

  • 클래스명: 명사

  • if, for 중괄호 한 줄이라도 항상 치기

  • 커밋하기 전에

    • import 정리: ctrl + alt(option) + o
    • line formatting: ctrl(command) + alt(option) + l
    • 마지막 빈 줄 추가
    /** 예시 **/
    public class Clazz {
    
        public int addCountIfValid(int count, boolean isValid) {
            if (isValid) {
                return count + 1;
            }
            return count;
        }
    }
    // 마지막 빈 줄
  • Optional 줄바꿈

    Member member = memberRepository.findByEmail(dto.getEmail())
          .orElseThrow(NotFoundMemberByEmailException::new);`
  • 객체 생성 규칙

    • 외부에서 직접적인 new 지양하고 내부적으로 활용 @Builder 및 정적 팩토리 메서드 활용
    • 정적 팩토리 메서드 이름은 단일 인자일 경우 from, 다중 인자일 경우는 of로 명명
    • Bean 제외 DTO, Entity들은 @All-/@Required-ArgsContructor 활용 제한, 직접 코드로 생성자 작성 및 private/protected 등으로 잠그기
    • 목적: 같은 타입의 필드 연속될 때 1) 잘못된 값 입력하는 human error 최소화, 2) 필드 순서를 바꿀 경우 IDE에 의한 리팩토링이 적용되지 않는 Lombok 에러 방지, 3) 가독성을 위한 작성법 통일을 위하여
     @Getter
     @NoArgsConstructor(access = AccessLevel.PROTECTED)
     @EqualsAndHashCode(of = "accountName", callSuper = false)
     @Entity
     public class Member extends BaseEntity {
    
         @Column(nullable = false, unique = true)
         private String accountName;
    
         @Column(nullable = false)
         private String email;
     
         @Column(length = 60, nullable = false)
         private String password;
    
         @Column(length = 6, nullable = false)
         private String approvalCode;
     
         @Column(nullable = false)
         private Boolean isApproved;
     
         @Enumerated(EnumType.STRING)
         private Authority authority;
     
         @Builder
         private Member(String accountName, String email, String password, String approvalCode, Boolean isApproved) {
             this.accountName = accountName;
             this.email = email;
             this.password = password;
             this.approvalCode = approvalCode;
             this.isApproved = isApproved;
             authority = Authority.ROLE_USER;
         }
    
         public static Member of(MemberJoinRequest dto, String encodedPassword, String approvalCode) {
             return builder()
                     .accountName(dto.getAccountName())
                     .email(dto.getEmail())
                     .password(encodedPassword)
                     .approvalCode(approvalCode)
                     .isApproved(false)
                     .build();
         }
     }

Git 컨벤션 - click
  • commit message rules

    | type | description | |----------|-------------| | feat | 새로운 기능 추가 | | fix | 버그 및 로직 수정 | | refactor | 기능 변경 없는 코드 구조, 변수/메소드/클래스 이름 등 수정 | | style | 코드 위치 변경 및 포맷팅, 빈 줄 추가/제거, 불필요한 import 제거 | | test | 테스트 코드 작성 및 리팩토링 | | setup | build.gradle, application.yml 등 환경 설정 | | docs | 문서 작업 |

    # commit title format
    git commit -m "{커밋 유형} #{이슈번호}: #{내용}"
    
    # example of git conventions
    git commit -m "refactor #125: `ChatService` 중복 로직 추출
    
    예외 압축
    메소드 위치 변경
    메소드 이름 변경
    "
  • branch naming rules

    # branch name format
    git checkout -b "feat/#{이슈번호}-{내용}"

7. 작성자

name github email
정준희 @JoonheeJeong [email protected]

Releases

No releases published

Packages

No packages published

Languages