금사파
시세가 변경되는 금의 주문판매 서비스입니다.
기간 : 2024.09.02 ~ 2024.09.09
목차
- 프로젝트 환경
- Quick Start
- Quick Stop
- ERD
- API 명세서
- 디렉토리 구조
프로젝트 환경
Stack |
Version |
|
Spring Boot 3.3.3 |
|
Gradle 8.8 |
|
JDK 17 |
|
MariaDB 11.5.2 |
|
Redis 7.4.0 |
|
Docker 27.2.0 |
|
Docker Compose 2.29.2 |
Quick Start & Stop
Quick Start
### 1. 사전 준비 사항
- Docker 및 Docker Compose가 설치되어 있어야 합니다.
### 2. 데이터베이스 실행
애플리케이션을 시작하기 전에 데이터베이스를 Docker Compose를 사용하여 설정해야 합니다.
다음 명령어를 사용하여 각 서버의 데이터베이스를 실행합니다.
```shell
docker-compose -f ./auth-server/docker-compose.auth.yml up -d
docker-compose -f ./resource-server/docker-compose.resource.yml up -d
```
위 명령어는 백그라운드에서 데이터베이스 컨테이너를 실행합니다.
실행 중인 상태를 확인하려면 `docker ps` 명령어를 사용하세요.
### 3. 서버 실행
서버별로 터미널을 열어 다음 명령어를 실행합니다.
- 인증 서버 (포트 8888)
```shell
./gradlew :auth-server:bootJar
```
```shell
java -jar ./auth-server/build/libs/auth-server-0.0.1-SNAPSHOT.jar
```
- 자원 서버 (포트 9999)
```shell
./gradlew :resource-server:bootJar
```
```shell
java -jar ./resource-server/build/libs/resource-server-0.0.1-SNAPSHOT.jar
```
Quick Stop
### 1. 서버 종료
서버를 종료하려면 터미널에서 다음 명령어를 실행합니다.
- 인증 서버 (포트 8888)
```shell
sudo lsof -i :8888
sudo kill -9 [PID] # [PID]는 실제 프로세스 ID로 대체
```
- 자원 서버 (포트 9999)
```shell
sudo lsof -i :9999
sudo kill -9 [PID] # [PID]는 실제 프로세스 ID로 대체
```
### 2. 데이터베이스 종료
데이터베이스를 종료하려면 다음 명령어를 사용합니다.
```shell
docker-compose -f ./auth-server/docker-compose.auth.yml down
docker-compose -f ./resource-server/docker-compose.resource.yml down
```
ERD
API 명세서
- Postman에서 예시 Request, Response을 확인할 수 있습니다.
- 에러 코드 에서 응답에 사용된 에러 코드의 정보를 확인할 수 있습니다.
디렉토리 구조
1. 멀티 모듈
이 프로젝트는 멀티 모듈로 구성되어 있습니다.
- auth-server : 인증을 담당하는 서버입니다.
- resource-server : 자원을 담당하는 서버입니다.
- core : 에러코드, 공통 리스폰스, JpaConfig 설정 등 두 서버의 공통적인 부분을 담당하는 모듈입니다.
구조도
```
.
├── README.md
├── auth-server
│ ├── build
│ ├── docker-compose.auth.yml
│ ├── .env
│ └── src
│ ├── main
│ │ ├── java
│ │ └── resources
│ └── test
├── core
│ ├── build
│ ├── src
│ └── test
├── gradle
│ └── wrapper
├── gradlew
├── gradlew.bat
├── resource-server
│ ├── build
│ ├── docker-compose.resource.yml
│ ├── .env
│ └── src
│ ├── main
│ │ ├── java
│ │ └── resources
│ └── test
└── settings.gradle
```
core
- config: 공통적으로 사용하는 설정입니다.
- entity: DB 테이블과 매칭되는 엔티티 클래스를 관리합니다. 공통적으로 사용하는 컬럼을 BaseEntity로 구성하였습니다.
- exception: 사용자 정의 예외 클래스를 관리하고 전역으로 예외를 처리합니다.
- util: 공통적으로 사용하는 유틸리티 클래스를 관리합니다. ApiUtils를 통해 공통적인 API 응답 형식을 제공합니다.
core 구조도
```
.core
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── yhkim
│ │ ├── config
│ │ │ └── JpaConfig.java
│ │ ├── entity
│ │ │ └── BaseEntity.java
│ │ ├── exception
│ │ │ ├── CustomException.java
│ │ │ ├── ErrorCode.java
│ │ │ └── GlobalExceptionHandler.java
│ │ └── util
│ │ └── ApiUtils.java
│ └── resources
│ └── application-core.yml
└── test
├── java
└── resources
```
2. auth-server
인증을 담당하는 서버입니다.
도메인
- auth: 토큰 및 및 인증 관련 기능
- user: 사용자 관련 기능
도메인의 하위 패키지
- controller: MVC 패턴의 컨트롤러 역할을 하며, 사용자 요청을 처리합니다.
- dto: 비즈니스 로직 수행 시 사용하는 DTO (Data Transfer Object)를 관리합니다. 주로 요청(request) 및 응답(response) 객체를 포함합니다.
- entity: DB 테이블과 매칭되는 엔티티 클래스를 관리합니다. 테이블과 동일한 프로퍼티를 가진 클래스입니다.
- repository: Spring Data JPA를 위한 레포지토리 인터페이스를 관리합니다.
- service: 비즈니스 로직을 통해 데이터를 처리하고 가공하는 역할을 수행합니다.
auth-server 구조도
```
.auth-server
├── docker-compose.auth.yml
├── .env
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── yhkim
│ │ ├── AuthServerApplication.java
│ │ └── domain
│ │ ├── auth
│ │ │ ├── JwtTokenProvider.java
│ │ │ ├── TokenType.java
│ │ │ ├── UserDetailsImpl.java
│ │ │ ├── config
│ │ │ │ ├── RedisConfig.java
│ │ │ │ └── WebSecurityConfig.java
│ │ │ ├── controller
│ │ │ │ └── AuthController.java
│ │ │ ├── dto
│ │ │ │ ├── JwtTokenInfo.java
│ │ │ │ └── ReissueTokenResponse.java
│ │ │ ├── entity
│ │ │ │ └── RefreshToken.java
│ │ │ ├── filter
│ │ │ │ └── JwtAuthenticationFilter.java
│ │ │ ├── repository
│ │ │ │ └── RefreshTokenRepository.java
│ │ │ └── service
│ │ │ ├── AuthService.java
│ │ │ ├── AuthServiceImpl.java
│ │ │ └── UserDetailsServiceImpl.java
│ │ └── user
│ │ ├── controller
│ │ │ └── UserController.java
│ │ ├── dto
│ │ │ ├── DeleteUserResponse.java
│ │ │ ├── LoginUserRequest.java
│ │ │ ├── LoginUserResponse.java
│ │ │ ├── SignupUserRequest.java
│ │ │ ├── SignupUserResponse.java
│ │ │ └── UserDetailResponse.java
│ │ ├── entity
│ │ │ └── User.java
│ │ ├── repository
│ │ │ └── UserRepository.java
│ │ └── service
│ │ ├── UserService.java
│ │ └── UserServiceImpl.java
│ └── resources
│ └── application.yml
└── test
├── java
└── resources
```
3. resource-server
자원을 담당하는 서버입니다.
도메인
- order: 주문 관련 기능
- product: 상품 관련 기능
도메인의 하위 패키지
위와 같습니다.
resource-server 구조도
```
.resource-server
├── docker-compose.resource.yml
├── .env
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── yhkim
│ │ ├── ResourceServerApplication.java
│ │ └── domain
│ │ ├── order
│ │ │ ├── controller
│ │ │ │ └── OrderController.java
│ │ │ ├── dto
│ │ │ │ ├── CreateOrderRequest.java
│ │ │ │ ├── GetOrderRequest.java
│ │ │ │ ├── Links.java
│ │ │ │ ├── OrderDetailResponse.java
│ │ │ │ └── UpdateOrderRequest.java
│ │ │ ├── entity
│ │ │ │ ├── Order.java
│ │ │ │ ├── OrderStatus.java
│ │ │ │ └── OrderType.java
│ │ │ ├── repository
│ │ │ │ └── OrderRepository.java
│ │ │ ├── service
│ │ │ │ ├── OrderService.java
│ │ │ │ └── OrderServiceImpl.java
│ │ │ └── util
│ │ │ └── OrderNumberGenerator.java
│ │ └── product
│ │ ├── dto
│ │ ├── entity
│ │ │ ├── Product.java
│ │ │ ├── ProductCode.java
│ │ │ └── ProductPrice.java
│ │ └── repository
│ │ ├── ProductPriceRepository.java
│ │ └── ProductRepository.java
│ └── resources
│ ├── application.yml
│ └── data.sql
└── test
├── java
└── resources
```