130 lines
No EOL
3.9 KiB
Markdown
130 lines
No EOL
3.9 KiB
Markdown
# 카드 매입 승인 경로 - Spring Boot 3 전환
|
|
|
|
## 전환 개요
|
|
|
|
| 항목 | 기존 | 전환 후 |
|
|
|------|------|----------|
|
|
| Spring Boot | 2.7.x | **3.2.5** |
|
|
| Spring Framework | 5.x | **6.1.x** |
|
|
| Java | 11 | **17** |
|
|
| Jakarta EE | 8 (javax.*) | **10 (jakarta.*)** |
|
|
| Hibernate | 5.x | **6.4.x** |
|
|
| JPA | 2.2 | **3.1** |
|
|
| Validation | Bean Validation 2.0 | **Bean Validation 3.0** |
|
|
|
|
## 주요 전환 사항
|
|
|
|
### 1. Jakarta EE 9+ 마이그레이션
|
|
- `javax.*` → `jakarta.*` 네임스페이스 변환
|
|
- `@Entity`, `@Table`, `@Column` 등 JPA 어노테이션
|
|
- `@NotBlank`, `@NotNull`, `@Positive` 등 Validation 어노테이션
|
|
|
|
### 2. Spring Framework 6.x 변경사항
|
|
- Jakarta Servlet API 사용
|
|
- 개선된 예외 처리 구조
|
|
|
|
### 3. Spring Boot 3.x 의존성
|
|
- `spring-boot-starter-validation` (Bean Validation 3.0 내장)
|
|
- `spring-boot-starter-actuator` (헬스체크)
|
|
- Jackson 2.15+ (Java 8 Date/Time first-class 지원)
|
|
|
|
## 프로젝트 구조
|
|
|
|
```
|
|
src/main/java/com/acquirex/cardapproval/
|
|
├── CardAcquisitionApprovalApplication.java # 메인 애플리케이션
|
|
├── controller/
|
|
│ └── AcquisitionApprovalController.java # REST API 엔드포인트
|
|
├── domain/
|
|
│ └── AcquisitionApproval.java # 도메인 엔티티 + Repository
|
|
└── service/
|
|
└── AcquisitionApprovalService.java # 비즈니스 로직 + DTO + Exception Handler
|
|
```
|
|
|
|
## API 엔드포인트
|
|
|
|
| Method | Endpoint | 설명 |
|
|
|--------|----------|------|
|
|
| POST | `/api/v1/acquisitions` | 매입 승인 요청 처리 |
|
|
| GET | `/api/v1/acquisitions/{id}` | 매입 승인 단건 조회 |
|
|
| GET | `/api/v1/acquisitions/merchant/{merchantId}` | 가맹점별 목록 조회 |
|
|
| GET | `/api/v1/acquisitions/period?startDate=&endDate=` | 기간별 목록 조회 |
|
|
| POST | `/api/v1/acquisitions/{id}/cancel` | 매입 취소 처리 |
|
|
|
|
## 검증 절차
|
|
|
|
### 1. 빌드 검증
|
|
```bash
|
|
./mvnw clean compile
|
|
```
|
|
|
|
### 2. 테스트 실행
|
|
```bash
|
|
./mvnw test
|
|
```
|
|
|
|
### 3. 애플리케이션 실행
|
|
```bash
|
|
./mvnw spring-boot:run
|
|
```
|
|
|
|
### 4. API 동작 확인
|
|
```bash
|
|
# 매입 승인 요청
|
|
curl -X POST http://localhost:8080/api/v1/acquisitions \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"merchantId": "MERCHANT001",
|
|
"cardNumber": "1234567890123456",
|
|
"acquisitionAmount": 50000,
|
|
"approvalAmount": 50000,
|
|
"approvalNumber": "APPR123456",
|
|
"acquisitionDatetime": "2024-01-15T10:30:00"
|
|
}'
|
|
|
|
# 매입 승인 조회
|
|
curl http://localhost:8080/api/v1/acquisitions/1
|
|
|
|
# 매입 취소
|
|
curl -X POST http://localhost:8080/api/v1/acquisitions/1/cancel \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"reason": "고객 요청"}'
|
|
```
|
|
|
|
### 5. H2 콘솔
|
|
- URL: `http://localhost:8080/h2-console`
|
|
- JDBC URL: `jdbc:h2:mem:acquirex`
|
|
|
|
## 테스트 커버리지
|
|
|
|
| 테스트 | 검증 내용 |
|
|
|--------|----------|
|
|
| `contextLoads` | 스프링 컨텍스트 로드 |
|
|
| `processAcquisition_Success` | 매입 승인 처리 성공 |
|
|
| `processAcquisition_AmountMismatch_ThrowsException` | 금액 불일치 예외 |
|
|
| `cancelAcquisition_Success` | 매입 취소 처리 성공 |
|
|
| `cancelAcquisition_AlreadyCancelled_ThrowsException` | 중복 취소 예외 |
|
|
| `getAcquisition_NotFound_ThrowsException` | 존재하지 않는 ID 조회 예외 |
|
|
| `getAcquisitionsByMerchant_Success` | 가맹점별 목록 조회 |
|
|
| `entityCancelMethod_WorksCorrectly` | 엔티티 취소 메서드 동작 |
|
|
|
|
## 전환 체크리스트
|
|
|
|
- [x] `javax.persistence` → `jakarta.persistence` 마이그레이션
|
|
- [x] `javax.validation` → `jakarta.validation` 마이그레이션
|
|
- [x] Java 17 이상 요구사항 반영
|
|
- [x] Spring Boot 3.2.x 의존성 적용
|
|
- [x] 통합 테스트 작성 및 통과 확인
|
|
- [x] README 문서화
|
|
|
|
## 의존성 버전
|
|
|
|
| Dependency | Version |
|
|
|------------|---------|
|
|
| Spring Boot | 3.2.5 |
|
|
| Spring Framework | 6.1.5 |
|
|
| Hibernate | 6.4.4 |
|
|
| Jakarta EE | 10.0.0 |
|
|
| Java | 17 |
|
|
| Lombok | 1.18.30 |
|
|
| H2 Database | 2.2.224 | |