๐จโ๐ฉโ๐ฆโ๐ฆ Babpool Backend Server ๐จโ๐ฉโ๐ฆโ๐ฆ
์ด์ฉ์ค์ธ ํ์ด์ง ๋งํฌ ๐ https://bab-pool.com
๐๏ธ Index
- ๊ฐ์
- BE ๊ธฐ์ ์คํ
- BE ์ฑ๋ฆฐ์ง & ํด๊ฒฐ
- ER ๋ค์ด์ด๊ทธ๋จ
- ์๋ฒ ์ํคํ
์ฒ
- ์์ ๊ฐ์ด๋
- CI/CD ํ์ดํ๋ผ์ธ
- ๊ธฐํ ๋ฌธ์
- ํ๋ก์ ํธ ๊ตฌ์กฐ
- BE ๊ธฐ์ฌ๋
- ์๊ฐ
๐ Outline
์๊ฐ
- ๋ฐฅํ ํ๋ก์ ํธ๋ ๋ฐฅ ์ฝ์ ์ ์ฒญ์ ํตํด ๊ด์ฌ์ฌ์ ๋ชฉํ๋ฅผ ๊ณต์ ํ๋ ์ฌ๋๋ค๊ณผ ์ผ๋์ผ๋ก ๋ํ ํ ์ ์๋ ๊ธฐํ๋ฅผ ๋ง๋ค๊ณ ์ ํ์ต๋๋ค.
- ๊ธด๋ฐํ ๋ํ์ ์ปค๋ฎค๋ํฐ, ์๋ก ๋์์ ์ค ์ ์๋ ์ธ๋งฅ ํ์ ๋ง๋ค๊ธฐ ์ํ ํ๋ซํผ ์
๋๋ค.
- SWYP 3๊ธฐ ํ๋ก์ ํธ๋ก ์ฐธ์ฌํ์ฌ 1์๋ฅผ ์์ ํ์ต ๋๋ค.
์์ฅ ๋ณด๊ธฐ
๊ฐ๋ฐ ๊ธฐ๊ฐ
- MVP : 2024.02 ~ 2024.03
- ๊ฐ์ ๋ฐ ์ ์ง๋ณด์ : 2024.06 ~ 2024.09
๊ฐ๋ฐ ์ธ์
- ๊ธฐํ์ 1๋ช
, ๋์์ด๋ 1๋ช
, BE 2๋ช
, FE 2๋ช
๐ง BE Skill Stack
๊ตฌ๋ถ |
๊ธฐ์ ๋ช
|
์ ์ ์ด์ |
DB |
MySQL |
RDBMS ์ค ์ฐธ๊ณ ํ ์ ์๋ ๋ ํผ๋ฐ์ค๊ฐ ๊ฐ์ฅ ๋ง์ MySQL์ ์ ํํ์ต๋๋ค. |
์์์ฑ ํ๋ ์์ํฌ |
MyBatis |
ORM์ ์ฌ์ฉํ๋๋ผ๋ ๋ณต์กํ ์กฐํ์ฟผ๋ฆฌ๋ ๋ค์ดํฐ๋ธ ์ฟผ๋ฆฌ์ ์ฌ์ฉ์ ํ์ํฉ๋๋ค. ์ด๋ฅผ ์ผ๋ํด ์ฟผ๋ฆฌ ์์ฑ์ ๋ํ ์ญ๋์ ํฅ์ํ๊ธฐ ์ํด SQL Mapper ํ๋ ์์ํฌ์ธ MyBatis๋ฅผ ์ ํํ์ต๋๋ค. |
API ๋ฌธ์ํ |
Swagger |
RestDocs, Swagger์ RestDocs์ ๊ฒฐํฉ, ์์
๋ฌธ์, ํฌ์คํธ๋งจ ๋ฑ ์ฌ๋ฌ API ๋ฌธ์ํ ๋๊ตฌ๋ฅผ ๋ชจ๋ ๊ฒฝํํด๋ณด์์ต๋๋ค. ์ด๋ฅผ ๋ฐํ์ผ๋ก ์งง์ ๊ธฐ๊ฐ์์ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ๊ธฐ ์ํด ๊ฐํธํ๊ณ ์์ฐ์ฑ์ด ๋์ Swagger๋ฅผ ์ ํํ์ต๋๋ค. |
ํด๋ผ์ฐ๋ |
AWS |
ํ๋ฆฌํฐ์ด ์๊ธ์ ๋ฅผ ์ฌ์ฉํ์ฌ ๋น์ฉ ๋ถ๋ด ์์ด ๋ค์ํ ํด๋ผ์ฐ๋ ์๋น์ค๋ฅผ ํ๋ก์ ํธ์ ์ ์ฉํ ์ ์์ผ๋ฉฐ Azure, OCI, GCP ์ ๋น๊ตํ์ ๋ ๋ํผ๋ฐ์ค์ ์ปค๋ฎค๋ํฐ ์ฌ์ด์ฆ๊ฐ ์๋์ ์ผ๋ก ๋ ํฌ๋ค๋ ์ ์์ ์ฑํ. |
์คํ ๋ฆฌ์ง |
AWS S3 |
EC2์ ์ ์ฅ ์, ์ธ์คํด์ค์ ์ฉ๋์ด ๋ถ์กฑํด์ง๊ณ , ํ์ผ ๊ด๋ฆฌ์ ์ด๋ ค์์ด ์์. ํ์ผ ์ ์ฅ์ ์ฉ์ด. |
๊ฐ์ํ๊ฒฝ |
Docker |
์ปจํ
์ด๋์ ํน์ง์ ์ํด ํ๊ฒฝ์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฝ๊ณ ์์ ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค๋ ์ ์์ ์ฌ์ฉ. |
ํ๋ก์ ์๋ฒ |
Nginx |
|
์ค์๊ฐ์๋ฆผ |
Stomp |
์ฌ์ฉ์๊ฐ ์ด๋ํ์ด์ง์ ์กด์ฌํด๋ ์ฝ์ ์์ฒญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ค์๊ฐ ์๋ฆผ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด, ๋ฉ์์ง ๊ธฐ๋ฐ์ ์น์์ผ ๋น๋๊ธฐ ํ๋กํ ์ฝ์ ๊ฐํธํ๊ฒ ์ ๊ณตํ๋ STOMP๋ฅผ ์ฌ์ฉ. |
๐ฅ BE Challenge & Solution
1) ๋ฐฅ ์ฝ์ ๋์ ์์ฒญ ๋ฐ์ ์, Race Condition ์ด ๋ฐ์ํ์ต๋๋ค.
- ํด๊ฒฐ : ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ ์ํฉ์ ์๋์ง๋ง, ๋ฐ๋์ ์ ํฉ์ฑ์ด ์ง์ผ์ ธ์ผ ํ๋ค๋ ์ ์์, MySQL
SELECT ~ FOR UPDATE
๊ตฌ๋ฌธ์ ์ฌ์ฉํด ๋ฒ ํ์ ๋ฝ์ ์ ์ฉํ์ฌ ํด๊ฒฐํ์ต๋๋ค.
2) ๋ฐ์ดํฐ๊ฐ ๋ง์์ง๋ ๊ฒฝ์ฐ, ํ์ด์ง ์ฟผ๋ฆฌ ์ฑ๋ฅ ์ ํ.
๐ ERD
๋ค์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์คํค๋ง์ ํ
์ด๋ธ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ํ๋ธ ERD์
๋๋ค.
- ๊ธฐ์กด, MVP ๊ตฌํ ๊ธฐ๊ฐ์ ์ฌ์ฉ๋ ERD ์ ๋ถํธํจ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ฐ์ ๊ทํ๋ฅผ ์งํํ์์ต๋๋ค.
๋ฐ์ ๊ทํ ์ MVP ๊ธฐ๊ฐ ERD
๋ฐ์ ๊ทํ ํ ์ต์ข
ERD
๐จ Server Architecture
- ์๋ฒ์ ๋ถํ๋ฅผ ๋ถ์ฐ์ํค๊ณ , ์๋ฒ์ ์์ ์ฑ์ ๋์ด๊ธฐ ์ํด ๋ฐฑ์๋์ ํ๋ก ํธ ์๋ฒ๋ฅผ ๋ถ๋ฆฌํ ์๋ฒ ์ํคํ
์ฒ๋ฅผ ๊ตฌ์ฑํ์ต๋๋ค.
- ๋ฐฑ์๋ ์๋ฒ๋ EC2 ์ธ์คํด์ค์ ๋์ปค ํ๊ฒฝ์์์ ์ปจํ
์ด๋๋ก ๋ฐฐํฌํ์์ต๋๋ค.
- RDS๋ฅผ EC2์ ๋์ผํ VPC ๋ด์ ์์ฑํ์ง๋ง, Private Subnet์ ์์ฑํ์ฌ EC2 ์ธ์คํด์ค์์๋ง ์ ๊ทผํ ์ ์๋๋ก ๊ตฌ์ฑํ์ต๋๋ค. ์ด๋ก ์ธํด ๋ณด์์ฑ์ ๋์ด๊ณ , ๊ณต๊ฐ Ipv4 ์ฃผ์์ ์ํ ๋น์ฉ ๋ฐ์์ ์ ๊ฑฐํ์ต๋๋ค.
- ํ๋ก ํธ ์๋ฒ๋ S3์ ์ ์ ํ์ผ์ ํธ์คํ
ํ๊ณ , CloudFront ๋ฅผ ํตํด CDN ์ ์ ์ฉํ์ฌ ์ฌ์ฉ์์๊ฒ ๋น ๋ฅธ ์๋ต์๋๋ฅผ ์ ๊ณตํ๊ณ , S3 ์๋น์ค์ ๋ํ ์์ฒญ ๋น์ฉ์ ์ ๊ฐ ํ์ต๋๋ค.
- ๋ชจ๋ํฐ๋ง ์๋ฒ๋ฅผ ๊ตฌ์ถํ์ฌ, ์๋ฒ์ ์ํ(๋งคํธ๋ฆญ)์ ๋ก๊ทธ๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ธํ๊ณ , ์ฅ์ ๋ฐ์ ์ ๋น ๋ฅด๊ฒ ๋์ํ ์ ์๋๋ก ๊ตฌ์ฑํ์ต๋๋ค.
์์ ๊ฐ์ด๋
ํด๋น ์์ ๊ฐ์ด๋๋, ๋ก์ปฌ ํ๊ฒฝ์์ ํ
์คํธ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์๋ดํฉ๋๋ค.
๐ฆ ์์ธ ๋ด์ฉ ๋๋ณด๊ธฐ
### ์ฌ์ ์ค๋น
- Java JDK 17์ ์ค์นํฉ๋๋ค.
- JAVA_HOME ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค.
- IDE ์ธํ
๋ฆฌ์ ์ด ํด์ ๊ถ์ฅํฉ๋๋ค.
### ํ๋ก์ ํธ ํด๋ก ๋ฐ ๋น๋
1. ์ ์ฅ์ ํด๋ก
```bash
git clone https://github.com/proHyundo/your-repository.git
```
2. IntelliJ ์์ ํ๋ก์ ํธ๋ฅผ ์ด๊ณ Gradle ์์กด์ฑ์ ์๋์ผ๋ก ๋ถ๋ฌ์ต๋๋ค.
## Running the tests
To run the tests, use the following command:
```bash
./gradlew test
```
๐ CI/CD ํ์ดํ๋ผ์ธ
Github Actions์ Docker Compose ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ CI/CD๋ฅผ ์ํํ ์ ์๋๋ก ์ค์ ๋์ด ์์ต๋๋ค.
github-actions-server.yaml
ํ์ผ์ ๋ณ๊ฒฝ์ฌํญ๊ณผ ํจ๊ป main ๋ธ๋์น์ ํธ์๋๋ฉด, Github Actions๊ฐ ๋์ํฉ๋๋ค.
์ค์ ์คํฌ๋ฆฝํธ๋ '.github/workflows/github-actions-server.yaml'(๋งํฌ)์ ์ฐธ์กฐํ์ธ์.
์ฃผ์ ๋จ๊ณ
-
๋น๋
- ์ฒดํฌ์์ ๋ฆฌํฌ์งํ ๋ฆฌ
- Java ํ๊ฒฝ ์ค์
- ํ
์คํธ ๋ฐ ๋์์ ํ์ํ ๊ฐ์ข
ํ์ผ(application.yml, data.sql, schema.sql, log4jdbc.log4j2.properties)์ Github Secretes ํ๊ฒฝ๋ณ์๋ฅผ ์ฌ์ฉํด ์์ฑ ๋ฐ ์
๋ก๋
- Gradle ์ค์ ,
./gradlew clean build -i
์ ํ๋ฆฌ์ผ์ด์
๋น๋
-
Docker ์์
- ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํ์ฌ DockerHub์ ๋ก๊ทธ์ธํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์
์ ๋ํ Docker ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ ํธ์ํฉ๋๋ค.
-
๋ฐฐํฌ ํ์ผ ์์ฑ ๋ฐ ๋ณต์ฌ
- ์ํฌ๋ฆฟ์์ docker-compose.yaml์ ์์ฑํ์ฌ VM์ ๋ณต์ฌํฉ๋๋ค.
- app.conf(NGINX ๊ตฌ์ฑ)๊ฐ ์์ฑ๋์ด VM์ ๋ณต์ฌ๋ฉ๋๋ค.
- promtail-config.yml์ด ์์ฑ๋์ด VM์ ๋ณต์ฌ๋ฉ๋๋ค.
-
VM์ ๋ฐฐํฌ
- VM์ SSH๋ก ์ ์ํฉ๋๋ค.
- ๊ธฐ์กด ์ปจํ
์ด๋์ ์ด๋ฏธ์ง๊ฐ ์๋ ๊ฒฝ์ฐ ์ ๊ฑฐํฉ๋๋ค.
- ์ Docker ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- Docker Compose๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ํฉ๋๋ค.
- ์ฌ์ฉํ์ง ์๋ Docker ์ด๋ฏธ์ง๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
-
CI/CD ๊ฒฐ๊ณผ Slack ์๋ฆผ
- ์ํฌํ๋ก ๊ฒฐ๊ณผ๋ฅผ Slack์ ๋ณด๋
๋๋ค.
๐ Project Structure
๊ณผ๊ฑฐ 3-Tier ๊ตฌ์กฐ๋ก ํจํค์ง๋ฅผ ์ค๊ณํ์์ ๋, ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ์ ์ง๋ณด์์ ์ด๋ ค์ ๊ฒฝํํ์ต๋๋ค.
ํนํ, ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก, ํด๋์ค ๊ฐ์ ์์กด๊ด๊ณ๋ฅผ ํ์
ํ๊ธฐ ์ด๋ ค์ ์ต๋๋ค.
๋ํ, ์๋ก์ด ๊ด์ฌ์ฌ๊ฐ ์๊ธฐ๊ฑฐ๋ ๊ธฐ์กด์ ๊ด์ฌ์ฌ๊ฐ ๋ณ๊ฒฝ๋ ๋ ํจํค์ง ๋ถ๋ฆฌ์ ์ฝ๋ ๋ฆฌํฉํ ๋ง์ด ์ด๋ ค์ ์ต๋๋ค.
๋ฐ๋ผ์ 3-Tier ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ DDD(Domain-Driven Design)์ ์ผ๋ถ๋ฅผ ์ ์ฉํ์ฌ ์๋์ ๊ฐ์ ํจํค์ง ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ์์ต๋๋ค.
ํฌ๊ฒ ๋๋ฉ์ธ, ์ธํ๋ผ ๊ทธ๋ฆฌ๊ณ ์ ์ญ์ผ๋ก ๊ตฌ๋ถํ์์ต๋๋ค.
๋๋ฉ์ธ ํจํค์ง๋ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ฉฐ, ์ธํ๋ผ ํจํค์ง๋ ์ธ๋ถ ์์คํ
๊ณผ์ ์ฐ๋์ ๋ด๋นํฉ๋๋ค.
์ ์ญ ํจํค์ง๋ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉ๋๋ ํจํค์ง๋ฅผ ๋ด๋นํฉ๋๋ค.
์๋น์ค ๋ ์ด์ด์ ์ถ๊ฐ์ ์ธ ํ์ฌ๋ ํจํด์ ์ ์ฉํ์ฌ, ํจํค์ง ์ํ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์์ต๋๋ค.
๐ฆ ํ๋ก์ ํธ ๊ตฌ์กฐ ๋๋ณด๊ธฐ
```yaml
โโโ domain
โย ย โโโ appointment
โย ย โย ย โโโ api
โย ย โย ย โย ย โโโ request
โย ย โย ย โโโ application
โย ย โย ย โย ย โโโ response
โย ย โย ย โย ย โโโ appointmentdetail
โย ย โย ย โโโ config
โย ย โย ย โโโ dao
โย ย โย ย โโโ domain
โย ย โย ย โโโ exception
โย ย โย ย โโโ errorcode
โย ย โย ย โโโ handler
โย ย โโโ facade
โย ย โโโ keyword
โย ย โย ย โโโ application
โย ย โย ย โโโ dao
โย ย โย ย โย ย โโโ response
โย ย โย ย โโโ domain
โย ย โย ย โโโ exception
โย ย โโโ possibledatetime
โย ย โย ย โโโ api
โย ย โย ย โย ย โโโ request
โย ย โย ย โโโ application
โย ย โย ย โย ย โโโ response
โย ย โย ย โโโ dao
โย ย โย ย โโโ domain
โย ย โย ย โโโ exception
โย ย โย ย โโโ errorcode
โย ย โย ย โโโ handler
โย ย โโโ profile
โย ย โย ย โโโ api
โย ย โย ย โย ย โโโ request
โย ย โย ย โโโ application
โย ย โย ย โย ย โโโ response
โย ย โย ย โโโ config
โย ย โย ย โโโ dao
โย ย โย ย โโโ domain
โย ย โย ย โโโ exception
โย ย โย ย โโโ errorcode
โย ย โย ย โโโ handler
โย ย โโโ reject
โย ย โย ย โโโ api
โย ย โย ย โโโ application
โย ย โย ย โย ย โโโ response
โย ย โย ย โโโ dao
โย ย โย ย โโโ exception
โย ย โโโ review
โย ย โย ย โโโ api
โย ย โย ย โย ย โโโ request
โย ย โย ย โโโ application
โย ย โย ย โย ย โโโ response
โย ย โย ย โโโ dao
โย ย โย ย โโโ domain
โย ย โย ย โโโ exception
โย ย โโโ user
โย ย โโโ api
โย ย โย ย โโโ requset
โย ย โโโ application
โย ย โย ย โโโ response
โย ย โโโ dao
โย ย โโโ domain
โย ย โโโ exception
โย ย โโโ errorcode
โย ย โโโ handler
โโโ global
โย ย โโโ common
โย ย โย ย โโโ exception
โย ย โย ย โย ย โโโ errorcode
โย ย โย ย โย ย โโโ handler
โย ย โย ย โโโ request
โย ย โย ย โโโ response
โย ย โย ย โโโ config
โย ย โโโ config
โย ย โโโ jwt
โย ย โย ย โโโ api
โย ย โย ย โโโ application
โย ย โย ย โย ย โโโ response
โย ย โย ย โโโ exception
โย ย โย ย โโโ errorcode
โย ย โย ย โโโ handler
โย ย โโโ logging
โย ย โโโ message
โย ย โโโ swagger
โย ย โย ย โโโ exception
โย ย โโโ tsid
โย ย โโโ uuid
โย ย โโโ application
โย ย โโโ dao
โย ย โโโ domain
โย ย โโโ exception
โย ย โโโ util
โโโ infra
โโโ auth
โย ย โโโ dao
โย ย โโโ domain
โย ย โโโ exception
โย ย โย ย โโโ errorcode
โย ย โย ย โโโ handler
โย ย โโโ kakao
โย ย โโโ response
โย ย โโโ service
โโโ health
โย ย โโโ api
โย ย โโโ application
โย ย โโโ dao
โโโ redis
โย ย โโโ dao
โย ย โโโ domain
โโโ s3
โโโ application
โโโ config
โโโ exception
```
๐จโ๐ป BE ๊ธฐ์ฌ๋
์กํ๋
๊ฐ์ฐ์ฃผ
- MVP ๊ธฐ๊ฐ
- ์นด์นด์ค ์์
๋ก๊ทธ์ธ ๊ตฌํ
- ์ฌ์ฉ์ ์ถ๊ฐ์ ๋ณด ์
๋ ฅ ๋ฐ ํ์๊ฐ์
์ฒ๋ฆฌ
- ๋ฐฅ ์ฝ์ ์๋ฝ/๊ฑฐ์ ์ฒ๋ฆฌ
- ์ฌ์ฉ์ ์ ๋ณด ์์ ์ฒ๋ฆฌ
์๊ฐ
ETC
- Initial work, Read me - proHyundo
- License - This project is licensed under the AGPL License - see the LICENSE.md file for details