{"info":{"_postman_id":"eeb40040-ade6-4cd6-890a-b55941f69bf9","name":"커피 주문 시스템","description":"<html><head></head><body><h2 id=\"1-erd\">1. ERD</h2>\n<img src=\"https://content.pstmn.io/7c4c7d51-552c-41ef-ad99-9ff6553120b2/RVJELnBuZw==\" alt=\"\"></body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"48172004","collectionId":"eeb40040-ade6-4cd6-890a-b55941f69bf9","publishedId":"2sBXVhCAD2","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-01-14T02:18:35.000Z"},"item":[{"name":"커피 메뉴 목록 조회","id":"fa112e73-35f2-4d96-b94b-b2d06b4a9eff","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"http://localhost:8080/api/menus/coffee","description":"<p>전체 커피 메뉴를 조회합니다.</p>\n<p><strong>Response: Success (200 OK)</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": 1,\n    \"name\": \"아이스 아메리카노\",\n    \"price\": 3000,\n    \"description\": \"시원한 고카페인 충전\"\n  },\n  {\n    \"id\": 2,\n    \"name\": \"카페라떼\",\n    \"price\": 3500,\n    \"description\": \"부드러운 우유와 에스프레소\"\n  }\n]\n\n</code></pre>\n","urlObject":{"protocol":"http","port":"8080","path":["api","menus","coffee"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"030e2c37-364c-408c-8d6b-55fef5acd6eb","name":"커피 메뉴 목록 조회","originalRequest":{"method":"GET","header":[],"url":"http://localhost:8080/api/menus/coffee"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-XSS-Protection","value":"0"},{"key":"Cache-Control","value":"no-cache, no-store, max-age=0, must-revalidate"},{"key":"Pragma","value":"no-cache"},{"key":"Expires","value":"0"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Date","value":"Mon, 12 Jan 2026 07:51:04 GMT"},{"key":"Keep-Alive","value":"timeout=60"},{"key":"Connection","value":"keep-alive"}],"cookie":[],"responseTime":null,"body":"[\n    {\n        \"id\": 1,\n        \"name\": \"아메리카노\",\n        \"price\": 4000,\n        \"description\": \"깔끔하고 시원한 아메리카노\"\n    },\n    {\n        \"id\": 2,\n        \"name\": \"카페 라떼\",\n        \"price\": 4500,\n        \"description\": \"부드러운 우유가 들어간 카페 라떼\"\n    },\n    {\n        \"id\": 3,\n        \"name\": \"카푸치노\",\n        \"price\": 4500,\n        \"description\": \"풍성한 우유 거품의 카푸치노\"\n    },\n    {\n        \"id\": 4,\n        \"name\": \"에스프레소\",\n        \"price\": 3500,\n        \"description\": \"진하고 강렬한 에스프레소\"\n    },\n    {\n        \"id\": 5,\n        \"name\": \"바닐라 라떼\",\n        \"price\": 5000,\n        \"description\": \"달콤한 바닐라 향의 라떼\"\n    }\n]"}],"_postman_id":"fa112e73-35f2-4d96-b94b-b2d06b4a9eff"},{"name":"커피 메뉴 추천 Top3","id":"3ab0a493-3f03-4150-a6b5-58f5cdc880f1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"http://localhost:8080/api/menus/top3","description":"<p>최근 7일간 주문량이 가장 많은 상위 3개 메뉴를 조회합니다.</p>\n<p><strong>Response: Success (200 OK)</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"menuId\": 1,\n    \"name\": \"아이스 아메리카노\",\n    \"orderCount\": 150,\n    \"rank\": 1\n  },\n  {\n    \"menuId\": 5,\n    \"name\": \"바닐라 라떼\",\n    \"orderCount\": 89,\n    \"rank\": 2\n  },\n  {\n    \"menuId\": 2,\n    \"name\": \"카페라떼\",\n    \"orderCount\": 75,\n    \"rank\": 3\n  }\n]\n\n</code></pre>\n","urlObject":{"protocol":"http","port":"8080","path":["api","menus","top3"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"aa29eb73-2886-4ff0-ad12-7909314c401a","name":"커피 메뉴 추천 Top3","originalRequest":{"method":"GET","header":[],"url":"http://localhost:8080/api/menus/top3"},"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"[\n    {\n        \"menuId\": 1,\n        \"name\": \"아이스 아메리카노\",\n        \"orderCount\": 150,\n        \"rank\": 1\n    },\n    {\n        \"menuId\": 5,\n        \"name\": \"바닐라 라떼\",\n        \"orderCount\": 89,\n        \"rank\": 2\n    },\n    {\n        \"menuId\": 2,\n        \"name\": \"카페라떼\",\n        \"orderCount\": 75,\n        \"rank\": 3\n    }\n]"}],"_postman_id":"3ab0a493-3f03-4150-a6b5-58f5cdc880f1"},{"name":"포인트 충전","id":"53496938-315b-4c15-9467-e28e8d5b6404","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n   \"amount\": 100000\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:8080/api/me/points/charge","description":"<p>JWT 인가를 통과한 사용자의 포인트를 충전합니다.</p>\n<p>요청으로 충전할 포인트 값을 입력받아 사용자 정보에 저장하고,</p>\n<p>해당 기록이 <code>PointHistory</code>로 DB에 저장됩니다.</p>\n<p><strong>Response: Success (200 OK)</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"userId\": 1,\n  \"amount\": 10000,\n  \"currentPoint\": 15000,\n  \"chargedAt\": \"2024-01-10T14:00:00\"\n}\n\n</code></pre>\n<p><strong>Response: Failure (400 Bad Request)</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"status\": 400,\n  \"error\": \"Bad Request\",\n  \"message\": \"충전 금액은 0원보다 커야 합니다.\"\n}\n\n</code></pre>\n","urlObject":{"protocol":"http","port":"8080","path":["api","me","points","charge"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"8c2b13da-d1a4-4bf0-9aa4-fababb0891de","name":"포인트 충전","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n   \"amount\": 10000\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:8080/api/me/points/charge"},"status":"Created","code":201,"_postman_previewlanguage":null,"header":[{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-XSS-Protection","value":"0"},{"key":"Cache-Control","value":"no-cache, no-store, max-age=0, must-revalidate"},{"key":"Pragma","value":"no-cache"},{"key":"Expires","value":"0"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Date","value":"Mon, 12 Jan 2026 11:47:06 GMT"},{"key":"Keep-Alive","value":"timeout=60"},{"key":"Connection","value":"keep-alive"}],"cookie":[],"responseTime":null,"body":"{\n    \"userId\": 1,\n    \"amount\": 10000,\n    \"currentPoint\": 10000,\n    \"chargedAt\": \"2026-01-12T20:47:06.9190613\"\n}"}],"_postman_id":"53496938-315b-4c15-9467-e28e8d5b6404"},{"name":"주문 및 결제","id":"ef2b526f-e7fd-4d31-bdc7-78c9c0c93829","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"orderItems\": [\r\n        {\r\n            \"menuId\": 1,\r\n            \"quantity\": 1\r\n        },\r\n        {\r\n            \"menuId\": 2,\r\n            \"quantity\": 2\r\n        }\r\n    ]\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:8080/api/orders","description":"<p>JWT 인가를 통과한 사용자의 주문을 포인트로 결제합니다.</p>\n<p>요청으로 주문 목록 <code>OrderItem</code>을 입력받습니다.</p>\n<p>해당 기록이 <code>Order</code>로 DB에 저장됩니다.</p>\n<p><strong>Response: Success (200 OK)</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"orderId\": 105,\n  \"totalPrice\": 9500,\n  \"remainingPoint\": 5500, \n  \"status\": \"ORDERED\",\n  \"orderedAt\": \"2024-01-10T14:05:00\"\n}\n\n</code></pre>\n<p><strong>Response: Failure Case 1 - 잔액 부족 (400 Bad Request)</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"status\": 400,\n  \"error\": \"Bad Request\",\n  \"message\": \"포인트 잔액이 부족하여 주문할 수 없습니다.\"\n}\n\n</code></pre>\n<p><strong>Response: Failure Case 2 - 재고/메뉴 없음 (404 Not Found)</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"status\": 404,\n  \"error\": \"Not Found\",\n  \"message\": \"해당 메뉴(ID: 999)를 찾을 수 없습니다.\"\n}\n\n</code></pre>\n<p><strong>Response: Failure Case 3 - 동시성 충돌 (409 Conflict)</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"status\": 409,\n  \"error\": \"Conflict\",\n  \"message\": \"주문 처리 중 정보가 변경되었습니다. 다시 시도해 주세요.\"\n}\n\n</code></pre>\n","urlObject":{"protocol":"http","port":"8080","path":["api","orders"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"dd17c026-27f7-4b97-a509-e8da1d8d05d7","name":"주문 및 결제","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"orderItems\": [\r\n        {\r\n            \"menuId\": 1,\r\n            \"quantity\": 2\r\n        }\r\n    ]\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:8080/api/orders"},"status":"Created","code":201,"_postman_previewlanguage":null,"header":[{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-XSS-Protection","value":"0"},{"key":"Cache-Control","value":"no-cache, no-store, max-age=0, must-revalidate"},{"key":"Pragma","value":"no-cache"},{"key":"Expires","value":"0"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Date","value":"Mon, 12 Jan 2026 12:57:23 GMT"},{"key":"Keep-Alive","value":"timeout=60"},{"key":"Connection","value":"keep-alive"}],"cookie":[],"responseTime":null,"body":"{\n    \"orderId\": 1,\n    \"userId\": 1,\n    \"totalPrice\": 8000,\n    \"status\": \"RECEIVED\",\n    \"orderedAt\": \"2026-01-12T21:57:23.028261\",\n    \"orderItems\": [\n        {\n            \"menuName\": \"아메리카노\",\n            \"price\": 4000,\n            \"quantity\": 2\n        }\n    ]\n}"}],"_postman_id":"ef2b526f-e7fd-4d31-bdc7-78c9c0c93829"},{"name":"회원가입","id":"ba4b00a1-84ce-4038-8858-0d542786b453","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"name\": \"tester2\",\r\n    \"email\": \"tester2@test.com\",\r\n    \"password\": \"test!1234\"\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:8080/api/auth/register","urlObject":{"protocol":"http","port":"8080","path":["api","auth","register"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"7fc7ab05-2746-4d44-9f6f-116524aec8f0","name":"회원가입","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"name\": \"tester1\",\r\n    \"email\": \"tester1@test.com\",\r\n    \"password\": \"test!1234\"\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:8080/api/auth/register"},"status":"Created","code":201,"_postman_previewlanguage":null,"header":[{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-XSS-Protection","value":"0"},{"key":"Cache-Control","value":"no-cache, no-store, max-age=0, must-revalidate"},{"key":"Pragma","value":"no-cache"},{"key":"Expires","value":"0"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Length","value":"0"},{"key":"Date","value":"Mon, 12 Jan 2026 11:24:08 GMT"},{"key":"Keep-Alive","value":"timeout=60"},{"key":"Connection","value":"keep-alive"}],"cookie":[],"responseTime":null,"body":null}],"_postman_id":"ba4b00a1-84ce-4038-8858-0d542786b453"},{"name":"로그인","id":"f0b63d6b-c501-494d-aca9-4363d78d3908","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"email\": \"tester1@test.com\",\r\n    \"password\": \"test!1234\"\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:8080/api/auth/login","urlObject":{"protocol":"http","port":"8080","path":["api","auth","login"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"af705cb9-1845-426a-92d8-e66836ab0ef0","name":"로그인","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"email\": \"tester1@test.com\",\r\n    \"password\": \"test!1234\"\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:8080/api/auth/login"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-XSS-Protection","value":"0"},{"key":"Cache-Control","value":"no-cache, no-store, max-age=0, must-revalidate"},{"key":"Pragma","value":"no-cache"},{"key":"Expires","value":"0"},{"key":"X-Frame-Options","value":"DENY"},{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Date","value":"Mon, 12 Jan 2026 11:46:24 GMT"},{"key":"Keep-Alive","value":"timeout=60"},{"key":"Connection","value":"keep-alive"}],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 1,\n    \"name\": \"tester1\",\n    \"email\": \"tester1@test.com\",\n    \"token\": \"Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0ZXIxQHRlc3QuY29tIiwiZXhwIjoxNzY4MjIxOTg0LCJpYXQiOjE3NjgyMTgzODR9.-um1aO5zimOZtqrIRSLoJRE7kyhGNnwasxNDa3h2xxs\"\n}"}],"_postman_id":"f0b63d6b-c501-494d-aca9-4363d78d3908"}]}