Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
alsdl0629 committed Mar 1, 2024
2 parents f207d2e + ecbd5ae commit bbc2f0f
Show file tree
Hide file tree
Showing 251 changed files with 4,284 additions and 649 deletions.
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
@@ -1 +1 @@
* @softpeanut @jeongyoon05 @rlaisqls @tedsoftj1123 @alsdl0629
* @softpeanut @jeongyoon05 @rlaisqls @tedsoftj1123 @alsdl0629 @ilyoil2
4 changes: 2 additions & 2 deletions .github/workflows/dev-cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ jobs:
host: ${{ secrets.EC2_DEV_HOST }}
port: ${{ secrets.EC2_DEV_PORT }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_KEY }}
key: ${{ secrets.EC2_DEV_KEY }}
script: |
cd dms-dev
aws ecr get-login-password --region ${{ secrets.AWS_REGION }} | docker login --username AWS --password-stdin ${{ secrets.DOCKER_DEV_IMAGE }}
Expand All @@ -64,4 +64,4 @@ jobs:
if [[ $is_healthy -ne "healthy" ]]; then
echo $is_healthy
exit 1
fi
fi
47 changes: 47 additions & 0 deletions .github/workflows/xquare-cd-dev.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: DMS - xquare deployment dev

on:
push:
branches:
- main
- develop

jobs:
CD:
permissions:
id-token: write
contents: read
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2

- name: Set up JDK 17
uses: actions/setup-java@v2
with:
java-version: '17'
distribution: 'adopt'

- name: Build Gradle
uses: gradle/gradle-build-action@v2
with:
arguments: |
build
--build-cache
--no-daemon
- name: Deploy to xquare
uses: team-xquare/xquare-deployment-action@master
with:
environment: stag
access_key: ${{ secrets.ACCESS_KEY }}
github_token: ${{ secrets.PAT }}
buildargs: |
PROFILE=dev
MYSQL_HOST=${{ secrets.MYSQL_HOST }}
MYSQL_USERNAME=${{ secrets.MYSQL_USERNAME }}
MYSQL_PASSWORD=${{ secrets.MYSQL_PASSWORD }}
REDIS_HOST=${{ secrets.REDIS_HOST }}
SENTRY_DSN=${{ secrets.SENTRY_DSN }}
AWS_ACCESS=${{ secrets.AWS_ACCESS }}
AWS_SECRET=${{ secrets.AWS_SECRET }}
NEIS_KEY=${{ secrets.NEIS_KEY }}
46 changes: 46 additions & 0 deletions .github/workflows/xquare-cd-prod.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: DMS - xquare deployment prod

on:
push:
tags:
- v*.*.*

jobs:
CD:
permissions:
id-token: write
contents: read
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2

- name: Set up JDK 17
uses: actions/setup-java@v2
with:
java-version: '17'
distribution: 'adopt'

- name: Build Gradle
uses: gradle/gradle-build-action@v2
with:
arguments: |
build
--build-cache
--no-daemon
- name: Deploy to xquare
uses: team-xquare/xquare-deployment-action@master
with:
environment: prod
access_key: ${{ secrets.ACCESS_KEY }}
github_token: ${{ secrets.PAT }}
buildargs: |
PROFILE=prod
MYSQL_HOST=${{ secrets.MYSQL_HOST }}
MYSQL_USERNAME=${{ secrets.MYSQL_USERNAME }}
MYSQL_PASSWORD=${{ secrets.MYSQL_PASSWORD }}
REDIS_HOST=${{ secrets.REDIS_HOST }}
SENTRY_DSN=${{ secrets.SENTRY_DSN }}
AWS_ACCESS=${{ secrets.AWS_ACCESS }}
AWS_SECRET=${{ secrets.AWS_SECRET }}
NEIS_KEY=${{ secrets.NEIS_KEY }}
7 changes: 7 additions & 0 deletions .xquare/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
config:
name: dms
service_type: be
port: 8080
domain:
prod: dms.xquare.app
stag: dev-dms.xquare.app
29 changes: 28 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,32 @@ ENV TZ=Asia/Seoul

HEALTHCHECK --interval=5s --timeout=3s --retries=4 CMD curl -f http://localhost:8080 || exit 1

ARG PROFILE
ENV PROFILE ${PROFILE}

ARG MYSQL_HOST
ENV MYSQL_HOST ${MYSQL_HOST}

ARG MYSQL_USERNAME
ENV MYSQL_USERNAME ${MYSQL_USERNAME}

ARG MYSQL_PASSWORD
ENV MYSQL_PASSWORD ${MYSQL_PASSWORD}

ARG REDIS_HOST
ENV REDIS_HOST ${REDIS_HOST}

ARG SENTRY_DSN
ENV SENTRY_DSN ${SENTRY_DSN}

ARG AWS_ACCESS
ENV AWS_ACCESS ${AWS_ACCESS}

ARG AWS_SECRET
ENV AWS_SECRET ${AWS_SECRET}

ARG NEIS_KEY
ENV NEIS_KEY ${NEIS_KEY}

COPY ./dms-infrastructure/build/libs/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
ENTRYPOINT ["java","-jar","/app.jar"]
121 changes: 120 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,120 @@
# DMS-Backend
# DMS

- DMS는 효율적인 기숙사 관리를 위한 기숙사 관리 시스템입니다.
- 사감선생님께선 웹으로 학생 정보를 편하게 조회, 관리하고 자습실이나 신청 데이터, 상/벌점 내역을 모아서 볼 수 있습니다.
- 학생은 사감선생님께 직접 찾아갈 필요 없이 앱으로 자습실, 잔류 등을 신청하고 필요한 정보를 확인할 수 있습니다.

## Backend

- 효율적인 유지보수와 기능 확장을 위해 DB Table과 아키텍처를 계획적으로 설계합니다.
- 불필요한 중복 데이터, 중복 코드 없는 깔끔한 구조를 지향합니다.
- 로직과 각 도메인의 역할이 명확히 구분되도록 합니다.

- 개발 효율을 위해 가독성에 항상 신경씁니다.
- 적합한 변수, 메서드, 클래스 명을 작명할 수 있도록 합니다.
- detekt를 사용해 일관적인 스타일의 코드를 작성합니다.

- 프로젝트 구조나 설계 과정을 [Notion 문서](https://teamaliens.notion.site/Backend-a22b46ceb5334b80a40af21b3506c1db)에 기록합니다.

- 서버 인프라는 [Terraform](https://github.com/team-aliens/dms-infrastructure)을 사용해 구성합니다.

## ERD

![image](https://github.com/team-aliens/DMS-Backend/assets/81006587/8ba0806b-69b3-43c2-ae3f-706263312298)

## archtecture

### 지향하는 방향

- **DDD**
- 도메인의 역할, 책임 분리
- 각 객체가 서로간에 과하게 의존하지 않도록 하여 유지보수성 높임
- **Facade pattern**
- usecase 코드(facade)의 DB 쿼리 호출에 대한 의존 분리
- (각 service method는 하나의 의미를 가지는 단위로 구성)
- **Hexagonal Architecture**
- 비즈니스 로직과 기술에 대한 상세 구현 분리
- `core` - 핵심 로직 및 도메인 모델에 대한 코드
- `presentation` - 웹 통신에 대한 관리 및 설정
- `persistence` - DB 통신에 대한 관리 및 설정
- `infrastructure` - 전체에 적용되는 필터, 설정이나 기타 third party 라이브러리에 대한 구현

### 처리 flow

(의존 방향이 아니라 진행 방향임)

```mermaid
flowchart TD
WA[webAdapter] --> UC[usecase];
UC -->|getService| P(command / query port);
UC -->|commandService| P;
UC -->|checkService| P;
P --> PA(adapter);
```

---

### presentation module

**1. webAdapter**
> 웹에서 요청을 받아, request body나 parameter 내용을 검증하는 역할
- 외부 요청은 **webRequest 객체**로 전달된다.
- webAdapter는 usecase에게 **request 객체 또는 value**를 전달한다.

(request는 해당 객체로 domain이나 entity를 생성하야하거나, 별도 로직이 필요한 경우 정의함)

- usecase의 반환값을 **그대로 반환**한다.

---

### core module

**2. usecase (facade)**

> 각 usecase에 대한 **facade**를 나타내는 역할
- service 메서드를 호출하여 facade를 구성함 (port에 직접 의존하지 않음)
- 전체적인 흐름만 나타내고, 도메인이나 query 호출에 대한 자세한 구현은 X → service에 메서드로 분리
- usecase에 특화된 로직을 직접 구현할 수도 있음

- usecase는 service에게 **domain model** **또는 value** 을 전달한다.
- usecase는 webAdapter에게 **response 객체**를 반환한다. (field가 nullable인 별도 domain model로 리팩토링 예정?)

**3. service**

> query나 port 호출을 domain과 관련된 **추상적 의미 단위로** 묶어주는 역할
- ex. A 조회시 해당 객체가 같은 학교의 객체인지 항상 검증해야한다.
→ usecase에서 queryPort를 호출하고 매번 schoolId 비교를 해주지 않고, 해당 동작은 service에 메서드로 구현한다.
그리고 usecase에서 A를 조회해야하는 경우 service에 정의되어있는 메서드를 사용한다.

service 종류 (깔끔한 분류를 위해 나눔)

- **CheckService**
- 검증 메서드
- 주로 exist 확인 등등..

- **GetService**
- 조회 메서드
- 비슷한 쿼리가 필요한 경우 파라미터 nullable로 놓고 전달 (persistence쪽에서 동적쿼리 구현)
- 필요한 경우 안에 체크 로직이 같이 들어갈 수 있음

- **CommandService**
- 저장 혹은 삭제 메서드
- 필요한 경우 안에 조회, 체크 로직이 같이 들어갈 수 있음

- delegate 패턴을 활용하여, 각 service 클래스 정의를 분리했다. [ 참고 : [Service 구조](https://www.notion.so/Service-9351a9ed1add4bc9a334e4d34c52984a?pvs=21) ]

**4. port**

- persistence나 infrastructure 계층과 소통하기 위한 interface (spi)

---

### persistence / infrastructure module

**5. Adapter**

- persistenceAdapter **:** JPA, QueryDSL을 통한 쿼리 구현
- 또는 기타 기술이나 라이브러리에 의존하는 세부 구현 내용
23 changes: 17 additions & 6 deletions buildSrc/src/main/kotlin/Dependencies.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ object Dependencies {
const val JACKSON_TYPE = "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:${DependencyVersions.JACKSON_VERSION}"

// java servlet
const val JAVA_SERVLET = "javax.servlet:javax.servlet-api:${DependencyVersions.SERVLET_VERSION}"
const val JAVA_SERVLET = "jakarta.servlet:jakarta.servlet-api:${DependencyVersions.SERVLET_VERSION}"

// web
const val SPRING_WEB = "org.springframework.boot:spring-boot-starter-web"
Expand All @@ -19,7 +19,7 @@ object Dependencies {
const val SPRING_THYMELEAF = "org.springframework.boot:spring-boot-starter-thymeleaf"

// transaction
const val SPRING_TRANSACTION = "org.springframework:spring-tx:${DependencyVersions.SPRING_TRANSACTION}"
const val SPRING_TRANSACTION = "org.springframework:spring-tx:${DependencyVersions.SPRING_TRANSACTION_VERSION}"

// configuration
const val CONFIGURATION_PROCESSOR = "org.springframework.boot:spring-boot-configuration-processor"
Expand All @@ -31,17 +31,21 @@ object Dependencies {
const val REDIS = "org.springframework.data:spring-data-redis:${DependencyVersions.REDIS_VERSION}"

// querydsl
const val QUERYDSL = "com.querydsl:querydsl-jpa:${DependencyVersions.QUERYDSL}"
const val QUERYDSL_PROCESSOR = "com.querydsl:querydsl-apt:${DependencyVersions.QUERYDSL}:jpa"
const val QUERYDSL = "com.querydsl:querydsl-jpa:${DependencyVersions.QUERYDSL_VERSION}:jakarta"
const val QUERYDSL_PROCESSOR = "com.querydsl:querydsl-apt:${DependencyVersions.QUERYDSL_VERSION}:jakarta"
const val JAKARTA_ANNOTATION_PROCESSOR = "jakarta.annotation:jakarta.annotation-api:${DependencyVersions.JAKARTA_ANNOTATION_VERSION}"
const val JAKARTA_PERSISTENCE_PROCESSOR = "jakarta.persistence:jakarta.persistence-api:${DependencyVersions.JAKARTA_PERSISTENCE_VERSION}"

// security
const val SPRING_SECURITY = "org.springframework.boot:spring-boot-starter-security"

// jwt
const val JWT = "io.jsonwebtoken:jjwt:${DependencyVersions.JWT_VERSION}"
const val JWT = "io.jsonwebtoken:jjwt-api:${DependencyVersions.JWT_VERSION}"
const val JWT_IMPL = "io.jsonwebtoken:jjwt-impl:${DependencyVersions.JWT_VERSION}"
const val JWT_JACKSON = "io.jsonwebtoken:jjwt-jackson:${DependencyVersions.JWT_VERSION}"

// aws
const val SPRING_AWS = "org.springframework.cloud:spring-cloud-starter-aws:${DependencyVersions.AWS_VERSION}"
const val SPRING_AWS = "io.awspring.cloud:spring-cloud-starter-aws:${DependencyVersions.AWS_VERSION}"
const val AWS_SES = "com.amazonaws:aws-java-sdk-ses:${DependencyVersions.SES_VERSION}"

// test
Expand Down Expand Up @@ -69,4 +73,11 @@ object Dependencies {

// sentry
const val SENTRY = "io.sentry:sentry-spring-boot-starter:${DependencyVersions.SENTRY_VERSION}"

// notification
const val FCM = "com.google.firebase:firebase-admin:${DependencyVersions.FCM_VERSION}"

// flyway
const val FLYWAY = "org.flywaydb:flyway-mysql:${DependencyVersions.FLYWAY_VERSION}"

}
16 changes: 10 additions & 6 deletions buildSrc/src/main/kotlin/DependencyVersions.kt
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
object DependencyVersions {
const val JACKSON_VERSION = "2.10.3"
const val JWT_VERSION = "0.9.1"
const val AWS_VERSION = "2.2.6.RELEASE"
const val JACKSON_VERSION = "2.16.1"
const val JWT_VERSION = "0.11.5"
const val AWS_VERSION = "2.4.4"
const val SES_VERSION = "1.11.852"
const val REDIS_VERSION = "2.7.2"
const val SERVLET_VERSION = "4.0.1"
const val SERVLET_VERSION = "6.0.0"
const val UUID_TIME_VERSION = "3.1.4"
const val SPRING_TRANSACTION = "5.3.22"
const val QUERYDSL = "5.0.0"
const val SPRING_TRANSACTION_VERSION = "6.1.2"
const val QUERYDSL_VERSION = "5.0.0"
const val JAKARTA_ANNOTATION_VERSION = "2.1.1"
const val JAKARTA_PERSISTENCE_VERSION = "3.1.0"
const val MYSQL = "8.0.28"
const val APACHE_POI_VERSION = "3.7"
const val MOCKK_VERSION = "1.13.2"
const val OPEN_FEIGN_VERSION = "3.1.4"
const val SENTRY_VERSION = "6.2.1"
const val ASPECTJ_VERSION = "1.9.7"
const val FCM_VERSION = "8.1.0"
const val FLYWAY_VERSION = "10.8.1"
}
16 changes: 8 additions & 8 deletions buildSrc/src/main/kotlin/PluginVersions.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
object PluginVersions {
const val SPRING_BOOT_VERSION = "2.7.1"
const val DEPENDENCY_MANAGER_VERSION = "1.0.11.RELEASE"
const val JVM_VERSION = "1.6.21"
const val SPRING_PLUGIN_VERSION = "1.6.21"
const val JPA_PLUGIN_VERSION = "1.6.21"
const val KAPT_VERSION = "1.7.10"
const val ALLOPEN_VERSION = "1.6.21"
const val SPRING_BOOT_VERSION = "3.2.2"
const val DEPENDENCY_MANAGER_VERSION = "1.1.4"
const val JVM_VERSION = "1.9.21"
const val SPRING_PLUGIN_VERSION = "1.9.21"
const val JPA_PLUGIN_VERSION = "1.9.21"
const val KAPT_VERSION = "1.8.21"
const val ALLOPEN_VERSION = "1.9.21"
const val MOCKK_VERSION = "1.13.2"
const val DETEKT_VERSION = "1.21.0"
const val DETEKT_VERSION = "1.23.4"
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,4 @@ interface ErrorProperty {
}
}
}
}
}
Loading

0 comments on commit bbc2f0f

Please sign in to comment.