- 회원가입
- 유저의 유니크 키(DB primary key), 유저 아이디/비밀번호, 이름(닉네임)으로 구성합니다.
- 정산 (settlement)
- 한 유저당 정산을 여러개 만들 수 있습니다.
- 유저는 여러 정산에 참가할 수 있습니다.
- 특정 정산에 참가(join)한 유저들만 정산 내역(=지출)들을 열람할 수 있습니다.
- ex)
- 강릉 여행 정산 - 유저1, 유저2 참가
- 망년회 정산 - 유저1, 유저3 참가
- 유저2는 망년회 정산을 보지 못하고, 유저3은 강릉 여행 정산 열람이 불가능 합니다.
- 유저1의 정산 목록 : 강릉 여행 정산, 망년회 정산 두개가 노출
- 유저2의 정산 목록 : 강릉 여행 정산 노출
- 유저3의 정산 목록 : 망년회 정산 노출
- ex)
- 지출 (expense)
- 지출에 필요한 것
- 지출 id
- 지출 이름
- 지출한 사람 - 어떤 유저가 지출했는지 매핑 필요
- 지출 금액
- 지출 날짜
- 정산은 여러개의 지출을 가지고 있음. (1:N)
- ex) 강릉 여행 정산(settlement)은 다음의 지출(expense)을 가지고 있음.
- 기차표 예매 (지출 이름)
- 유저 1 (지출한 사람)
- 80,000 원 (지출 금액)
- 2023-08-01 (지출 날짜)
- 숙소 값 (지출 이름)
- 유저 2 (지출한 사람)
- 200,000 원 (지출 금액)
- 2023-08-02 (지출 날짜)
- 첫날 저녁 (지출 이름)
- 유저 1 (지출한 사람)
- 50,000 원 (지출 금액)
- 기차표 예매 (지출 이름)
- ex) 강릉 여행 정산(settlement)은 다음의 지출(expense)을 가지고 있음.
- 지출에서 지출 금액의 단위는 원화를 기준으로 한다.
- 지출에 필요한 것
- 정산 결과 (balance)
- 하나의 정산은 하나의 정산 결과를 가지고 있다. (1:1 대응)
- 정산 결과에서는 정산에 참여(join)한 유저끼리 송금을 얼마큼 해줘야 하는지 보여준다.
- ex) 강릉 여행 정산의 정산 결과 예시
- 유저 2 > 유저 1 : 230,000 원 송금
- ex) 두명 이상이 참여한 정산
-
유저 1: 150,000 원 지출
-
유저 2: 30,000 원 지출
-
유저 3: 80,000 원 지출
-
유저 4: 100,000 원 지출
-
총 정산 금액 : 360,000 원
-
360,000 원 / 4명 = 90,000 원
-
유저 1 : 6만원 받아야 함
-
유저 2 : 6만원 지불해야 함
-
유저 3 : 1만원 지불해야 함
-
유저 4 : 1만원 받아야 함
-
유저 2 > 유저 1 : 60,000 원 송금
-
유저 3 > 유저 4 : 10,000 원 송금
-
- ex) 강릉 여행 정산의 정산 결과 예시
- 정산 결과 (balance)에 대한 응답값은 한 유저가 다른 유저에게 얼만큼 전송하는지의 금액만 내려준다.
- 모두 같은 금액을 지출하여 정산할 내역이 없을 경우 빈 결과를 내려준다.
[ { "senderUserNo": 2, "senderUserName": "유저2", "sendAmount": 60000, "receiverUserNo": 1, "receiverUserName": "유저1" }, { "senderUserNo": 3, "senderUserName": "유저3", "sendAmount": 10000, "receiverUserNo": 4, "receiverUserName": "유저4" } ]
- 스프링 부트 사용
- AutoConfiguration 사용
- 어플리케이션이 executable jar로 패키징 되어 java -jar로 실행이 가능해야함.
- 회원가입 기능
- 스프링 MVC 2편 [섹션 6. 로그인 처리1 - 쿠키, 세션], [섹션 7. 로그인 처리2 - 필터, 인터셉터] 코드 활용
- 데이터 저장 기능
- H2 데이터 베이스 이용
- JdbcTemplate 이용
- API만 구현하면 되며, 웹 화면 구성 등의 프론트 기능을 구현할 필요 없음.
- JSON 통신
- 금액을 다룰때는 BigDecimal 클래스로 하며, 1원 단위에서 반올림을 한다.
- CRUD 중 Update에 대한 기능은 제외해도 됩니다. (Create, Read, Delete 만 구현 가능)
