Skip to content

[Software Design Web Service] 모임 정산 서비스 TripTip

Notifications You must be signed in to change notification settings

psychology50/trip-tip

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

54 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

모임 정산 관리 서비스. trip-tip

3. Design

Software Design Web Service

logo
Student No 21911407
Name 양재서
E-Mail 21911407@yu.ac.kr

[ Revision history ]

Revision date Verision # Description Author
2023/06/06 v1.0.0 First Writing YANG JAESEO
2023/06/08 v1.0.1 Update Class diagram YANG JAESEO
2023/06/09 v1.0.2 Update Sequence diagram YANG JAESEO

[ Contents ]

[ 1. Introduction ]

    모임이나 친구들과의 여행을 하면서 발생한 지출에 대해 정산을 해야 하지만, 이를 지속적으로 관리하기란 상당히 번거롭고 어려운 일이다. 이미 수많은 더치페이 정산 시스템이 마련되어 있지만, 사용자들이 지속적으로 정산을 한 후에 최종적인 청구 기능밖에 존재하지 않는다. 총무라는 역할을 누군가는 수행해야 하지만 그 자리가 주는 스트레스와 부담감으로 인해 누구나 선뜻 자처하려는 사람이 없다.
    이러한 문제를 해결하기 위하여 모임의 정산 내역을 지속적으로 쉽고 간편하게 관리할 수 있는 정산 서비스 Trip-Tip을 만들게 되었다.
    본 문서에서는 Analysis에 이어서 Design 단계에 대한 설계를 기술한다. class diagram, sequence diagram, state machine diagram을 통해 설계를 진행하였으며, implementation requirements를 문서화하여 시스템 구현에 필요한 소프트웨어 및 하드웨어 요구사항을 명세한다.

[ 2. Class diagram ]

classdiagram

[그림 1] Class diagram

Spring MVC 패턴을 사용하여 구현하였다. 개수가 너무 많은 관계로 Spring에서 제공하는 클래스에 대해서는 설명하지 않을 것이다. 또한 유지보수를 위해 Service, DTO를 세분화하였기 때문에 근본적인 목적이 동일한 클래스에 대해서는 추가 설명을 작성하지 않을 것이다.
설명의 용이성을 위하여 도메인 별로 그룹 지어 설명을 진행한다.

user, member, group, meeting, receipt, participant, settlement, others
각 도메인은 Domain → DTO → API → Service → DAO 클래스 순서로 기술

2.1. User

    2.1.1. Domain

ClassName User
Attributes - address: Address : Address 클래스 임베디드 필드
- bank: Bank : Band 클래스 임베디드 필드
- is_leader: List<Group> : Leader 권한으로 속해있는 Group 리스트
- members: List<Member> : 가입해있는 Group들과 매핑된 Member 리스트
- nickname: String : 사용자 닉네임
- participants: List<Participant> : 정산해야 하는 개별 영수증 비용 리스트
- password: String : 사용자 비밀번호
- pay_receipts: List<Receipt> : 자신이 결제한 영수증 리스트
- phone: Phone : Phone 클래스 임베디드 필드
- receivedSettlements: List<Settlement> : 수금해야 하는 Settlement 리스트
- role: RoleType : 사용자 역할
- sentSettlements: List<Settlement> : 지불해야 하는 Settlement 리스트
- user_id: Long : primary key
- username: String : 사용자 이름
Methods + builder : 자바 클래스 설계 원칙에 의거한 Builder 메서드
+ getter : 모든 필드 정보 조회에 대한 개별 getter 메서드
+ toString : 자바 클래스 설계 원칙에 의거한 toString 메서드
Description 데이터 베이스의 User table과 매핑되는 도메인 클래스에 해당한다.
ClassName Address
Attributes - city: String : 시
- country: String : 도
- state: String : 군/구
- zipCode: String : 우편번호
Methods + builder & getter
Description User Domain field에 Embedded하기 위한 클래스
ClassName Phone
Attributes - local: String
- local_prefix: String
- local_suffix: String
Methods + builder & getter
Description User Domain field에 Embedded하기 위한 클래스
ClassName Bank
Attributes - bank_account: String : 정산을 청구할 계좌 번호
- bank_name: String : 은행 이름
Methods + builder & getter
Description User Domain field에 Embedded하기 위한 클래스
ClassName RoleType
Attributes + ROLE_USER: 사용자
+ ROLE_ADMIN: 관리자
Methods -
Description USER와 ADMIN을 SpringSecurity에서 구분해주기 위한 Enum 타입의 클래스

    2.1.2. DTO

ClassName UserDefaultDto
Attributes - nickname: String
- user_id: Long
- username: String
Methods + builder & getter
Description 그룹 생성 페이지에서 리더가 될 유저의 정보를 담은 Dto
ClassName UserDto
Attributes - bank_account: String
- bank_name: String
- groupList: List<Group> : 가장 최근에 생성한 3개의 그룹 정보
- local: String
- local_prefix: String
- local_suffix: String
- nickname: String
- username: String
Methods + getter & builder & toString
+ addGroup(group: Group) : void : 가장 최근에 생성한 Group을 groupList에 추가
Description 로그인한 유저 정보를 메인 페이지에 전달하는 DTO
ClassName UserLoginDto
Attributes - nickname: String
- password: String
Methods + builder & getter
Description 사용자가 로그인할 때 사용되는 Dto
ClassName UserParticipationDto
Attributes - cost: Double : 사용한 금액
- nickname: String : 정산 참가자 닉네임
- selected: Boolean : 정산 참가 여부
- user_id: Long : 정산 참가자 primary key
- username: String : 정산 참가자 이름
Methods + builder & getter & toString
Description 영수증을 생성할 때, ReceiptCreateDto의 필드로 포함될 유저 정보 및 개별 사용한 비용 정보
ClassName UserRegisterDto
Attributes - bank_account: String
- bank_name: String
- city: String
- country: String
- id: Long
- local: String
- local_prefix: String
- local_suffix: String
- nickname: String
- password: String
- state: String
- username: String
- zipCode: String
Methods - builder & getter & toString
- toEntity(): User : 사용자에게 입력받은 데이터 기반의 User 객체 생성
Description 회원 가입 시 사용하는 DTO

    2.1.3. API

ClassName UserAPI
Attributes -
Methods + accessDenied(String, Model): String : Spring Security 인증 과정에서 오류 발생 시 handler에 의해 요청되는 페이지 호출
+ deleteRequest(Model): RedirectView : 유저 삭제 요청
+ loginRequest(String, String, Model): String : 로그인 요청
+ logoutRequest(HttpServletRequest, HttpServletResponse): String : 로그아웃 요청
+ notifyPageRequest(Model): String : 알림 페이지로 이동
+ profileRequest(Model): String : 프로필 페이지로 이동
+ registerRequest(Model): String : 회원가입 페이지로 이동
+ registerResponse(UserRegisterDto): RedirectView : 회원가입 요청 처리
+ searchUser(String): ResponseEntity<UserDefaultDto> : 유저 검색 기능
Description User Domain과 관련된 Http Request와 인증, 파라미터를 처리하는 Controller

    2.1.4. Service

ClassName UserSearchService
Attributes -
Methods + findUserAll(): List<User> : DB 상의 모든 User를 탐색한다.
+ findUserByGroupId(Long): List<User> : id에 매칭되는 Group에 속한 User를 탐색한다.
+ findUserById(Long): Optional<User> : id로 특정 User를 탐색한다.
+ findUserByNickname(String): Optional<User> : nickname으로 특정 User를 탐색한다.
Description User 도메인과 관련된 비니지스 로젝을 처리하는 클래스
ClassName UserSignService
Attributes -
Methods + register(UserRegisterDto): User : 회원가입 요청을 처리한다.
Description User의 정보를 입력받아 Database에 저장하는 과정에서 비지니스 로직을 처리하는 클래스. 로그인, 로그아웃은 SpringSecurity에서 제공하는 기능을 이용하므로 필요 없다.

2.2. Member

    2.2.1. Domain

ClassName Member
Attributes - group: Group
- member_id: Long
- user: User
Methods + builder & getter & toString
Description User와 Group의 다대다 관계를 분리하기 위한 중계 테이블

2.3. Group

    2.3.1. Domain

ClassName Group
Attributes - group_code: String : 그룹 생성 시, 시스템 내부에서 생성되는 그룹 고유 코드.
- group_id: Long : 그룹의 primary key
- group_name: String : 그룹 이름
- leader: User : 그룹 생성자
- meetings: List<Meeting> : 그룹 내의 meeting 리스트
- members: List<Member> : 그룹에 속한 Member 리스트
Methods + builder & toString & getter
Description 여러 모임을 진행하는 동안 함께 하는 인원들이 속해있는 Group의 데이터를 담은 도메인 클래스

    2.3.2. DTO

ClassName GroupCreateDto
Attributes - group_code: String
- group_id: Long
- group_name: String
- members: List<User>
Methods + builder(): GroupCreateDtoBuilder
+ toEntity(String): Group : 랜덤 생성 code 결과 값 주입을 위해 매개변수가 지정된 toEntity
+ toString(): String
Description 그룹 생성 페이지를 구성하고 결과를 받아오기 위한 Dto
ClassName GroupDetailDto
Attributes - group_code: String
- group_id: Long
- group_img: String
- group_name: String
- leader_id: Long : 그룹의 리더 아이디
- leader_username: String : 그룹의 리더 이름
- meetings: List<Meeting> : 그룹에 생성된 모임 리스트
- total: Integer : 그룹 내 전체 결제 금액 합
Methods + builder & toEntity & getter
Description 그룹 상세 페이지 구성을 위한 Dto
ClassName GroupJoinDto
Attributes - group_code: String : 가입할 그룹의 코드
Methods + getGroup_code() : String
Description 사용자가 가입하고자 하는 Group의 코드 정보
ClassName RecentGroupDto
Attributes - group_image: String
- group_name: String
Methods + builder(): RecentGroupDtoBuilder
+ toString(): String
Description 로그인한 메인 페이지 구성을 위한 가장 최근 가입한 Group 3개가 담긴 리스트

    2.3.3. API

ClassName GroupAPI
Attributes -
Methods + groupCreateRequest(Authentication, Model): String : 그룹 생성 페이지를 반환해주는 메서드 + groupDeleteRequest(Long, Authentication): RedirectView : 그룹 삭제 Request에 대한 Service를 호출하는 메서드
+ groupDetailRequest(Long, Model): String : 특정 그룹 정보 Request에 대한 Service를 호출하는 메서드
+ groupJoinRequest(GroupJoinDto, Authentication): RedirectView : 그룹 참가에 대한 Service를 호출하는 메서드
+ groupListRequest(Authentication, Model): String : 사용자가 가입한 모든 그룹 리스트에 대한 Service를 호출하는 메서드
+ groupSaveRequest(GroupCreateDto, Authentication): ResponseEntity<String> : 그룹 생성 Request에 대한 Service를 호출하는 메서드
+ groupSettleRequest(Long, Authentication): ResponseEntity<String> : 그룹 정산 Request에 대한 Service를 호출하는 메서드
Description Group 도메인 관련 Client Http 요청을 적절한 비지니스 로직과 매핑하고 응답을 내려주는 Controller

    2.3.4. Service

ClassName GroupSearchService
Attributes -
Methods + findGroupAll(): List<Group>
+ findGroupById(Long): Optional<Group>
+ findGroupByUser(User): List<Group>
+ findRecentGroupByUser(User): List<Group>
+ getTotalGroupCost(Long): Integer
Description Group 검색과 관련한 비지니스 로직을 담당하는 Service 클래스
ClassName GroupManageService
Attributes -
Methods + deleteGroup(Long): void
- generateGroupCode(): String
+ save(User, GroupCreateDto): Optional<Group>
+ settleGroup(Long): void
Description Group 생성, 삭제 기능 관련 비지니스 로직을 담당하는 Service 클래스
ClassName GroupJoinService
Attributes -
Methods + joinGroup(User, GroupJoinDto): boolean : 기존에 있는 그룹에 참여하는 비지니스 로직을 담당하는 Service 클래스
Description Group 참가 관련 비지니스 로직을 담당하는 Service 클래스

2.4. Meeting

    2.4.1. Domain

ClassName Meeting
Attributes - group: Group : 모임이 속해있는 Group과 매핑된 foreign key
- is_clear: Boolean : 모임 종료 여부
- meeting_day: LocalDate : 모임이 진행된 날짜
- meeting_id: Long : 모임의 primary key
- meeting_name: String : 모임 이름
- receipts: List<Receipt> : 모임에 등록된 영수증 리스트
Methods + builder(): MeetingBuilder
+ toString(): String
+ getter
Description 그룹 내에서 모임을 날짜별로 구분하기 위한 도메인 클래스

    2.4.2. DTO

ClassName MeetingListDto
Attributes - meeting_day: LocalDate
- meeting_id: Long
Methods + builder(): MeetingListDtoBuilder
+ getter
Description Group Detail Page 내에 보여질 간략한 Meeting List 정보
ClassName MeetingDetailDto
Attributes - group: Group
- leader_id: Long
- leader_username: String
- meeting_day: LocalDate
- meeting_id: Long
- receipts: List<Receipt>
- total: Integer
Methods + builder(): MeetingDetailDtoBuilder
Description Meeting Detail Page 구성을 위한 DTO

    2.4.3. API

ClassName MeetingAPI
Attributes -
Methods + meetingDeleteRequest(Long, Long, Authentication): ResponseEntity<String> : 미팅 삭제 Request와 관련된 Service와 매핑시켜주는 메서드
+ meetingDetailPageRequest(Long, Long, Model): String : meeting의 상세 정보 Request와 관련된 Service를 매핑시켜주고 페이지를 내려주는 메서드
+ meetingSaveRequest(Long): ResponseEntity<MeetingListDto> : meeting 저장 Request를 관련된 Service와 매핑시켜주는 메서드
Description Meeting 도메인 관련 Client Http 요청을 적절한 비지니스 로직과 매핑하고 응답을 내려주는 Controller

    2.4.4. Service

ClassName MeetingSearchService
Attributes -
Methods + findMeetingAll(): List<Meeting> : DB에 존재하는 모든 Meeting을 탐색하는 메서드
+ findMeetingById(Long): Optional<Meeting> : 특정 meeting 정보를 탐색하는 메서드
Description Meeting 도메인 관련 검색 비지니스 로직을 담당하는 Service
ClassName MeetingManageService
Attributes -
Methods + deleteMeeting(User, Long): void : 특정 meeting을 삭제하기 위한 메서드
+ save(Long): Meeting : meeting을 생성하기 위한 메서드
Description Meeting 도메인의 생성과 삭제 비지니스 로직을 담당하는 Service

2.5. Receipt

    2.5.1. Domain

ClassName Receipt
Attributes - is_clear: Boolean : 영수증 정산 여부
- meeting: Meeting : 영수증이 등록된 meeting을 가리키는 foreign key
- participants: List<Participant> : 영수증에 참가한 멤버 정보
- payer: User : 영수증 비용을 지불한 멤버 정보
- receipt_id: Long : 영수증 primary key
- receipt_name: String : 영수증 이름
- total: Double : 영수증 총 지불 금액
Methods + builder(): ReceiptBuilder
+ toString(): String
Description 모임에서 진행된 결제 내역을 저장하기 위한 도메인

    2.5.2. DTO

ClassName ReceiptCreateDto
Attributes - is_clear: Boolean
- meeting: Meeting
- participationUsers: List<UserParticipationDto>
- payer: User
- receipt_id: Long
- receipt_name: String
- total: Double
Methods + builder(): ReceiptCreateDtoBuilder
+ toEntity(): Receipt
+ toString(): String
Description 레시피 생성을 위한 DTO
ClassName ReceiptDetailDto
Attributes - is_clear: Boolean
- meeting: Meeting
- participants: List<Participant>
- payer_cost: Integer : 영수증 생성한 멤버가 사용한 비용
- payer_id: Long
- payer_nickname: String
- payer_username: String
- receipt_id: Long
- receipt_name: String
- total: Integer
Methods + builder(): ReceiptDetailDtoBuilder
Description 영수증 상세 페이지 구성을 위한 Dto

    2.5.3. API

ClassName ReceiptAPI
Attributes -
Methods + create(Long, Long, Authentication, Model): String : Receipt 생성을 위한 페이지 반환
+ create(Long, Long, ReceiptCreateDto): ResponseEntity<Receipt> : Receipt 생성을 위해 사용자 Form을 구성할 정보를 반환하는 Service와 매핑하는 메서드
+ createForm(Authentication, Long, Long): ResponseEntity<ReceiptCreateDto> : Receipt 생성 Request를 담당하는 Service와 매핑하는 메서드
+ delete(Long, Long, Long): ResponseEntity<String> : 해당 Receipt를 삭제하는 Service와 매핑하는 메서드
+ detail(Long, Long, Long, String, Model): String : Receipt 상세 정보를 담당하는 Service와 매핑하고 페이지를 내려주는 메서드
Description Receipt 도메인 관련 Client Http 요청을 적절한 비지니스 로직과 매핑하고 응답을 내려주는 Controller

    2.5.4. Service

ClassName ReceiptSearchService
Attributes -
Methods + findReceiptAll(): List<Receipt> : DB 상의 모든 Receipt 정보를 조회한다.
+ findReceiptById(Long): Optional<Receipt> : 특정 Receipt 정보를 조회한다.
Description Receipt 도메인 관련 검색 비지니스 로직을 담당하는 Service
ClassName ReceiptManageService
Attributes -
Methods + delete(Long): void : Receipt 삭제 비지니스 로직을 처리하는 메서드
+ save(ReceiptCreateDto): Receipt : Receipt 저장하는 메서드
Description Receipt 도메인의 생성과 삭제 비지니스 로직을 담당하는 Service

2.6. Participant

    2.6.1. Domain

ClassName Participant
Attributes - cost: Double : 해당 영수증에서 사용한 금액
- is_clear: Boolean : 정산 여부
- participant_id: Long : 참가자 테이블 primary key
- receipt: Receipt : 매핑된 영수증을 참조하는 Foreign key
- user: User : 매핑된 사용자를 참조하는 Foreign key
Methods + builder(): ParticipantBuilder
+ toString(): String
Description Receipt에 참여한 User의 다대다 관계를 제거하기 위한 중개 테이블

    2.6.2. Service

ClassName ParticipantSearchService
Attributes -
Methods + findParticipantByMeetingId(Long): List<Participant> : 해당 모임에 속한 모든 참가자 정보를 조회하는 메서드
+ findParticipantsByReceiptId(Long): List<Participant> : 해당 영수증에 속한 모든 참가자 정보를 조회하는 메서드
+ getCostByReceiptIdAndUserId(Long, Long): Integer : 특정 영수증에 참가한 사용자가 사용한 cost 필드 정보를 가져오는 메서드
Description

2.7. Settlement

    2.7.1. Domain

ClassName Settlement
Attributes - amount: Double : 지불 금액
- id: Long : settlement primary key
- isSent: Boolean : 지불 여부
- receiver: User : 받는 사람 Foreign key
- sender: User : 보내는 사람 Foreign key
- sentTime: LocalDateTime : 지불한 시간
Methods + builder(): SettlementBuilder
+ markAsSent(): void : 정상적으로 정산이 실행되었으면 isSent 필드를 true로 바꾸는 메서드
+ toString(): String
Description 그룹 정산이 실행되고 최종적으로 그룹의 멤버들에게 통지되는 정산해야 할 내역 정보를 담은 도메인

2.8. Others

    2.8.1. BaseDateEntity

ClassName BaseDateEntity
Attributes - created_date : LocalDateTime : 생성 일자
- last_modified_date : LocalDateTime : 수정 일자
Methods -
Description 도메인에 공통적으로 적용되는 생성, 수정 시간 필드를 추가하기 위한 상속용 클래스.
primary field는 원래 상속이 불가능 하지만 java에서 제공하는 기능을 사용하여 주입하였다. 생성일과 수정일에 대한 관리는 JPA Auditing을 통해 자동으로 관리된다.

    2.8.2. CommonAPI

ClassName CommonAPI
Attributes -
Methods + home(): String : "/"로 GET 요청시 index()로 리다이렉트 한다.
+ index(Authentication, Model): String : Main Page를 구성하는 메서드
Description 특정 Domain에 종속되지 않고 root 단에서 매핑이 되어야 하는 Controller

    2.8.3. SecurityService

ClassName SecurityService
Attributes -
Methods - exception_handling(): void : 권한 없는 유저에 대한 예외 처리 로직
+ isLeader(Long): boolean : Request한 유저가 그룹의 리더인지 판단
+ isMember(Long): boolean : Request한 유저가 그룹의 멤버인지 판단
+ isPayer(Long): boolean : Request한 유저가 영수증의 payer인지 판단
Description 메서드 요청에 대해 보다 상세한 권한 인증을 위한 Security Service

[ 3. Sequence diagram ]

3.1. Login

    Login Use case에서의 Sequence Diagram이다. SpringSecurity 내부에서 인증 과정을 거치기 때문에 정확한 호출 순서는 구현하지 못하였다. 유저가 입력한 아이디 패스워드를 이용해 DB에 저장된 정보와 비교하여 인증을 진행한다. 인증이 완료되면 유저의 권한 정보를 이용해 권한을 부여한다. 권한이 부여되면 유저는 해당 권한을 이용해 서비스를 이용할 수 있다.
    로그인에 실패하면 로그인 페이지에 리다이렉션하며 아무런 변화가 없다.

3.2. Register

    Register Use case에서의 Sequence Diagram이다. 유저가 TripTip 기능들을 사용하기 위해 회원가입 버튼을 누르면 회원가입 폼이 있는 페이지를 반환한다.
    모든 정보를 기입하고 요청을 보내면 사용자 이용하려는 닉네임 중복 여부를 판단하고, 중복되지 않으면 DB에 반영하고 리다이렉션한다. 만약, 중복된 닉네임 정보가 있을 경우에는 예외 처리를 통해 사용자에게 알려준다.

3.3. Create Group

    Create Group Use case에서의 Sequence Diagram이다. 유저가 그룹 생성 버튼을 누르면 그룹 생성 폼이 있는 페이지를 반환한다. 해당 페이지에서는 그룹에 추가할 멤버를 검색할 수 있다. 비동기 통신을 이용하여 검색한 멤버를 페이지에 띄워준다. 검색한 멤버를 선택하면 멤버를 추가할 수 있는 버튼이 활성화된다. 멤버를 추가하고 그룹 생성 버튼을 누르면 그룹 생성 요청을 보낸다.
    모든 그룹은 고유한 문자열을 코드값으로 가지고 있어서, Service 내부에서 코드값이 중복되지 않는지 검사한다. 중복되지 않으면 그룹을 생성하고 DB에 반영한다. 중복이 있는 경우, 중복이 없는 코드를 만들때까지 코드 생성 함수를 반복한다. 그룹 생성이 완료되면 생성된 그룹 데이터를 Client에게 반환한다.

3.3. Join Group

    가입하고자 하는 그룹의 코드를 입력하고 요청을 보내면 Service 내부에서 해당 코드를 가진 그룹이 존재하는지 검사한다. 존재하지 않으면 예외 처리를 통해 사용자에게 알려준다. 존재하는 경우, 그룹에 가입한다.

3.4. Detail Group

    메인 페이지 혹은 그룹 리스트 페이지에서 가입한 그룹 목록이 나열된다. 이 중에서 상제 정보를 알고자 하는 그룹을 클릭하면 이벤트가 발생한다. group_id를 매핑하여 서버에 요청을 보내게 되면, Service에서는 해당 id를 가진 Group 정보를 반환한다. 반환된 정보를 이용하여 그룹의 상세 정보를 구성하여 페이지를 반환한다.

3.5 Delete Group

    그룹을 삭제하고자 하는 경우의 Sequence diagram이다. 그룹을 삭제하고자 하는 경우, 그룹의 리더만이 삭제할 수 있다. 그룹의 리더가 삭제 버튼을 누르면 그룹 삭제 요청을 보내게 된다. 해당 요청에 대해 Security Service에서 요청을 낚아채 그룹의 리더인지 판단하고, 리더가 맞다면 그룹을 삭제한다. 그룹을 삭제하면 그룹에 속한 모든 데이터가 삭제된다. 만약, 리더가 아니라면 예외 처리를 통해 사용자에게 알려준다.

3.6. Create Meeting

    그룹 상세 페이지에서 모임 생성 버튼을 누르면 모임 생성 폼이 있는 페이지를 반환한다. 해당 페이지에서는 모임의 이름과 날짜를 입력할 수 있다. 날짜는 달력을 통해 선택할 수 있으며, 오늘 날짜 이전의 날짜는 선택할 수 없다. 모임 생성 버튼을 누르면 모임 생성 요청을 보내게 된다. 모임 생성 요청에 대해 Security Service에서 요청을 낚아채 그룹의 리더인지 판단하고, 리더가 맞다면 모임을 생성한다. 모임을 생성하면 생성된 모임 데이터를 Client에게 반환한다. 만약, 리더가 아니라면 예외 처리를 통해 사용자에게 알려준다.

3.7. Detail Meeting

    그룹 상세 페이지에서 상세 정보를 알고 싶은 모임을 클릭하면 이벤트가 발생한다. 해당 모임의 id를 매핑하여 서버에 요청을 보내게 되면, Service에서는 해당 id를 가진 Meeting 정보를 반환한다. 반환된 정보를 이용하여 모임의 상세 정보를 구성하여 페이지를 반환한다.

3.8. Delete Meeting

    해당 모임을 삭제하고자 하는 경우의 Sequence diagram이다. 모임을 삭제하고자 하는 경우, 그룹의 멤버만이 삭제할 수 있다. 그룹의 멤버가 삭제 버튼을 누르면 모임 삭제 요청을 보내게 된다. 해당 요청에 대해 Security Service에서 요청을 낚아채 그룹의 멤버인지 판단하고, 멤버가 맞다면 모임을 삭제한다. 모임을 삭제하면 모임에 속한 모든 데이터가 삭제된다. 만약, 멤버가 아니라면 예외 처리를 통해 사용자에게 알려준다.

3.9. Create Receipt

    영수증을 생성하고자 하는 경우의 Sequence diagram이다. 모임 페이지 내에서 생성 버튼을 누르면 이벤트가 발생한다. 이 페이지는 Sever Side Rendering이 아닌, Client Side Rendering으로 동작한다. 따라서 createForm 요청을 보내면 페이지 구성을 위한 기본 정보를 반환하고, 추가 정보는 비동기 통신으로 호출하여 페이지를 마저 구성한다. 모든 정보를 기입하고 요청을 보내면 사용자가 입력한 정보를 이용하여 영수증을 생성한다. 영수증 생성이 완료되면 생성된 영수증 데이터를 Client에게 반환한다.

3.10. Detail Receipt

    모임 페이지 내에서 상세 정보를 알고 싶은 영수증을 클릭하면 이벤트가 발생한다. 해당 영수증의 id를 매핑하여 서버에 요청을 보내게 되면, Service에서는 해당 id를 가진 Receipt 정보를 반환한다. 반환된 정보를 이용하여 영수증의 상세 정보를 구성하여 페이지를 반환한다.

3.11. Delete Receipt

    해당 영수증을 삭제하고자 하는 경우의 Sequence diagram이다. 영수증을 삭제하고자 하는 경우, 영수증의 payer만이 삭제할 수 있다. 영수증의 payer가 삭제 버튼을 누르면 영수증 삭제 요청을 보내게 된다. 해당 요청에 대해 Security Service에서 요청을 낚아채 영수증의 payer인지 판단하고, payer가 맞다면 영수증을 삭제한다. 영수증을 삭제하면 영수증에 속한 모든 데이터가 삭제된다. 만약, payer가 아니라면 예외 처리를 통해 사용자에게 알려준다.

3.12. Settlement

    최종 정산과 관련한 Sequence Diagram이다. 그룹 내 모든 모임이 끝난다고 판단하면 그룹의 리더가 정산하기 버튼을 누를 때 시작한다. 정산하기 버튼을 누르면 정산 요청을 보내게 된다. 해당 요청에 대해 Security Service에서 요청을 낚아채 그룹의 리더인지 판단하고, 리더가 맞다면 정산을 진행한다.
    정산을 진행하기 위해 그룹 내 모든 영수증을 조회하고, 각 영수증에 대해 payer가 지불한 금액을 조회한다. 이 정보를 이용하여 각 영수증에 대해 지불해야 할 금액을 계산한다. 계산된 정보를 이용하여 정산 내역을 생성하고, 각 유저에게 매핑하여 데이터를 등록한다.

[ 4. State machine diagram ]

stateMachineDiagram

    Client가 TripTip 서비스 이용시 발생하는 시스템 흐름도이다. 해당 서비스를 이용하기 위해서는 반드시 Login 과정을 거쳐야 한다. 만약, 아직 TripTip 서비스에 계정이 없다면 회원가입을 통해 계정을 등록해야 한다.
    인증에 성공하면 사용자는 가장 최근에 가입한 그룹 리스트 3개를 확인할 수 있다. 모든 리스트를 확인하고 싶다면 활동내역을 클릭하여 그룹 리스트 페이지로 이동한다. 소속 그룹이 없으면 아무 그룹도 나타나지 않는다. 그럴 때는 기존에 생성된 그룹의 코드를 입력하여 참가하거나, 새로운 그룹을 생성해야 한다. 그룹 생성 페이지에서는 그룹의 이름과 초대할 사용자를 검색하여 추가한 후 생성하기 버튼을 누르면 그룹이 생성된다.
    그룹 내에서는 날짜 별로 모임을 생성할 수 있고, 만약 오늘 날짜의 모임이 이미 만들어져 있다면 중복 생성은 불가능하다. 개별 모임 안에서는 그 날에 발생한 지출 내역에 대한 영수증을 등록할 수 있다.
    그룹 내 모든 모임의 활동이 끝났다고 판단하면, 리더 권한(그룹을 생성한 유저)을 가진 사용자가 정산하기 버튼을 누르면 각 멤버에게 "누가" "누구에게" "얼마"를 보내야 하는지 계산하여 알려준다. 정산 내역에 대해 각 멤버에게 공지되어 notify page에서 확인할 수 있다. (시간 부족으로 인해 기능을 구현하지는 못했다.)     그룹 삭제, 모임 삭제, 영수증 삭제는 각각 리더 권한, 멤버 권한, payer 권한이 있어야 가능하다. 리더 권한은 그룹 생성자에게 부여되며, Request 요청자가 그룹 테이블의 리더 필드에 매칭된 유저 아이디와 같다면 리더 권한을 가진다. 멤버 권한은 그룹에 속한 유저 중 리더 권한을 가진 유저를 포함한 모든 유저가 가진다. payer 권한은 모임에 속한 유저 중 지출 내역을 등록한 유저가 가진다.

[ 5. Implementation requirements ]

5.1. 개발환경

  • IntelliJ IDEA 2023.1.2
  • Spring Boot 3.0.5
  • Oracle OpenJDK version 17
  • MySQL Workbench

5.2. Build Tool

  • Gradle

[ 6. Glossary ]

terms description
API 응용 프로그램 간에 상호 작용하고 통신할 수 있도록 하는 규칙과 프로토콜의 모음
MVC Pattern 소프트웨어 아키텍처 설계 패턴으로, 애플리케이션의 로직을 모델, 뷰, 컨트롤러라는 세 가지 상호 연결된 구성 요소로 분리

[ 7. References ]

About

[Software Design Web Service] 모임 정산 서비스 TripTip

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published