{"id":17362834,"url":"https://github.com/mjbae/reserve-management-system","last_synced_at":"2025-03-27T17:30:11.547Z","repository":{"id":210141865,"uuid":"691799343","full_name":"MJbae/reserve-management-system","owner":"MJbae","description":"적립금 관리 시스템","archived":false,"fork":false,"pushed_at":"2023-12-18T12:08:15.000Z","size":185,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-01T20:45:18.007Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MJbae.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-09-14T23:19:18.000Z","updated_at":"2024-09-15T01:18:52.000Z","dependencies_parsed_at":"2023-12-18T13:27:48.923Z","dependency_job_id":null,"html_url":"https://github.com/MJbae/reserve-management-system","commit_stats":null,"previous_names":["mjbae/reserve-management-system"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MJbae%2Freserve-management-system","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MJbae%2Freserve-management-system/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MJbae%2Freserve-management-system/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MJbae%2Freserve-management-system/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MJbae","download_url":"https://codeload.github.com/MJbae/reserve-management-system/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245892323,"owners_count":20689485,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-15T19:43:31.499Z","updated_at":"2025-03-27T17:30:11.526Z","avatar_url":"https://github.com/MJbae.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 적립금 관리 시스템\n\n### Table of Contents\n[I. 실행 환경 구축 방법](#i-실행-환경-구축-방법)\n\n[II. HTTP API 요청 방법](#ii-http-api-요청-방법)\n\n[III. 프로젝트 구조](#iii-프로젝트-구조)\n\n[IV. TDD 기반 구현 절차](#iv-tdd-기반-구현-절차)\n\n[V. 테스트 구조](#v-테스트-구조)\n\n[VI. 기능별 순서도](#vi-기능별-순서도)\n\n\n### I. 실행 환경 구축 방법\n프로젝트 루트에서 아래 명령을 실행해주세요.\n```shell\nchmod +x build_and_run.sh \u0026\u0026 ./build_and_run.sh\n```\n- 위 스크립트는 로컬 머신 프로세서에 따라 docker-compose 파일을 선택하여 실행 환경을 구축합니다.\n- docker 기반 실행환경의 **서버 포트**는 `8080`입니다. 다만 IDE로 서버를 직접 실행하신다면 `55123`입니다. \n- **DB 포트**는 `3311`입니다. **ID**와 **PW**는 각각 `root`, `password`입니다.\n\n### II. HTTP API 요청 방법\n- docker 기반 실행환경의 **host**는 `http://localhost:8080`입니다. 다만 IDE로 서버를 직접 실행하신다면 host는 `http://localhost:55123`입니다.\n- HTTP API 요청의 공통 path param인 **memberId**는 `128c4d0f68a34e1ca3c8b51cc01a4b71`를 사용하실 수 있습니다.\n   ```\n   ### 회원별 적립금 합계 조회 API\n   GET {{host}}/api/members/{{memberId}}/points/total\n   \n   ### 회원별 적립금 적립/사용 내역 조회 API\n   GET {{host}}/api/members/{{memberId}}/points\n   \n   ### 회원별 적립금 적립 API\n   POST {{host}}/api/members/{{memberId}}/points\n   Content-Type: application/json\n   \n   {\n       \"points\": 20\n   }\n   \n   ### 회원별 적립금 사용 API\n   PUT {{host}}/api/members/{{memberId}}/points/use\n   Content-Type: application/json\n   \n   {\n       \"points\": 10\n   }\n   \n   \n   ### 회원별 적립금 사용취소 API\n   PUT {{host}}/api/members/{{memberId}}/points/cancel\n   ```\n\n\n### III. 프로젝트 구조\n본 프로젝트는 4개의 주요 패키지로 구성되어 있습니다.\n- **domain**: 핵심 비지니스 로직과 상태를 모델링합니다.\n- **usecase**: 도메인 모델을 조합하여 비지니스적으로 의미있는 단위의 기능을 구현합니다.\n- **infra**: 도메인과 결합할 필요가 없는 내부 시스템의 기능을 구현합니다.\n- **controller**: 외부 시스템과의 통신을 위한 인터페이스를 정의합니다.\n\n\n### IV. TDD 기반 구현 절차\n1. 기능을 직관적으로 이해하기 위해 아래와 같이 **기능별 순서도**를 작성합니다.\n2. 순서도의 Happy Path를 간략하게 구현합니다.\n3. 순서도의 주요 분기에 대해 실패하는 테스트를 작성합니다.\n4. 실패하는 테스트를 통과하도록 코드를 수정합니다.\n5. 3단계, 4단계 반복하며 기능의 완성도를 높입니다.\n\n\n### V. 테스트 구조\n고전파 스타일로 테스트를 구성했습니다. 테스트에 대한 철학은 ['단위 테스트 by 블라디미르 코리코프'](https://studynote.oopy.io/books/15)의 영향을 받았습니다.\n- e2e 테스트: IntelliJ IDE에서 지원하는 .http을 활용하여 5개의 API를 실제 호출하고 정상 동작여부를 검증합니다.\n- 통합 테스트: Kotest 기반으로 5개 API의 13개 핵심 동작에 대해 검증합니다.\n- 단위 테스트: 핵심 도메인 모델인 PointAccount의 주요 비지니스 로직을 검증합니다.\n\n\n### VI. 기능별 순서도\n1. 회원별 적립금 합계 조회\n\n    ```mermaid\n    graph TB\n    시작(시작) --\u003e 회원존재여부[회원 존재 ?]\n    회원존재여부 --\u003e|예| 적립금보기[적립금 합계 응답]\n    회원존재여부 --\u003e|아니오| 회원미존재예외[회원 미존재 응답]\n    ```\n\n2. 회원별 적립금 적립\n\n    ```mermaid\n    graph TB\n    시작(시작) --\u003e 회원존재여부[회원 존재 ?]\n    회원존재여부 --\u003e|예| 적립금확인[적립 대상 금액 유효 ?]\n    회원존재여부 --\u003e|아니오| 회원미존재예외[회원 미존재 응답]\n    적립금확인 --\u003e|예| 적립금추가[적립금 추가]\n    적립금확인 --\u003e|아니오| 유효하지않은금액[대상 금액 무효 응답]\n    적립금추가 --\u003e 성공메세지[적립 성공 응답]\n    ```\n\n3. 회원별 적립금 적립/사용 내역 조회\n\n    ```mermaid\n    graph TB\n    시작(시작) --\u003e 회원존재여부[회원 존재 ?]\n    회원존재여부 --\u003e|예| 거래내역확인[회원 적립금 내역 존재 ?]\n    회원존재여부 --\u003e|아니오| 회원미존재예외[회원 미존재 응답]\n    거래내역확인 --\u003e|예| 거래목록보기[적립/사용 내역 응답]\n    거래내역확인 --\u003e|아니오| 거래내역없음[빈 내역 응답]\n    ```\n\n4. 회원별 적립금 사용\n\n    ```mermaid\n    graph TB\n    시작(시작) --\u003e 회원존재여부[회원 존재 ?]\n    회원존재여부 --\u003e|예| 적립금충분확인[적립금 사용 가능 ?]\n    회원존재여부 --\u003e|아니오| 회원미존재예외[회원 미존재 응답]\n    적립금충분확인 --\u003e|예| 적립금사용[적립금 사용]\n    적립금충분확인 --\u003e|아니오| 적립금부족[적립금 부족 응답]\n    적립금사용 --\u003e 적립금차감응답[적립금 사용 성공 응답]\n    ```\n\n5. 회원별 적립금 사용취소\n\n    ```mermaid\n    graph TB\n    시작(시작) --\u003e 회원존재여부[회원 존재 ?]\n    회원존재여부 --\u003e|예| 거래존재확인[거래 존재 ?]\n    회원존재여부 --\u003e|아니오| 회원미존재예외[회원 미존재 응답]\n    거래존재확인 --\u003e|예| 거래취소가능여부[적립금 사용취소 가능 ?]\n    거래존재확인 --\u003e|아니오| 거래존재안함[거래 미존재 응답]\n    거래취소가능여부 --\u003e|예| 거래취소가능[사용 취소]\n    거래취소가능여부 --\u003e|아니오| 거래취소불가[취소 불가 응답]\n    거래취소가능 --\u003e 거래취소성공응답[취소 성공 응답]\n    ```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmjbae%2Freserve-management-system","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmjbae%2Freserve-management-system","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmjbae%2Freserve-management-system/lists"}