{"id":19042330,"url":"https://github.com/team-aliens/dms-backend","last_synced_at":"2025-03-22T00:26:49.631Z","repository":{"id":264612499,"uuid":"530278213","full_name":"team-aliens/DMS-Backend","owner":"team-aliens","description":"This is Dormitory Management System Backend Repository","archived":false,"fork":false,"pushed_at":"2025-03-18T01:26:41.000Z","size":5701,"stargazers_count":48,"open_issues_count":20,"forks_count":0,"subscribers_count":0,"default_branch":"develop","last_synced_at":"2025-03-18T02:31:40.302Z","etag":null,"topics":["clean-architecture","domain-driven-design","hexagonal-architecture","kotlin","multi-module"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"wine-area/DMS-Backend","license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/team-aliens.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-08-29T15:23:56.000Z","updated_at":"2025-03-17T12:17:53.000Z","dependencies_parsed_at":"2025-03-18T02:29:34.619Z","dependency_job_id":null,"html_url":"https://github.com/team-aliens/DMS-Backend","commit_stats":null,"previous_names":["team-aliens/dms-backend"],"tags_count":37,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/team-aliens%2FDMS-Backend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/team-aliens%2FDMS-Backend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/team-aliens%2FDMS-Backend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/team-aliens%2FDMS-Backend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/team-aliens","download_url":"https://codeload.github.com/team-aliens/DMS-Backend/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244889190,"owners_count":20526956,"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":["clean-architecture","domain-driven-design","hexagonal-architecture","kotlin","multi-module"],"created_at":"2024-11-08T22:36:30.908Z","updated_at":"2025-03-22T00:26:49.622Z","avatar_url":"https://github.com/team-aliens.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DMS\n\n- DMS는 효율적인 기숙사 관리를 위한 기숙사 관리 시스템입니다.\n    - 사감선생님께선 웹으로 학생 정보를 편하게 조회, 관리하고 자습실이나 신청 데이터, 상/벌점 내역을 모아서 볼 수 있습니다. \n    - 학생은 사감선생님께 직접 찾아갈 필요 없이 앱으로 자습실, 잔류 등을 신청하고 필요한 정보를 확인할 수 있습니다.\n\n## Backend\n \n- 효율적인 유지보수와 기능 확장을 위해 DB Table과 아키텍처를 계획적으로 설계합니다.\n    - 불필요한 중복 데이터, 중복 코드 없는 깔끔한 구조를 지향합니다.\n    - 로직과 각 도메인의 역할이 명확히 구분되도록 합니다.\n\n- 개발 효율을 위해 가독성에 항상 신경씁니다.\n    - 적합한 변수, 메서드, 클래스 명을 작명할 수 있도록 합니다. \n    - detekt를 사용해 일관적인 스타일의 코드를 작성합니다.\n \n- 프로젝트 구조나 설계 과정을 [Notion 문서](https://teamaliens.notion.site/Backend-a22b46ceb5334b80a40af21b3506c1db)에 기록합니다.\n\n- 서버 인프라는 [Terraform](https://github.com/team-aliens/dms-infrastructure)을 사용해 구성합니다.\n\n## ERD\n\n![image](https://github.com/team-aliens/DMS-Backend/assets/81006587/8ba0806b-69b3-43c2-ae3f-706263312298)\n\n## archtecture\n\n### 지향하는 방향\n\n- **DDD**\n    - 도메인의 역할, 책임 분리\n    - 각 객체가 서로간에 과하게 의존하지 않도록 하여 유지보수성 높임\n- **Facade pattern**\n    - usecase 코드(facade)의 DB 쿼리 호출에 대한 의존 분리\n    - (각 service method는 하나의 의미를 가지는 단위로 구성)\n- **Hexagonal Architecture**\n    - 비즈니스 로직과 기술에 대한 상세 구현 분리\n    - `core` - 핵심 로직 및 도메인 모델에 대한 코드\n    - `presentation` - 웹 통신에 대한 관리 및 설정\n    - `persistence` - DB 통신에 대한 관리 및 설정\n    - `infrastructure` - 전체에 적용되는 필터, 설정이나 기타 third party 라이브러리에 대한 구현\n\n### 처리 flow\n\n(의존 방향이 아니라 진행 방향임)\n\n```mermaid\nflowchart TD\nWA[webAdapter] --\u003e UC[usecase];\nUC --\u003e|getService| P(command / query port);\nUC --\u003e|commandService| P;\nUC --\u003e|checkService| P;\nP --\u003e PA(adapter);\n```\n\n---\n\n### presentation module\n\n**1. webAdapter** \n\u003e 웹에서 요청을 받아, request body나 parameter 내용을 검증하는 역할\n\n- 외부 요청은 **webRequest 객체**로 전달된다.\n- webAdapter는 usecase에게 **request 객체 또는 value**를 전달한다.\n    \n    (request는 해당 객체로 domain이나 entity를 생성하야하거나, 별도 로직이 필요한 경우 정의함)\n    \n- usecase의 반환값을 **그대로 반환**한다.\n\n---\n\n### core module\n\n**2. usecase (facade)**\n\n\u003e 각 usecase에 대한 **facade**를 나타내는 역할\n\n- service 메서드를 호출하여 facade를 구성함 (port에 직접 의존하지 않음)\n    - 전체적인 흐름만 나타내고, 도메인이나 query 호출에 대한 자세한 구현은 X → service에 메서드로 분리\n- usecase에 특화된 로직을 직접 구현할 수도 있음\n\n- usecase는 service에게 **domain model** **또는 value** 을 전달한다.\n- usecase는 webAdapter에게 **response 객체**를 반환한다. (field가 nullable인 별도 domain model로 리팩토링 예정?)\n\n**3. service**\n\n\u003e query나 port 호출을 domain과 관련된 **추상적 의미 단위로** 묶어주는 역할\n\n- ex. A 조회시 해당 객체가 같은 학교의 객체인지 항상 검증해야한다.\n    →  usecase에서 queryPort를 호출하고 매번 schoolId 비교를 해주지 않고, 해당 동작은 service에 메서드로 구현한다.\n         그리고 usecase에서 A를 조회해야하는 경우 service에 정의되어있는 메서드를 사용한다.\n\nservice 종류 (깔끔한 분류를 위해 나눔)\n\n- **CheckService**\n    - 검증 메서드 \n    - 주로 exist 확인 등등..\n    \n- **GetService**\n    - 조회 메서드\n    - 비슷한 쿼리가 필요한 경우 파라미터 nullable로 놓고 전달 (persistence쪽에서 동적쿼리 구현)\n    - 필요한 경우 안에 체크 로직이 같이 들어갈 수 있음\n    \n- **CommandService**\n    - 저장 혹은 삭제 메서드\n    - 필요한 경우 안에 조회, 체크 로직이 같이 들어갈 수 있음\n\n- delegate 패턴을 활용하여, 각 service 클래스 정의를 분리했다. [ 참고 : [Service 구조](https://www.notion.so/Service-9351a9ed1add4bc9a334e4d34c52984a?pvs=21) ]\n\n**4. port**\n\n- persistence나 infrastructure 계층과 소통하기 위한 interface (spi)\n\n---\n\n### persistence / infrastructure module\n\n**5. Adapter**\n\n- persistenceAdapter **:** JPA, QueryDSL을 통한 쿼리 구현\n- 또는 기타 기술이나 라이브러리에 의존하는 세부 구현 내용\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fteam-aliens%2Fdms-backend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fteam-aliens%2Fdms-backend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fteam-aliens%2Fdms-backend/lists"}