diff --git a/proj-acquirex/pom.xml b/proj-acquirex/pom.xml
new file mode 100644
index 0000000..c86047a
--- /dev/null
+++ b/proj-acquirex/pom.xml
@@ -0,0 +1,79 @@
+
+
+ 4.0.0
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.2.5
+
+
+
+ com.acquirex
+ proj-acquirex
+ 1.0.0-SNAPSHOT
+ jar
+ proj-acquirex
+ 카드 매입 승인 경로 - Spring Boot 3 Migration
+
+
+ 17
+ 17
+ 17
+ UTF-8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ com.h2database
+ h2
+ runtime
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 3.2.5
+
+
+
+
\ No newline at end of file
diff --git a/proj-acquirex/src/main/java/com/acquirex/AcquirexApplication.java b/proj-acquirex/src/main/java/com/acquirex/AcquirexApplication.java
new file mode 100644
index 0000000..daf6bca
--- /dev/null
+++ b/proj-acquirex/src/main/java/com/acquirex/AcquirexApplication.java
@@ -0,0 +1,11 @@
+package com.acquirex;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class AcquirexApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(AcquirexApplication.class, args);
+ }
+}
\ No newline at end of file
diff --git a/proj-acquirex/src/main/java/com/acquirex/approval/controller/AcquisitionApprovalController.java b/proj-acquirex/src/main/java/com/acquirex/approval/controller/AcquisitionApprovalController.java
new file mode 100644
index 0000000..a3419e2
--- /dev/null
+++ b/proj-acquirex/src/main/java/com/acquirex/approval/controller/AcquisitionApprovalController.java
@@ -0,0 +1,61 @@
+package com.acquirex.approval.controller;
+
+import com.acquirex.approval.domain.AcquisitionApproval.ApprovalStatus;
+import com.acquirex.approval.service.AcquisitionApprovalService;
+import com.acquirex.approval.service.AcquisitionApprovalService.ApprovalRequest;
+import com.acquirex.approval.service.AcquisitionApprovalService.ApprovalResponse;
+import jakarta.validation.Valid;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/** 카드 매입 승인 REST 컨트롤러 - Spring Boot 3: jakarta.* 네임스페이스 적용 */
+@RestController
+@RequestMapping("/api/v1/acquisitions")
+public class AcquisitionApprovalController {
+
+ private final AcquisitionApprovalService service;
+
+ public AcquisitionApprovalController(AcquisitionApprovalService service) {
+ this.service = service;
+ }
+
+ @PostMapping("/approvals")
+ public ResponseEntity createApproval(@Valid @RequestBody ApprovalRequest request) {
+ return ResponseEntity.status(HttpStatus.CREATED).body(service.processApproval(request));
+ }
+
+ @GetMapping("/approvals/{approvalNumber}")
+ public ResponseEntity getApproval(@PathVariable String approvalNumber) {
+ return ResponseEntity.ok(service.findByApprovalNumber(approvalNumber));
+ }
+
+ @GetMapping("/merchants/{merchantId}/approvals")
+ public ResponseEntity> getApprovalsByMerchant(
+ @PathVariable String merchantId, @RequestParam(required = false) ApprovalStatus status) {
+ return ResponseEntity.ok(service.findByMerchantId(merchantId, status));
+ }
+
+ @PostMapping("/approvals/{id}/cancel")
+ public ResponseEntity cancelApproval(@PathVariable Long id) {
+ return ResponseEntity.ok(service.cancelApproval(id));
+ }
+
+ @ExceptionHandler(jakarta.validation.ConstraintViolationException.class)
+ public ResponseEntity