diff --git a/proj-acquirex/pom.xml b/proj-acquirex/pom.xml
new file mode 100644
index 0000000..0da0de7
--- /dev/null
+++ b/proj-acquirex/pom.xml
@@ -0,0 +1,69 @@
+
+
+ 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 마이그레이션
+
+
+ 17
+ 17
+ 17
+ UTF-8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ jakarta.platform
+ jakarta.jakartaee-bom
+ 10.0.0
+ pom
+ import
+
+
+ com.h2database
+ h2
+ runtime
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ 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/ApprovalController.java b/proj-acquirex/src/main/java/com/acquirex/approval/controller/ApprovalController.java
new file mode 100644
index 0000000..dc5bc42
--- /dev/null
+++ b/proj-acquirex/src/main/java/com/acquirex/approval/controller/ApprovalController.java
@@ -0,0 +1,51 @@
+package com.acquirex.approval.controller;
+
+import com.acquirex.approval.domain.ApprovalDomain.Request;
+import com.acquirex.approval.domain.ApprovalDomain.Response;
+import com.acquirex.approval.domain.ApprovalDomain.Status;
+import com.acquirex.approval.service.ApprovalService;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.validation.Valid;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/api/v1/approvals")
+public class ApprovalController {
+ private static final Logger log = LoggerFactory.getLogger(ApprovalController.class);
+ private final ApprovalService approvalService;
+
+ public ApprovalController(ApprovalService approvalService) {
+ this.approvalService = approvalService;
+ }
+
+ @PostMapping
+ public ResponseEntity requestApproval(@Valid @RequestBody Request request) {
+ log.info("매입 승인 API 호출: {}", request.getTransactionId());
+ Response response = approvalService.processApproval(request);
+ return response.getStatus() == Status.APPROVED
+ ? ResponseEntity.ok(response)
+ : ResponseEntity.badRequest().body(response);
+ }
+
+ @DeleteMapping("/{approvalId}")
+ public ResponseEntity cancelApproval(@PathVariable String approvalId) {
+ log.info("매입 취소 API 호출: {}", approvalId);
+ return ResponseEntity.ok(approvalService.cancelApproval(approvalId));
+ }
+
+ @GetMapping("/{approvalId}")
+ public ResponseEntity getApprovalStatus(@PathVariable String approvalId) {
+ log.info("승인 상태 조회: {}", approvalId);
+ return ResponseEntity.ok(approvalService.cancelApproval(approvalId));
+ }
+
+ @ExceptionHandler(Exception.class)
+ public ResponseEntity