diff --git a/pom.xml b/pom.xml
index 39ce23fbe2..635b07c92c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -57,6 +57,25 @@
             h2
             test
         
+
+        
+            org.springframework.boot
+            spring-boot-starter-thymeleaf
+        
+
+        
+            org.springframework.boot
+            spring-boot-starter-web
+        
+
+        
+            com.fasterxml.jackson.dataformat
+            jackson-dataformat-xml
+        
+        
+            jakarta.xml.bind
+            jakarta.xml.bind-api
+        
     
 
     
diff --git a/restrequest/json-request.http b/restrequest/json-request.http
new file mode 100644
index 0000000000..bd7a08e2fd
--- /dev/null
+++ b/restrequest/json-request.http
@@ -0,0 +1,26 @@
+GET http://localhost:8080/api/json/v1/vouchers
+
+###
+
+GET http://localhost:8080/api/json/v1/vouchers/search?startDate=2023-07-16T00:00:00&endDate=2023-07-19T23:59:59&
+    discountType=fixed
+
+###
+
+POST http://localhost:8080/api/json/v1/vouchers
+Content-Type: application/json
+
+{
+  "discountType": "fixed",
+  "discountStringValue": "123"
+}
+
+###
+
+DELETE http://localhost:8080/api/json/v1/vouchers/f3ac7182-4f80-470a-99e7-478c29c41b0f
+
+###
+
+GET http://localhost:8080/api/json/v1/vouchers/cc295caf-cdb1-4fe6-8360-a2149a74f1b9
+
+###
\ No newline at end of file
diff --git a/restrequest/xml-request.http b/restrequest/xml-request.http
new file mode 100644
index 0000000000..b16d78d922
--- /dev/null
+++ b/restrequest/xml-request.http
@@ -0,0 +1,26 @@
+GET http://localhost:8080/api/xml/v1/vouchers
+
+###
+
+GET http://localhost:8080/api/xml/v1/vouchers/search?startDate=2023-07-16T00:00:00&endDate=2023-07-19T23:59:59&
+    discountType=fixed
+
+###
+
+POST http://localhost:8080/api/xml/v1/vouchers
+Content-Type: application/xml
+
+
+    fixed
+    123
+
+
+###
+
+DELETE http://localhost:8080/api/xml/v1/vouchers/ea50d33d-d668-4dcd-b2b2-980b184ff003
+
+###
+
+GET http://localhost:8080/api/xml/v1/vouchers/fef87c80-ee1c-4aca-bf14-375930aff54c
+
+###
\ No newline at end of file
diff --git a/src/main/java/com/prgmrs/voucher/view/ConsoleApplication.java b/src/main/java/com/prgmrs/voucher/ConsoleApplication.java
similarity index 92%
rename from src/main/java/com/prgmrs/voucher/view/ConsoleApplication.java
rename to src/main/java/com/prgmrs/voucher/ConsoleApplication.java
index 06dde40d41..2913546343 100644
--- a/src/main/java/com/prgmrs/voucher/view/ConsoleApplication.java
+++ b/src/main/java/com/prgmrs/voucher/ConsoleApplication.java
@@ -1,12 +1,13 @@
-package com.prgmrs.voucher.view;
+package com.prgmrs.voucher;
 
-import com.prgmrs.voucher.controller.BlacklistController;
-import com.prgmrs.voucher.controller.UserController;
-import com.prgmrs.voucher.controller.VoucherController;
-import com.prgmrs.voucher.controller.WalletController;
-import com.prgmrs.voucher.dto.ResponseDTO;
+import com.prgmrs.voucher.controller.console.BlacklistController;
+import com.prgmrs.voucher.controller.console.UserController;
+import com.prgmrs.voucher.controller.console.VoucherController;
+import com.prgmrs.voucher.controller.console.WalletController;
+import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO;
 import com.prgmrs.voucher.exception.WrongRangeFormatException;
 import com.prgmrs.voucher.setting.BlacklistProperties;
+import com.prgmrs.voucher.view.RequestBodyCreator;
 import com.prgmrs.voucher.view.io.ConsoleReader;
 import com.prgmrs.voucher.view.io.ConsoleWriter;
 import com.prgmrs.voucher.view.io.ManagementType;
diff --git a/src/main/java/com/prgmrs/voucher/controller/BlacklistController.java b/src/main/java/com/prgmrs/voucher/controller/console/BlacklistController.java
similarity index 87%
rename from src/main/java/com/prgmrs/voucher/controller/BlacklistController.java
rename to src/main/java/com/prgmrs/voucher/controller/console/BlacklistController.java
index b56670e8d2..4179201a16 100644
--- a/src/main/java/com/prgmrs/voucher/controller/BlacklistController.java
+++ b/src/main/java/com/prgmrs/voucher/controller/console/BlacklistController.java
@@ -1,6 +1,6 @@
-package com.prgmrs.voucher.controller;
+package com.prgmrs.voucher.controller.console;
 
-import com.prgmrs.voucher.dto.ResponseDTO;
+import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO;
 import com.prgmrs.voucher.enums.StatusCode;
 import com.prgmrs.voucher.exception.WrongRangeFormatException;
 import com.prgmrs.voucher.service.BlacklistService;
diff --git a/src/main/java/com/prgmrs/voucher/controller/UserController.java b/src/main/java/com/prgmrs/voucher/controller/console/UserController.java
similarity index 94%
rename from src/main/java/com/prgmrs/voucher/controller/UserController.java
rename to src/main/java/com/prgmrs/voucher/controller/console/UserController.java
index 5edd129c2d..d7cecfd186 100644
--- a/src/main/java/com/prgmrs/voucher/controller/UserController.java
+++ b/src/main/java/com/prgmrs/voucher/controller/console/UserController.java
@@ -1,6 +1,6 @@
-package com.prgmrs.voucher.controller;
+package com.prgmrs.voucher.controller.console;
 
-import com.prgmrs.voucher.dto.ResponseDTO;
+import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO;
 import com.prgmrs.voucher.dto.request.UserRequest;
 import com.prgmrs.voucher.dto.request.VoucherIdRequest;
 import com.prgmrs.voucher.enums.StatusCode;
diff --git a/src/main/java/com/prgmrs/voucher/controller/VoucherController.java b/src/main/java/com/prgmrs/voucher/controller/console/VoucherController.java
similarity index 95%
rename from src/main/java/com/prgmrs/voucher/controller/VoucherController.java
rename to src/main/java/com/prgmrs/voucher/controller/console/VoucherController.java
index 607b8e15c0..a9f7aaa3aa 100644
--- a/src/main/java/com/prgmrs/voucher/controller/VoucherController.java
+++ b/src/main/java/com/prgmrs/voucher/controller/console/VoucherController.java
@@ -1,6 +1,6 @@
-package com.prgmrs.voucher.controller;
+package com.prgmrs.voucher.controller.console;
 
-import com.prgmrs.voucher.dto.ResponseDTO;
+import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO;
 import com.prgmrs.voucher.dto.request.UsernameRequest;
 import com.prgmrs.voucher.dto.request.VoucherRequest;
 import com.prgmrs.voucher.enums.StatusCode;
diff --git a/src/main/java/com/prgmrs/voucher/controller/WalletController.java b/src/main/java/com/prgmrs/voucher/controller/console/WalletController.java
similarity index 92%
rename from src/main/java/com/prgmrs/voucher/controller/WalletController.java
rename to src/main/java/com/prgmrs/voucher/controller/console/WalletController.java
index 728bc7b9e0..9572a3abf3 100644
--- a/src/main/java/com/prgmrs/voucher/controller/WalletController.java
+++ b/src/main/java/com/prgmrs/voucher/controller/console/WalletController.java
@@ -1,6 +1,6 @@
-package com.prgmrs.voucher.controller;
+package com.prgmrs.voucher.controller.console;
 
-import com.prgmrs.voucher.dto.ResponseDTO;
+import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO;
 import com.prgmrs.voucher.dto.request.AssignVoucherRequest;
 import com.prgmrs.voucher.dto.request.RemoveVoucherRequest;
 import com.prgmrs.voucher.enums.StatusCode;
diff --git a/src/main/java/com/prgmrs/voucher/dto/ResponseDTO.java b/src/main/java/com/prgmrs/voucher/controller/console/wrapper/ResponseDTO.java
similarity index 85%
rename from src/main/java/com/prgmrs/voucher/dto/ResponseDTO.java
rename to src/main/java/com/prgmrs/voucher/controller/console/wrapper/ResponseDTO.java
index 101722c4d5..e4c6bc4ee7 100644
--- a/src/main/java/com/prgmrs/voucher/dto/ResponseDTO.java
+++ b/src/main/java/com/prgmrs/voucher/controller/console/wrapper/ResponseDTO.java
@@ -1,4 +1,4 @@
-package com.prgmrs.voucher.dto;
+package com.prgmrs.voucher.controller.console.wrapper;
 
 import com.prgmrs.voucher.enums.StatusCode;
 
diff --git a/src/main/java/com/prgmrs/voucher/controller/json/VoucherJsonController.java b/src/main/java/com/prgmrs/voucher/controller/json/VoucherJsonController.java
new file mode 100644
index 0000000000..793425c970
--- /dev/null
+++ b/src/main/java/com/prgmrs/voucher/controller/json/VoucherJsonController.java
@@ -0,0 +1,47 @@
+package com.prgmrs.voucher.controller.json;
+
+import com.prgmrs.voucher.dto.request.VoucherIdRequest;
+import com.prgmrs.voucher.dto.request.VoucherRequest;
+import com.prgmrs.voucher.dto.request.VoucherSearchRequest;
+import com.prgmrs.voucher.dto.response.RemoveResponse;
+import com.prgmrs.voucher.dto.response.VoucherListResponse;
+import com.prgmrs.voucher.dto.response.VoucherResponse;
+import com.prgmrs.voucher.service.VoucherService;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/api/json/v1")
+public class VoucherJsonController {
+
+    private final VoucherService voucherService;
+
+    public VoucherJsonController(VoucherService voucherService) {
+        this.voucherService = voucherService;
+    }
+
+    @GetMapping("/vouchers")
+    public ResponseEntity findAll() {
+        return ResponseEntity.ok(voucherService.findAll());
+    }
+
+    @GetMapping("/vouchers/search")
+    public ResponseEntity findByCreationTimeAndDiscountType(VoucherSearchRequest voucherSearchRequest) {
+        return ResponseEntity.ok(voucherService.findByCreationTimeAndDiscountType(voucherSearchRequest));
+    }
+
+    @PostMapping("/vouchers")
+    public ResponseEntity createVoucher(@RequestBody VoucherRequest voucherRequest) {
+        return ResponseEntity.ok(voucherService.createVoucher(voucherRequest));
+    }
+
+    @DeleteMapping("/vouchers/{voucherId}")
+    public ResponseEntity removeVoucher(@PathVariable("voucherId") VoucherIdRequest voucherIdRequest) {
+        return ResponseEntity.ok(voucherService.removeVoucher(voucherIdRequest));
+    }
+
+    @GetMapping("/vouchers/{voucherId}")
+    public ResponseEntity findById(@PathVariable("voucherId") VoucherIdRequest voucherIdRequest) {
+        return ResponseEntity.ok(voucherService.findById(voucherIdRequest));
+    }
+}
diff --git a/src/main/java/com/prgmrs/voucher/controller/mvc/VoucherMvcController.java b/src/main/java/com/prgmrs/voucher/controller/mvc/VoucherMvcController.java
new file mode 100644
index 0000000000..4bc3585688
--- /dev/null
+++ b/src/main/java/com/prgmrs/voucher/controller/mvc/VoucherMvcController.java
@@ -0,0 +1,67 @@
+package com.prgmrs.voucher.controller.mvc;
+
+import com.prgmrs.voucher.controller.mvc.dto.VoucherMvcCreateRequest;
+import com.prgmrs.voucher.controller.mvc.dto.VoucherMvcRemoveRequest;
+import com.prgmrs.voucher.dto.request.VoucherIdRequest;
+import com.prgmrs.voucher.dto.request.VoucherRequest;
+import com.prgmrs.voucher.dto.response.VoucherListResponse;
+import com.prgmrs.voucher.model.Voucher;
+import com.prgmrs.voucher.service.VoucherService;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.List;
+
+@Controller
+@RequestMapping("/vouchers")
+public class VoucherMvcController {
+    private final VoucherService voucherService;
+
+    public VoucherMvcController(VoucherService voucherService) {
+        this.voucherService = voucherService;
+    }
+
+    @GetMapping("/")
+    public String showMainPage() {
+        return "voucher-main";
+    }
+
+    @GetMapping("/list")
+    public String showListPage(Model model) {
+        VoucherListResponse voucherListResponse = voucherService.findAll();
+        List voucherList = voucherListResponse.voucherList();
+        model.addAttribute("voucherList", voucherList);
+        return "voucher-list";
+    }
+
+    @GetMapping("/create")
+    public String showCreatePage(Model model) {
+        model.addAttribute("voucherCreateRequest", new VoucherMvcCreateRequest());
+        return "voucher-create";
+    }
+
+    @PostMapping("/create")
+    public String createVoucher(@ModelAttribute VoucherMvcCreateRequest voucherMvcCreateRequest) {
+        voucherService.createVoucher(new VoucherRequest(voucherMvcCreateRequest.getDiscountType(), voucherMvcCreateRequest.getDiscountStringValue()));
+        return "voucher-request-success";
+    }
+
+    @GetMapping("/remove")
+    public String showRemovePage(Model model) {
+        VoucherListResponse voucherListResponse = voucherService.findAll();
+        List voucherList = voucherListResponse.voucherList();
+        model.addAttribute("voucherList", voucherList);
+        model.addAttribute("voucherRemoveRequest", new VoucherMvcRemoveRequest());
+        return "voucher-remove";
+    }
+
+    @PostMapping("/remove")
+    public String removeVoucher(@ModelAttribute VoucherMvcRemoveRequest voucherMvcRemoveRequest) {
+        voucherService.removeVoucher(new VoucherIdRequest(voucherMvcRemoveRequest.getVoucherId()));
+        return "voucher-request-success";
+    }
+}
diff --git a/src/main/java/com/prgmrs/voucher/controller/mvc/dto/VoucherMvcCreateRequest.java b/src/main/java/com/prgmrs/voucher/controller/mvc/dto/VoucherMvcCreateRequest.java
new file mode 100644
index 0000000000..835b3ec92d
--- /dev/null
+++ b/src/main/java/com/prgmrs/voucher/controller/mvc/dto/VoucherMvcCreateRequest.java
@@ -0,0 +1,26 @@
+package com.prgmrs.voucher.controller.mvc.dto;
+
+public class VoucherMvcCreateRequest {
+    private String discountType;
+    private String discountStringValue;
+
+    public VoucherMvcCreateRequest() {
+        // Do nothing for thymeleaf support purpose
+    }
+
+    public String getDiscountType() {
+        return discountType;
+    }
+
+    public void setDiscountType(String discountType) {
+        this.discountType = discountType;
+    }
+
+    public String getDiscountStringValue() {
+        return discountStringValue;
+    }
+
+    public void setDiscountStringValue(String discountStringValue) {
+        this.discountStringValue = discountStringValue;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/prgmrs/voucher/controller/mvc/dto/VoucherMvcRemoveRequest.java b/src/main/java/com/prgmrs/voucher/controller/mvc/dto/VoucherMvcRemoveRequest.java
new file mode 100644
index 0000000000..a68beca54c
--- /dev/null
+++ b/src/main/java/com/prgmrs/voucher/controller/mvc/dto/VoucherMvcRemoveRequest.java
@@ -0,0 +1,17 @@
+package com.prgmrs.voucher.controller.mvc.dto;
+
+public class VoucherMvcRemoveRequest {
+    private String voucherId;
+
+    public VoucherMvcRemoveRequest() {
+        // Do nothing for thymeleaf support purpose
+    }
+
+    public String getVoucherId() {
+        return voucherId;
+    }
+
+    public void setVoucherId(String voucherId) {
+        this.voucherId = voucherId;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/prgmrs/voucher/controller/xml/VoucherXmlController.java b/src/main/java/com/prgmrs/voucher/controller/xml/VoucherXmlController.java
new file mode 100644
index 0000000000..aa33cdb288
--- /dev/null
+++ b/src/main/java/com/prgmrs/voucher/controller/xml/VoucherXmlController.java
@@ -0,0 +1,47 @@
+package com.prgmrs.voucher.controller.xml;
+
+import com.prgmrs.voucher.dto.request.VoucherIdRequest;
+import com.prgmrs.voucher.dto.request.VoucherRequest;
+import com.prgmrs.voucher.dto.request.VoucherSearchRequest;
+import com.prgmrs.voucher.dto.response.RemoveResponse;
+import com.prgmrs.voucher.dto.response.VoucherListResponse;
+import com.prgmrs.voucher.dto.response.VoucherResponse;
+import com.prgmrs.voucher.service.VoucherService;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/api/xml/v1")
+public class VoucherXmlController {
+    private final VoucherService voucherService;
+
+    public VoucherXmlController(VoucherService voucherService) {
+        this.voucherService = voucherService;
+    }
+
+    @GetMapping(value = "/vouchers", produces = "application/xml")
+    public ResponseEntity findAll() {
+        return ResponseEntity.ok(voucherService.findAll());
+    }
+
+    @GetMapping(value = "/vouchers/search", produces = "application/xml")
+    public ResponseEntity findByCreationTimeAndDiscountType(VoucherSearchRequest voucherSearchRequest) {
+        return ResponseEntity.ok(voucherService.findByCreationTimeAndDiscountType(voucherSearchRequest));
+    }
+
+    @PostMapping(value = "/vouchers", consumes = "application/xml", produces = "application/xml")
+    public ResponseEntity createVoucher(@RequestBody VoucherRequest voucherRequest) {
+        System.out.println(voucherRequest); // or use a logger
+        return ResponseEntity.ok(voucherService.createVoucher(voucherRequest));
+    }
+
+    @DeleteMapping(value = "/vouchers/{voucherId}", produces = "application/xml")
+    public ResponseEntity removeVoucher(@PathVariable("voucherId") VoucherIdRequest voucherIdRequest) {
+        return ResponseEntity.ok(voucherService.removeVoucher(voucherIdRequest));
+    }
+
+    @GetMapping(value = "/vouchers/{voucherId}", produces = "application/xml")
+    public ResponseEntity findById(@PathVariable("voucherId") VoucherIdRequest voucherIdRequest) {
+        return ResponseEntity.ok(voucherService.findById(voucherIdRequest));
+    }
+}
diff --git a/src/main/java/com/prgmrs/voucher/dto/request/VoucherRequest.java b/src/main/java/com/prgmrs/voucher/dto/request/VoucherRequest.java
index 15441c7168..a0d6d236c6 100644
--- a/src/main/java/com/prgmrs/voucher/dto/request/VoucherRequest.java
+++ b/src/main/java/com/prgmrs/voucher/dto/request/VoucherRequest.java
@@ -1,5 +1,4 @@
 package com.prgmrs.voucher.dto.request;
 
 public record VoucherRequest(String discountType, String discountStringValue) {
-
 }
\ No newline at end of file
diff --git a/src/main/java/com/prgmrs/voucher/dto/request/VoucherSearchRequest.java b/src/main/java/com/prgmrs/voucher/dto/request/VoucherSearchRequest.java
new file mode 100644
index 0000000000..7494ff4c8b
--- /dev/null
+++ b/src/main/java/com/prgmrs/voucher/dto/request/VoucherSearchRequest.java
@@ -0,0 +1,19 @@
+package com.prgmrs.voucher.dto.request;
+
+import com.prgmrs.voucher.exception.WrongRangeFormatException;
+
+import java.time.LocalDateTime;
+
+public record VoucherSearchRequest(LocalDateTime startDate, LocalDateTime endDate, String discountType) {
+    public VoucherSearchRequest {
+        if (startDate == null) {
+            throw new WrongRangeFormatException("startDate cannot be null");
+        }
+        if (endDate == null) {
+            throw new WrongRangeFormatException("endDate cannot be null");
+        }
+        if (discountType == null || discountType.isBlank()) {
+            throw new WrongRangeFormatException("discountType cannot be null or blank");
+        }
+    }
+}
diff --git a/src/main/java/com/prgmrs/voucher/dto/response/RemoveResponse.java b/src/main/java/com/prgmrs/voucher/dto/response/RemoveResponse.java
new file mode 100644
index 0000000000..d11003127e
--- /dev/null
+++ b/src/main/java/com/prgmrs/voucher/dto/response/RemoveResponse.java
@@ -0,0 +1,4 @@
+package com.prgmrs.voucher.dto.response;
+
+public record RemoveResponse(int rowsDeleted) {
+}
diff --git a/src/main/java/com/prgmrs/voucher/dto/response/VoucherResponse.java b/src/main/java/com/prgmrs/voucher/dto/response/VoucherResponse.java
index 9d64f2fcf9..6a59605129 100644
--- a/src/main/java/com/prgmrs/voucher/dto/response/VoucherResponse.java
+++ b/src/main/java/com/prgmrs/voucher/dto/response/VoucherResponse.java
@@ -5,4 +5,4 @@
 import java.util.UUID;
 
 public record VoucherResponse(UUID voucherUuid, DiscountStrategy discountStrategy) {
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/prgmrs/voucher/enums/DiscountType.java b/src/main/java/com/prgmrs/voucher/enums/DiscountType.java
index e60785ba80..b1cba6c980 100644
--- a/src/main/java/com/prgmrs/voucher/enums/DiscountType.java
+++ b/src/main/java/com/prgmrs/voucher/enums/DiscountType.java
@@ -3,15 +3,15 @@
 import com.prgmrs.voucher.exception.WrongRangeFormatException;
 
 public enum DiscountType {
-    FIXED_AMOUNT_DISCOUNT("fixed", (short) 1),
-    PERCENT_DISCOUNT("percent", (short) 2);
+    FIXED_AMOUNT_DISCOUNT("fixed", 1),
+    PERCENT_DISCOUNT("percent", 2);
 
     private final String stringValue;
-    private final short shortValue;
+    private final int value;
 
-    DiscountType(String stringValue, short shortValue) {
+    DiscountType(String stringValue, int value) {
         this.stringValue = stringValue;
-        this.shortValue = shortValue;
+        this.value = value;
     }
 
     public static DiscountType fromString(String value) {
@@ -25,19 +25,23 @@ public static DiscountType fromString(String value) {
 
     public static DiscountType fromShort(short value) {
         for (DiscountType enumValue : DiscountType.values()) {
-            if (enumValue.shortValue == value) {
+            if (enumValue.value == value) {
                 return enumValue;
             }
         }
         throw new WrongRangeFormatException("no matching discount type from short");
     }
 
-    public static short toShortValue(String value) {
+    public static int fromEnumValueStringToValue(String value) {
         for (DiscountType enumValue : DiscountType.values()) {
             if (enumValue.name().equalsIgnoreCase(value)) {
-                return enumValue.shortValue;
+                return enumValue.value;
             }
         }
         throw new WrongRangeFormatException("no matching discount type from enum");
     }
+
+    public int getValue() {
+        return value;
+    }
 }
diff --git a/src/main/java/com/prgmrs/voucher/global/GlobalExceptionHandler.java b/src/main/java/com/prgmrs/voucher/global/GlobalExceptionHandler.java
new file mode 100644
index 0000000000..1902035c37
--- /dev/null
+++ b/src/main/java/com/prgmrs/voucher/global/GlobalExceptionHandler.java
@@ -0,0 +1,26 @@
+package com.prgmrs.voucher.global;
+
+import com.prgmrs.voucher.exception.NoSuchVoucherTypeException;
+import com.prgmrs.voucher.exception.WrongRangeFormatException;
+import org.springframework.dao.DataAccessException;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+
+@ControllerAdvice
+public class GlobalExceptionHandler {
+    @ExceptionHandler({WrongRangeFormatException.class, DataAccessException.class})
+    public ResponseEntity handleException(Exception e) {
+        return ResponseEntity.badRequest().body(e.getMessage());
+    }
+
+    @ExceptionHandler(NumberFormatException.class)
+    public ResponseEntity handleNumberFormatException(NumberFormatException e) {
+        return ResponseEntity.badRequest().body("invalid number was provided.");
+    }
+
+    @ExceptionHandler(NoSuchVoucherTypeException.class)
+    public ResponseEntity handleNoSuchVoucherTypeException(NoSuchVoucherTypeException e) {
+        return ResponseEntity.badRequest().body(e.getMessage());
+    }
+}
diff --git a/src/main/java/com/prgmrs/voucher/model/validator/VoucherValidator.java b/src/main/java/com/prgmrs/voucher/model/validator/VoucherValidator.java
index 5cc9a99b9a..da25ca53ff 100644
--- a/src/main/java/com/prgmrs/voucher/model/validator/VoucherValidator.java
+++ b/src/main/java/com/prgmrs/voucher/model/validator/VoucherValidator.java
@@ -23,6 +23,9 @@ public Long convertToLongWithValidation(String discountStringValue, DiscountType
     }
 
     private void isValidIntegerString(String discountStringValue) {
+        if (discountStringValue == null) {
+            throw new WrongRangeFormatException("discount value must be non-null value");
+        }
         Pattern pattern = Pattern.compile("^[-+]?\\d+$");
         if (!pattern.matcher(discountStringValue).matches()) {
             throw new WrongRangeFormatException("only digit are allowed");
@@ -30,6 +33,10 @@ private void isValidIntegerString(String discountStringValue) {
     }
 
     private void isAmountValid(long discountValue, DiscountType discountType) {
+        if (discountType == null) {
+            throw new WrongRangeFormatException("discountType should not be null");
+        }
+
         if (discountType == DiscountType.FIXED_AMOUNT_DISCOUNT
                 && (0 >= discountValue || discountValue > voucherProperties.getMaximumFixedAmount())) {
             throw new WrongRangeFormatException("amount should be between 0 to defined limit");
diff --git a/src/main/java/com/prgmrs/voucher/model/wrapper/Username.java b/src/main/java/com/prgmrs/voucher/model/wrapper/Username.java
index edbe596a94..2f9da61193 100644
--- a/src/main/java/com/prgmrs/voucher/model/wrapper/Username.java
+++ b/src/main/java/com/prgmrs/voucher/model/wrapper/Username.java
@@ -4,12 +4,16 @@
 
 public record Username(String value) {
     public Username {
+        if (value == null) {
+            throw new WrongRangeFormatException("input value null");
+        }
+
         if (!value.matches("^[a-zA-Z]+$")) { // "\\d+" matches a sequence of one or more digits
             throw new WrongRangeFormatException("username must contain only alphabets");
         }
 
-        if (value.length() > 255) {
-            throw new WrongRangeFormatException("length must be equal to or less than 255");
+        if (value.length() < 1 || value.length() > 255) {
+            throw new WrongRangeFormatException("length must be between 1 to 255");
         }
     }
 }
diff --git a/src/main/java/com/prgmrs/voucher/repository/JdbcVoucherRepository.java b/src/main/java/com/prgmrs/voucher/repository/JdbcVoucherRepository.java
index d766e92656..7f4c1771c6 100644
--- a/src/main/java/com/prgmrs/voucher/repository/JdbcVoucherRepository.java
+++ b/src/main/java/com/prgmrs/voucher/repository/JdbcVoucherRepository.java
@@ -14,6 +14,7 @@
 import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
 import org.springframework.stereotype.Repository;
 
+import java.time.LocalDateTime;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -62,13 +63,13 @@ public void save(Voucher voucher) {
         paramMap.put("voucherId", voucher.voucherId().toString());
 
         if (voucher.discountStrategy() instanceof FixedAmountDiscountStrategy fixedAmountDiscountStrategy) {
-            short discountType = DiscountType.toShortValue("FIXED_AMOUNT_DISCOUNT");
+            int discountType = DiscountType.fromEnumValueStringToValue("FIXED_AMOUNT_DISCOUNT");
             paramMap.put("discountType", discountType);
             paramMap.put("discountValue", fixedAmountDiscountStrategy.amount().value());
         }
 
         if (voucher.discountStrategy() instanceof PercentDiscountStrategy percentDiscountStrategy) {
-            short discountType = DiscountType.toShortValue("PERCENT_DISCOUNT");
+            int discountType = DiscountType.fromEnumValueStringToValue("PERCENT_DISCOUNT");
             paramMap.put("discountType", discountType);
             paramMap.put("discountValue", percentDiscountStrategy.percent().value());
         }
@@ -86,14 +87,14 @@ public List findAll() {
     @Override
     public List getAssignedVoucherListByUsername(Username username) {
         String sql = """
-                         SELECT
-                           v.voucher_id, v.discount_type, v.discount_value
-                         FROM `voucher` v
-                           INNER JOIN `wallet` w ON v.voucher_id = w.voucher_id
-                               INNER JOIN `user` u ON w.user_id = u.user_id
-                         WHERE  u.username = :username
-                           AND w.unassigned_time IS NULL
-                               ORDER BY v.created_at
+                     SELECT
+                         v.voucher_id, v.discount_type, v.discount_value
+                     FROM `voucher` v
+                         INNER JOIN `wallet` w ON v.voucher_id = w.voucher_id
+                         INNER JOIN `user` u ON w.user_id = u.user_id
+                     WHERE  u.username = :username
+                         AND w.unassigned_time IS NULL
+                     ORDER BY v.created_at
                 """;
 
         Map paramMap = new HashMap<>();
@@ -126,16 +127,61 @@ public List getNotAssignedVoucherList() {
                         LEFT JOIN `wallet` w ON v.voucher_id = w.voucher_id
                     WHERE w.voucher_id IS NULL
                         OR (v.voucher_id IN (SELECT
-                                                w.voucher_id
+                                                 w.voucher_id
                                              FROM `wallet` w
-                                                GROUP BY w.voucher_id
-                                                HAVING MAX(w.is_used) = 0
-                                                    AND MAX(CASE WHEN w.unassigned_time
-                                                                IS NULL THEN 1 ELSE 0 END) = 0
+                                             GROUP BY w.voucher_id
+                                                 HAVING MAX(w.is_used) = 0
+                                                     AND MAX(CASE WHEN w.unassigned_time IS NULL THEN 1 ELSE 0 END) = 0
                                             )
                             )
                 """;
 
         return jdbcTemplate.query(sql, toRowMapper());
     }
+
+    @Override
+    public List findByCreationTimeAndDiscountType(LocalDateTime startDate, LocalDateTime endDate, int discountType) {
+        String sql = """
+                       SELECT
+                           v.voucher_id, v.discount_type, v.discount_value
+                       FROM `voucher` v
+                       WHERE (v.discount_type = :discountType) 
+                           AND (v.created_at BETWEEN :startDate AND :endDate)
+                """;
+
+        Map paramMap = new HashMap<>();
+
+        paramMap.put("startDate", startDate);
+        paramMap.put("endDate", endDate);
+        paramMap.put("discountType", discountType);
+
+        return jdbcTemplate.query(sql, paramMap, toRowMapper());
+    }
+
+    @Override
+    public int removeVoucher(UUID voucherUUID) {
+        String sql = "DELETE FROM `voucher` v WHERE v.voucher_id = :voucherId";
+
+        Map paramMap = new HashMap<>();
+
+        paramMap.put("voucherId", voucherUUID.toString());
+
+        return jdbcTemplate.update(sql, paramMap);
+    }
+
+    @Override
+    public Voucher findById(UUID voucherUUID) {
+        String sql = """
+                       SELECT
+                           v.voucher_id, v.discount_type, v.discount_value
+                       FROM `voucher` v
+                       WHERE v.voucher_id = :voucherId
+                """;
+
+        Map paramMap = new HashMap<>();
+
+        paramMap.put("voucherId", voucherUUID.toString());
+
+        return jdbcTemplate.queryForObject(sql, paramMap, toRowMapper());
+    }
 }
diff --git a/src/main/java/com/prgmrs/voucher/repository/VoucherRepository.java b/src/main/java/com/prgmrs/voucher/repository/VoucherRepository.java
index a0005f8b3e..ee9ef701d4 100644
--- a/src/main/java/com/prgmrs/voucher/repository/VoucherRepository.java
+++ b/src/main/java/com/prgmrs/voucher/repository/VoucherRepository.java
@@ -3,7 +3,9 @@
 import com.prgmrs.voucher.model.Voucher;
 import com.prgmrs.voucher.model.wrapper.Username;
 
+import java.time.LocalDateTime;
 import java.util.List;
+import java.util.UUID;
 
 public interface VoucherRepository {
     void save(Voucher voucher);
@@ -15,4 +17,10 @@ public interface VoucherRepository {
     List getNotAssignedVoucherList();
 
     List getAssignedVoucherList();
+
+    List findByCreationTimeAndDiscountType(LocalDateTime startDate, LocalDateTime endDate, int discountType);
+
+    int removeVoucher(UUID voucherUUID);
+
+    Voucher findById(UUID voucherUUID);
 }
diff --git a/src/main/java/com/prgmrs/voucher/service/UserService.java b/src/main/java/com/prgmrs/voucher/service/UserService.java
index 3709191055..d67622fa5d 100644
--- a/src/main/java/com/prgmrs/voucher/service/UserService.java
+++ b/src/main/java/com/prgmrs/voucher/service/UserService.java
@@ -7,8 +7,8 @@
 import com.prgmrs.voucher.model.User;
 import com.prgmrs.voucher.model.wrapper.Username;
 import com.prgmrs.voucher.repository.UserRepository;
-import com.prgmrs.voucher.util.UUIDGenerator;
-import com.prgmrs.voucher.util.UuidConverter;
+import com.prgmrs.voucher.util.IdGenerator;
+import com.prgmrs.voucher.util.UUIDConverter;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -17,13 +17,15 @@
 @Service
 public class UserService {
     private final UserRepository userRepository;
+    private final IdGenerator idGenerator;
 
-    public UserService(UserRepository userRepository) {
+    public UserService(UserRepository userRepository, IdGenerator idGenerator) {
         this.userRepository = userRepository;
+        this.idGenerator = idGenerator;
     }
 
     public UserResponse createUser(UserRequest userRequest) { // 유저 생성
-        UUID uuid = UUIDGenerator.generateUUID();
+        UUID uuid = idGenerator.generate();
         User user = new User(uuid, new Username(userRequest.username()));
         userRepository.save(user);
 
@@ -41,7 +43,7 @@ public UserListResponse getUserListWithVoucherAssigned() {
     }
 
     public UserResponse getUserByVoucherId(VoucherIdRequest voucherIdRequest) {
-        UUID uuid = UuidConverter.fromString(voucherIdRequest.voucherUuid());
+        UUID uuid = UUIDConverter.fromString(voucherIdRequest.voucherUuid());
         User user = userRepository.getUserByVoucherId(uuid);
 
         return new UserResponse(user.userId(), user.username().value());
diff --git a/src/main/java/com/prgmrs/voucher/service/VoucherService.java b/src/main/java/com/prgmrs/voucher/service/VoucherService.java
index e220be247b..a78f4cb07b 100644
--- a/src/main/java/com/prgmrs/voucher/service/VoucherService.java
+++ b/src/main/java/com/prgmrs/voucher/service/VoucherService.java
@@ -1,7 +1,10 @@
 package com.prgmrs.voucher.service;
 
 import com.prgmrs.voucher.dto.request.UsernameRequest;
+import com.prgmrs.voucher.dto.request.VoucherIdRequest;
 import com.prgmrs.voucher.dto.request.VoucherRequest;
+import com.prgmrs.voucher.dto.request.VoucherSearchRequest;
+import com.prgmrs.voucher.dto.response.RemoveResponse;
 import com.prgmrs.voucher.dto.response.VoucherListResponse;
 import com.prgmrs.voucher.dto.response.VoucherResponse;
 import com.prgmrs.voucher.enums.DiscountType;
@@ -14,19 +17,22 @@
 import com.prgmrs.voucher.model.wrapper.Percent;
 import com.prgmrs.voucher.model.wrapper.Username;
 import com.prgmrs.voucher.repository.VoucherRepository;
-import com.prgmrs.voucher.util.UUIDGenerator;
+import com.prgmrs.voucher.util.IdGenerator;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
 import java.util.UUID;
 
 @Service
 public class VoucherService {
     private final VoucherRepository voucherRepository;
     private final VoucherValidator voucherValidator;
+    private final IdGenerator idGenerator;
 
-    public VoucherService(VoucherRepository voucherRepository, VoucherValidator voucherValidator) {
+    public VoucherService(VoucherRepository voucherRepository, VoucherValidator voucherValidator, IdGenerator idGenerator) {
         this.voucherRepository = voucherRepository;
         this.voucherValidator = voucherValidator;
+        this.idGenerator = idGenerator;
     }
 
     public VoucherResponse createVoucher(VoucherRequest voucherRequest) {
@@ -34,7 +40,7 @@ public VoucherResponse createVoucher(VoucherRequest voucherRequest) {
         Long validatedLongValue =
                 voucherValidator.convertToLongWithValidation(voucherRequest.discountStringValue(), discountType);
 
-        UUID uuid = UUIDGenerator.generateUUID();
+        UUID uuid = idGenerator.generate();
         Voucher voucher;
 
         switch (discountType) {
@@ -72,4 +78,22 @@ public VoucherListResponse getNotAssignedVoucher() {
     public VoucherListResponse getAssignedVoucherList() {
         return new VoucherListResponse(voucherRepository.getAssignedVoucherList());
     }
+
+    public VoucherListResponse findByCreationTimeAndDiscountType(VoucherSearchRequest voucherSearchRequest) {
+        LocalDateTime startDate = voucherSearchRequest.startDate();
+        LocalDateTime endDate = voucherSearchRequest.endDate();
+        DiscountType discountType = DiscountType.fromString(voucherSearchRequest.discountType());
+        return new VoucherListResponse(voucherRepository.findByCreationTimeAndDiscountType(startDate, endDate, discountType.getValue()));
+    }
+
+    public RemoveResponse removeVoucher(VoucherIdRequest voucherIdRequest) {
+        UUID uuid = UUID.fromString(voucherIdRequest.voucherUuid());
+        return new RemoveResponse(voucherRepository.removeVoucher(uuid));
+    }
+
+    public VoucherResponse findById(VoucherIdRequest voucherIdRequest) {
+        UUID uuid = UUID.fromString(voucherIdRequest.voucherUuid());
+        Voucher voucher = voucherRepository.findById(uuid);
+        return new VoucherResponse(voucher.voucherId(), voucher.discountStrategy());
+    }
 }
diff --git a/src/main/java/com/prgmrs/voucher/service/WalletService.java b/src/main/java/com/prgmrs/voucher/service/WalletService.java
index fb618d2c03..615c91b000 100644
--- a/src/main/java/com/prgmrs/voucher/service/WalletService.java
+++ b/src/main/java/com/prgmrs/voucher/service/WalletService.java
@@ -8,7 +8,7 @@
 import com.prgmrs.voucher.model.wrapper.Username;
 import com.prgmrs.voucher.repository.UserRepository;
 import com.prgmrs.voucher.repository.WalletRepository;
-import com.prgmrs.voucher.util.UuidConverter;
+import com.prgmrs.voucher.util.UUIDConverter;
 import org.springframework.stereotype.Service;
 
 import java.util.UUID;
@@ -25,14 +25,14 @@ public WalletService(UserRepository userRepository, WalletRepository walletRepos
 
     public WalletResponse assignVoucher(AssignVoucherRequest assignVoucherRequest) {
         User user = userRepository.findByUsername(new Username(assignVoucherRequest.username()));
-        Wallet wallet = new Wallet(user.userId(), UuidConverter.fromString(assignVoucherRequest.voucherUuid()));
+        Wallet wallet = new Wallet(user.userId(), UUIDConverter.fromString(assignVoucherRequest.voucherUuid()));
         walletRepository.save(wallet);
 
         return new WalletResponse(wallet.voucherId(), user.username().value());
     }
 
     public WalletResponse removeVoucher(RemoveVoucherRequest removeVoucherRequest) {
-        UUID convertedUuid = UuidConverter.fromString(removeVoucherRequest.voucherUuid());
+        UUID convertedUuid = UUIDConverter.fromString(removeVoucherRequest.voucherUuid());
         User user = userRepository.getUserByVoucherId(convertedUuid);
         Wallet wallet = new Wallet(user.userId(), convertedUuid);
         walletRepository.remove(wallet);
diff --git a/src/main/java/com/prgmrs/voucher/util/IdGenerator.java b/src/main/java/com/prgmrs/voucher/util/IdGenerator.java
new file mode 100644
index 0000000000..eb38eb11b1
--- /dev/null
+++ b/src/main/java/com/prgmrs/voucher/util/IdGenerator.java
@@ -0,0 +1,8 @@
+package com.prgmrs.voucher.util;
+
+import java.util.UUID;
+
+public interface IdGenerator {
+
+    UUID generate();
+}
diff --git a/src/main/java/com/prgmrs/voucher/util/UuidConverter.java b/src/main/java/com/prgmrs/voucher/util/UUIDConverter.java
similarity index 75%
rename from src/main/java/com/prgmrs/voucher/util/UuidConverter.java
rename to src/main/java/com/prgmrs/voucher/util/UUIDConverter.java
index 8503499d43..fff7295bb0 100644
--- a/src/main/java/com/prgmrs/voucher/util/UuidConverter.java
+++ b/src/main/java/com/prgmrs/voucher/util/UUIDConverter.java
@@ -1,12 +1,15 @@
 package com.prgmrs.voucher.util;
 
 import com.prgmrs.voucher.exception.WrongRangeFormatException;
-import org.springframework.stereotype.Component;
 
 import java.util.UUID;
 
-@Component
-public class UuidConverter {
+public class UUIDConverter {
+
+    private UUIDConverter() {
+        throw new IllegalStateException("Util class");
+    }
+
     public static UUID fromString(String uuidString) {
         try {
             return UUID.fromString(uuidString);
diff --git a/src/main/java/com/prgmrs/voucher/util/UUIDGenerator.java b/src/main/java/com/prgmrs/voucher/util/UUIDGenerator.java
index 1517a46692..769d4561c8 100644
--- a/src/main/java/com/prgmrs/voucher/util/UUIDGenerator.java
+++ b/src/main/java/com/prgmrs/voucher/util/UUIDGenerator.java
@@ -5,8 +5,8 @@
 import java.util.UUID;
 
 @Component
-public class UUIDGenerator {
-    public static UUID generateUUID() {
+public class UUIDGenerator implements IdGenerator {
+    public UUID generate() {
         return UUID.randomUUID();
     }
 }
diff --git a/src/main/java/com/prgmrs/voucher/view/io/ConsoleMessage.java b/src/main/java/com/prgmrs/voucher/view/io/ConsoleMessage.java
index f12e632d37..bd0082b1aa 100644
--- a/src/main/java/com/prgmrs/voucher/view/io/ConsoleMessage.java
+++ b/src/main/java/com/prgmrs/voucher/view/io/ConsoleMessage.java
@@ -10,9 +10,11 @@ public enum ConsoleMessage {
     ConsoleMessage(String message) {
         this.message = message;
     }
+
     public String getValue() {
         return message;
     }
+
     @Override
     public String toString() {
         return this.message;
diff --git a/src/main/java/com/prgmrs/voucher/view/io/ConsoleWriter.java b/src/main/java/com/prgmrs/voucher/view/io/ConsoleWriter.java
index f4e4af79d8..b2d61e6b1d 100644
--- a/src/main/java/com/prgmrs/voucher/view/io/ConsoleWriter.java
+++ b/src/main/java/com/prgmrs/voucher/view/io/ConsoleWriter.java
@@ -1,6 +1,6 @@
 package com.prgmrs.voucher.view.io;
 
-import com.prgmrs.voucher.dto.ResponseDTO;
+import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO;
 import org.springframework.stereotype.Component;
 
 @Component
@@ -11,7 +11,7 @@ public  void write(T message) {
 
     public void showManagementType() {
         for (ManagementType type : ManagementType.values()) {
-            write(type.getValue());
+            write(type.getMessage());
         }
     }
 
diff --git a/src/main/java/com/prgmrs/voucher/view/io/ManagementType.java b/src/main/java/com/prgmrs/voucher/view/io/ManagementType.java
index 030acfa2b8..6e497a9bd2 100644
--- a/src/main/java/com/prgmrs/voucher/view/io/ManagementType.java
+++ b/src/main/java/com/prgmrs/voucher/view/io/ManagementType.java
@@ -14,25 +14,25 @@ public enum ManagementType {
     SHOW_VOUCHER_OWNER("Type '8' to show the owner of specific voucher."),
     SHOW_BLACKLIST("Type '9' to print out the blacklist.");
 
-    private final String value;
+    private final String message;
 
-    ManagementType(String value) {
-        this.value = value;
+    ManagementType(String message) {
+        this.message = message;
     }
 
-    public static ManagementType of(String value) {
-        try {
-            int convertedValue = Integer.parseInt(value);
-            if (convertedValue >= 0 && convertedValue < ManagementType.values().length) {
-                return ManagementType.values()[convertedValue];
-            }
-            throw new WrongRangeFormatException("no such option exists");
-        } catch (NumberFormatException e) {
-            throw new WrongRangeFormatException("input must be number");
+    public static ManagementType of(String orderNumberAsString) {
+        int orderNumber = Integer.parseInt(orderNumberAsString);
+        if (isWithinOrderNumberRange(orderNumber)) {
+            return ManagementType.values()[orderNumber];
         }
+        throw new WrongRangeFormatException("no such option exists");
     }
 
-    public String getValue() {
-        return value;
+    private static boolean isWithinOrderNumberRange(int orderNumber) {
+        return orderNumber >= 0 && orderNumber < ManagementType.values().length;
+    }
+
+    public String getMessage() {
+        return message;
     }
 }
diff --git a/src/main/resources/VoucherMgmtDDL.sql b/src/main/resources/VoucherMgmtDDL.sql
index 246de9fbb3..a2556b5390 100644
--- a/src/main/resources/VoucherMgmtDDL.sql
+++ b/src/main/resources/VoucherMgmtDDL.sql
@@ -23,7 +23,7 @@ CREATE TABLE `wallet`
 (
     `voucher_id`      CHAR(36) NOT NULL,
     `user_id`         CHAR(36) NOT NULL,
-    `assigned_time`   TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+    `assigned_time`   TIMESTAMP         DEFAULT CURRENT_TIMESTAMP,
     `unassigned_time` TIMESTAMP,
     `is_used`         BOOLEAN  NOT NULL DEFAULT 0,
     PRIMARY KEY (`voucher_id`, `user_id`, `assigned_time`),
diff --git a/src/main/resources/templates/voucher-create.html b/src/main/resources/templates/voucher-create.html
new file mode 100644
index 0000000000..0626f6aee0
--- /dev/null
+++ b/src/main/resources/templates/voucher-create.html
@@ -0,0 +1,22 @@
+
+
+
+    Create Voucher
+
+
+Create Voucher
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/templates/voucher-list.html b/src/main/resources/templates/voucher-list.html
new file mode 100644
index 0000000000..8474d4f4b8
--- /dev/null
+++ b/src/main/resources/templates/voucher-list.html
@@ -0,0 +1,30 @@
+
+
+
+    Voucher List
+    
+
+
+Voucher List
+
+    
+        | No. | 
+        voucher ID | 
+        DiscountType and Value | 
+    
+    
+        | 
+         |  | 
+         | 
+    
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/templates/voucher-main.html b/src/main/resources/templates/voucher-main.html
new file mode 100644
index 0000000000..d66e752ffc
--- /dev/null
+++ b/src/main/resources/templates/voucher-main.html
@@ -0,0 +1,21 @@
+
+
+
+    Main Page
+
+
+Voucher Management System
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/templates/voucher-remove.html b/src/main/resources/templates/voucher-remove.html
new file mode 100644
index 0000000000..d4fcaa7a99
--- /dev/null
+++ b/src/main/resources/templates/voucher-remove.html
@@ -0,0 +1,32 @@
+
+
+
+
+    Delete Voucher
+    
+
+
+Delete Voucher
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/templates/voucher-request-success.html b/src/main/resources/templates/voucher-request-success.html
new file mode 100644
index 0000000000..262df20343
--- /dev/null
+++ b/src/main/resources/templates/voucher-request-success.html
@@ -0,0 +1,12 @@
+
+
+
+    Request Successful
+
+
+Success!
+
+
+
diff --git a/src/test/java/com/prgmrs/voucher/VoucherApplicationTests.java b/src/test/java/com/prgmrs/voucher/VoucherApplicationTests.java
index d3297eefab..d238dd4355 100644
--- a/src/test/java/com/prgmrs/voucher/VoucherApplicationTests.java
+++ b/src/test/java/com/prgmrs/voucher/VoucherApplicationTests.java
@@ -6,5 +6,6 @@
 @SpringBootTest
 class VoucherApplicationTests {
     @Autowired
-    VoucherApplicationTests() {}
+    VoucherApplicationTests() {
+    }
 }
diff --git a/src/test/java/com/prgmrs/voucher/controller/UserControllerTest.java b/src/test/java/com/prgmrs/voucher/controller/UserControllerTest.java
index 12a0bfc565..9c23c61e29 100644
--- a/src/test/java/com/prgmrs/voucher/controller/UserControllerTest.java
+++ b/src/test/java/com/prgmrs/voucher/controller/UserControllerTest.java
@@ -1,6 +1,7 @@
 package com.prgmrs.voucher.controller;
 
-import com.prgmrs.voucher.dto.ResponseDTO;
+import com.prgmrs.voucher.controller.console.UserController;
+import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO;
 import com.prgmrs.voucher.dto.request.UserRequest;
 import com.prgmrs.voucher.dto.request.VoucherIdRequest;
 import com.prgmrs.voucher.dto.response.UserListResponse;
@@ -8,7 +9,6 @@
 import com.prgmrs.voucher.model.User;
 import com.prgmrs.voucher.model.wrapper.Username;
 import com.prgmrs.voucher.service.UserService;
-import com.prgmrs.voucher.util.UUIDGenerator;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
@@ -40,13 +40,13 @@ class UserControllerTest {
     void setUp() {
         MockitoAnnotations.openMocks(this);
 
-        UUID uuidTyler = UUIDGenerator.generateUUID();
+        UUID uuidTyler = UUID.randomUUID();
         User userTyler = new User(uuidTyler, new Username("tyler"));
         userRequest = new UserRequest(userTyler.username().value());
         userResponse = new UserResponse(uuidTyler, userTyler.username().value());
 
 
-        UUID uuidJohn = UUIDGenerator.generateUUID();
+        UUID uuidJohn = UUID.randomUUID();
         User userJohn = new User(uuidJohn, new Username("john"));
         userListResponse = new UserListResponse(Arrays.asList(userTyler, userJohn));
     }
@@ -94,7 +94,7 @@ void GetUserListWithVoucherAssigned_NoParam_SameUserListResponse() {
     @DisplayName("바우처 아이디에 해당하는 유저를 불러온다.")
     void GetUserByVoucherId_userListRequest_SameUserResponse() {
         // Given
-        UUID voucherUuid = UUIDGenerator.generateUUID();
+        UUID voucherUuid = UUID.randomUUID();
         voucherIdRequest = new VoucherIdRequest(voucherUuid.toString());
         given(userService.getUserByVoucherId(voucherIdRequest)).willReturn(userResponse);
 
diff --git a/src/test/java/com/prgmrs/voucher/controller/VoucherControllerTest.java b/src/test/java/com/prgmrs/voucher/controller/VoucherJsonControllerTest.java
similarity index 93%
rename from src/test/java/com/prgmrs/voucher/controller/VoucherControllerTest.java
rename to src/test/java/com/prgmrs/voucher/controller/VoucherJsonControllerTest.java
index 76393cde3a..4e94f45288 100644
--- a/src/test/java/com/prgmrs/voucher/controller/VoucherControllerTest.java
+++ b/src/test/java/com/prgmrs/voucher/controller/VoucherJsonControllerTest.java
@@ -1,6 +1,7 @@
 package com.prgmrs.voucher.controller;
 
-import com.prgmrs.voucher.dto.ResponseDTO;
+import com.prgmrs.voucher.controller.console.VoucherController;
+import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO;
 import com.prgmrs.voucher.dto.request.UsernameRequest;
 import com.prgmrs.voucher.dto.request.VoucherRequest;
 import com.prgmrs.voucher.dto.response.VoucherListResponse;
@@ -11,7 +12,6 @@
 import com.prgmrs.voucher.model.wrapper.Amount;
 import com.prgmrs.voucher.model.wrapper.Percent;
 import com.prgmrs.voucher.service.VoucherService;
-import com.prgmrs.voucher.util.UUIDGenerator;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
@@ -26,7 +26,7 @@
 import static org.mockito.BDDMockito.given;
 
 @DisplayName("바우처 컨트롤러 레이어를 테스트한다.")
-class VoucherControllerTest {
+class VoucherJsonControllerTest {
 
     @InjectMocks
     VoucherController voucherController;
@@ -43,13 +43,13 @@ void setUp() {
         MockitoAnnotations.openMocks(this);
 
         PercentDiscountStrategy percentDiscountStrategy = new PercentDiscountStrategy(new Percent(10));
-        UUID voucherUuid1 = UUIDGenerator.generateUUID();
+        UUID voucherUuid1 = UUID.randomUUID();
         Voucher voucher1 = new Voucher(voucherUuid1, percentDiscountStrategy);
         voucherRequest = new VoucherRequest("percent", "10");
         voucherResponse = new VoucherResponse(voucherUuid1, percentDiscountStrategy);
 
         FixedAmountDiscountStrategy fixedAmountDiscountStrategy = new FixedAmountDiscountStrategy(new Amount(300));
-        UUID voucherUuid2 = UUIDGenerator.generateUUID();
+        UUID voucherUuid2 = UUID.randomUUID();
         Voucher voucher2 = new Voucher(voucherUuid2, fixedAmountDiscountStrategy);
         voucherListResponse = new VoucherListResponse(Arrays.asList(voucher1, voucher2));
     }
diff --git a/src/test/java/com/prgmrs/voucher/controller/WalletControllerTest.java b/src/test/java/com/prgmrs/voucher/controller/WalletControllerTest.java
index fe4598aa2c..e5d9ea699e 100644
--- a/src/test/java/com/prgmrs/voucher/controller/WalletControllerTest.java
+++ b/src/test/java/com/prgmrs/voucher/controller/WalletControllerTest.java
@@ -1,11 +1,11 @@
 package com.prgmrs.voucher.controller;
 
-import com.prgmrs.voucher.dto.ResponseDTO;
+import com.prgmrs.voucher.controller.console.WalletController;
+import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO;
 import com.prgmrs.voucher.dto.request.AssignVoucherRequest;
 import com.prgmrs.voucher.dto.request.RemoveVoucherRequest;
 import com.prgmrs.voucher.dto.response.WalletResponse;
 import com.prgmrs.voucher.service.WalletService;
-import com.prgmrs.voucher.util.UUIDGenerator;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
@@ -37,7 +37,7 @@ void setUp() {
 
         String username = "tyler";
 
-        UUID voucherUuid = UUIDGenerator.generateUUID();
+        UUID voucherUuid = UUID.randomUUID();
         String voucherUuidString = voucherUuid.toString();
 
         assignVoucherRequest = new AssignVoucherRequest(username, voucherUuidString);
diff --git a/src/test/java/com/prgmrs/voucher/model/FixedAmountVoucherTest.java b/src/test/java/com/prgmrs/voucher/model/FixedAmountVoucherTest.java
index 6b9f81d6bf..9ad7348cd1 100644
--- a/src/test/java/com/prgmrs/voucher/model/FixedAmountVoucherTest.java
+++ b/src/test/java/com/prgmrs/voucher/model/FixedAmountVoucherTest.java
@@ -3,7 +3,6 @@
 import com.prgmrs.voucher.model.strategy.FixedAmountDiscountStrategy;
 import com.prgmrs.voucher.model.wrapper.Amount;
 import com.prgmrs.voucher.model.wrapper.DiscountValue;
-import com.prgmrs.voucher.util.UUIDGenerator;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
@@ -22,7 +21,7 @@ class FixedAmountVoucherTest {
 
     @BeforeEach
     void setUp() {
-        voucherId = UUIDGenerator.generateUUID();
+        voucherId = UUID.randomUUID();
         amount = new Amount(500);
         fixedAmountDiscountStrategy = new FixedAmountDiscountStrategy(amount);
     }
diff --git a/src/test/java/com/prgmrs/voucher/model/PercentDiscountVoucherTest.java b/src/test/java/com/prgmrs/voucher/model/PercentDiscountVoucherTest.java
index 2d04b9eefa..69352d0438 100644
--- a/src/test/java/com/prgmrs/voucher/model/PercentDiscountVoucherTest.java
+++ b/src/test/java/com/prgmrs/voucher/model/PercentDiscountVoucherTest.java
@@ -4,7 +4,6 @@
 import com.prgmrs.voucher.model.strategy.PercentDiscountStrategy;
 import com.prgmrs.voucher.model.wrapper.DiscountValue;
 import com.prgmrs.voucher.model.wrapper.Percent;
-import com.prgmrs.voucher.util.UUIDGenerator;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
@@ -23,7 +22,7 @@ class PercentDiscountVoucherTest {
 
     @BeforeEach
     void setUp() {
-        voucherId = UUIDGenerator.generateUUID();
+        voucherId = UUID.randomUUID();
         percent = new Percent(50);
         percentDiscountStrategy = new PercentDiscountStrategy(percent);
     }
diff --git a/src/test/java/com/prgmrs/voucher/repository/JdbcUserRepositoryTest.java b/src/test/java/com/prgmrs/voucher/repository/JdbcUserRepositoryTest.java
index 712ae5d3fb..62197cd6c3 100644
--- a/src/test/java/com/prgmrs/voucher/repository/JdbcUserRepositoryTest.java
+++ b/src/test/java/com/prgmrs/voucher/repository/JdbcUserRepositoryTest.java
@@ -8,7 +8,6 @@
 import com.prgmrs.voucher.model.wrapper.Amount;
 import com.prgmrs.voucher.model.wrapper.Percent;
 import com.prgmrs.voucher.model.wrapper.Username;
-import com.prgmrs.voucher.util.UUIDGenerator;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
@@ -51,10 +50,10 @@ class JdbcUserRepositoryTest {
 
     @BeforeEach
     void setUp() {
-        uuidTyler = UUIDGenerator.generateUUID();
+        uuidTyler = UUID.randomUUID();
         usernameTyler = new Username("tyler");
 
-        uuidEmma = UUIDGenerator.generateUUID();
+        uuidEmma = UUID.randomUUID();
         usernameEmma = new Username("emma");
 
         UUID voucherUuid1 = UUID.randomUUID();
diff --git a/src/test/java/com/prgmrs/voucher/repository/JdbcVoucherRepositoryTest.java b/src/test/java/com/prgmrs/voucher/repository/JdbcVoucherRepositoryTest.java
index 43871f50bb..1b56767efb 100644
--- a/src/test/java/com/prgmrs/voucher/repository/JdbcVoucherRepositoryTest.java
+++ b/src/test/java/com/prgmrs/voucher/repository/JdbcVoucherRepositoryTest.java
@@ -8,7 +8,6 @@
 import com.prgmrs.voucher.model.wrapper.Amount;
 import com.prgmrs.voucher.model.wrapper.Percent;
 import com.prgmrs.voucher.model.wrapper.Username;
-import com.prgmrs.voucher.util.UUIDGenerator;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
@@ -53,15 +52,15 @@ class JdbcVoucherRepositoryTest {
 
     @BeforeEach
     void setUp() {
-        voucherUuid1 = UUIDGenerator.generateUUID();
+        voucherUuid1 = UUID.randomUUID();
         Amount amount = new Amount(500);
         fixedAmountDiscountStrategy = new FixedAmountDiscountStrategy(amount);
 
-        voucherUuid2 = UUIDGenerator.generateUUID();
+        voucherUuid2 = UUID.randomUUID();
         Percent percent = new Percent(30);
         percentDiscountStrategy = new PercentDiscountStrategy(percent);
 
-        uuidTyler = UUIDGenerator.generateUUID();
+        uuidTyler = UUID.randomUUID();
         usernameTyler = new Username("tyler");
         userTyler = new User(uuidTyler, usernameTyler);
         userRepository.save(userTyler);
diff --git a/src/test/java/com/prgmrs/voucher/repository/JdbcWalletRepositoryTest.java b/src/test/java/com/prgmrs/voucher/repository/JdbcWalletRepositoryTest.java
index e085ed6899..4bb5448545 100644
--- a/src/test/java/com/prgmrs/voucher/repository/JdbcWalletRepositoryTest.java
+++ b/src/test/java/com/prgmrs/voucher/repository/JdbcWalletRepositoryTest.java
@@ -6,7 +6,6 @@
 import com.prgmrs.voucher.model.strategy.FixedAmountDiscountStrategy;
 import com.prgmrs.voucher.model.wrapper.Amount;
 import com.prgmrs.voucher.model.wrapper.Username;
-import com.prgmrs.voucher.util.UUIDGenerator;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
@@ -45,10 +44,10 @@ class JdbcWalletRepositoryTest {
 
     @BeforeEach
     void setUp() {
-        UUID uuidTyler = UUIDGenerator.generateUUID();
+        UUID uuidTyler = UUID.randomUUID();
         userTyler = new User(uuidTyler, new Username("tyler"));
 
-        UUID voucherUuid = UUIDGenerator.generateUUID();
+        UUID voucherUuid = UUID.randomUUID();
         Amount amount = new Amount(500);
         FixedAmountDiscountStrategy discountStrategy = new FixedAmountDiscountStrategy(amount);
         voucherWithFixedAmountOf500 = new Voucher(voucherUuid, discountStrategy);
diff --git a/src/test/java/com/prgmrs/voucher/service/UserServiceTest.java b/src/test/java/com/prgmrs/voucher/service/UserServiceTest.java
index 8eb7d03312..081b018939 100644
--- a/src/test/java/com/prgmrs/voucher/service/UserServiceTest.java
+++ b/src/test/java/com/prgmrs/voucher/service/UserServiceTest.java
@@ -7,7 +7,6 @@
 import com.prgmrs.voucher.model.User;
 import com.prgmrs.voucher.model.wrapper.Username;
 import com.prgmrs.voucher.repository.UserRepository;
-import com.prgmrs.voucher.util.UUIDGenerator;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
@@ -41,11 +40,11 @@ class UserServiceTest {
     void setUp() {
         MockitoAnnotations.openMocks(this);
 
-        UUID userUuidTyler = UUIDGenerator.generateUUID();
+        UUID userUuidTyler = UUID.randomUUID();
         Username usernameTyler = new Username("tyler");
         userTyler = new User(userUuidTyler, usernameTyler);
 
-        UUID userUuidEmma = UUIDGenerator.generateUUID();
+        UUID userUuidEmma = UUID.randomUUID();
         Username usernameEmma = new Username("emma");
         userEmma = new User(userUuidEmma, usernameEmma);
     }
@@ -107,7 +106,7 @@ void GetUserListWithVoucherAssigned_NoParam_UserListResponseSameAsGivenUsers() {
     @DisplayName("바우처 번호에 해당하는 유저를 조회한다.")
     void GetUserByVoucherId_UserListRequest_UserResponseSameAsGivenUser() {
         // Given
-        UUID voucherUUID = UUIDGenerator.generateUUID();
+        UUID voucherUUID = UUID.randomUUID();
         VoucherIdRequest voucherIdRequest = new VoucherIdRequest(voucherUUID.toString());
         given(userRepository.getUserByVoucherId(voucherUUID)).willReturn(userTyler);
 
diff --git a/src/test/java/com/prgmrs/voucher/service/VoucherServiceTest.java b/src/test/java/com/prgmrs/voucher/service/VoucherServiceTest.java
index 9a4bff7a93..d416dd9cf8 100644
--- a/src/test/java/com/prgmrs/voucher/service/VoucherServiceTest.java
+++ b/src/test/java/com/prgmrs/voucher/service/VoucherServiceTest.java
@@ -12,7 +12,6 @@
 import com.prgmrs.voucher.model.wrapper.Amount;
 import com.prgmrs.voucher.model.wrapper.Username;
 import com.prgmrs.voucher.repository.VoucherRepository;
-import com.prgmrs.voucher.util.UUIDGenerator;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
@@ -49,12 +48,12 @@ class VoucherServiceTest {
     void setUp() {
         MockitoAnnotations.openMocks(this);
 
-        UUID voucherUuid1 = UUIDGenerator.generateUUID();
+        UUID voucherUuid1 = UUID.randomUUID();
         Amount amount1 = new Amount(300);
         FixedAmountDiscountStrategy discountStrategy1 = new FixedAmountDiscountStrategy(amount1);
         voucherFixedAmountOf300 = new Voucher(voucherUuid1, discountStrategy1);
 
-        UUID voucherUuid2 = UUIDGenerator.generateUUID();
+        UUID voucherUuid2 = UUID.randomUUID();
         Amount amount2 = new Amount(200);
         FixedAmountDiscountStrategy discountStrategy2 = new FixedAmountDiscountStrategy(amount2);
         voucherFixedAmountOf200 = new Voucher(voucherUuid2, discountStrategy2);
diff --git a/src/test/java/com/prgmrs/voucher/service/WalletServiceTest.java b/src/test/java/com/prgmrs/voucher/service/WalletServiceTest.java
index 19f5c23abd..dd8da42b76 100644
--- a/src/test/java/com/prgmrs/voucher/service/WalletServiceTest.java
+++ b/src/test/java/com/prgmrs/voucher/service/WalletServiceTest.java
@@ -8,7 +8,6 @@
 import com.prgmrs.voucher.model.wrapper.Username;
 import com.prgmrs.voucher.repository.UserRepository;
 import com.prgmrs.voucher.repository.WalletRepository;
-import com.prgmrs.voucher.util.UUIDGenerator;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
@@ -44,9 +43,9 @@ class WalletServiceTest {
     void setUp() {
         MockitoAnnotations.openMocks(this);
 
-        voucherUUID = UUIDGenerator.generateUUID();
+        voucherUUID = UUID.randomUUID();
 
-        UUID userUUID = UUIDGenerator.generateUUID();
+        UUID userUUID = UUID.randomUUID();
         username = new Username("tyler");
         user = new User(userUUID, username);
     }
diff --git a/src/test/resources/VoucherMgmtDDL-test.sql b/src/test/resources/VoucherMgmtDDL-test.sql
index f08d67a52e..fa3bc55b9f 100644
--- a/src/test/resources/VoucherMgmtDDL-test.sql
+++ b/src/test/resources/VoucherMgmtDDL-test.sql
@@ -19,7 +19,7 @@ CREATE TABLE `wallet`
 (
     `voucher_id`      CHAR(36) NOT NULL,
     `user_id`         CHAR(36) NOT NULL,
-    `assigned_time`   TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+    `assigned_time`   TIMESTAMP         DEFAULT CURRENT_TIMESTAMP,
     `unassigned_time` TIMESTAMP,
     `is_used`         TINYINT  NOT NULL DEFAULT 0,
     PRIMARY KEY (`voucher_id`, `user_id`, `assigned_time`),