{"@attributes":{"version":"2.0"},"channel":{"title":"Good Developer","link":"https:\/\/seungwontech.tistory.com\/","description":{},"language":"ko","pubDate":"Sat, 18 Apr 2026 01:53:46 +0900","generator":"TISTORY","ttl":"100","managingEditor":"seungwonlee","image":{"title":"Good Developer","url":"https:\/\/tistory1.daumcdn.net\/tistory\/5408353\/attach\/e26430ad3f6e4d959acdd6a6e5d775e8","link":"https:\/\/seungwontech.tistory.com"},"item":[{"title":"\uc65c \ubcc0\uacbd\uc774 \uc7a6\uc740 \uceec\ub7fc\uc5d0\ub294 \uc778\ub371\uc2a4\uac00 \ub3c5\uc774 \ub420 \uc218 \uc788\uc744\uae4c","link":"https:\/\/seungwontech.tistory.com\/128","description":"<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc131\ub2a5 \ucd5c\uc801\ud654\ub97c \uacf5\ubd80\ud558\ub2e4 \ubcf4\uba74 \"\uc218\uc815(UPDATE)\uacfc \uc0ad\uc81c(DELETE)\uac00 \uc7a6\uc740 \uceec\ub7fc\uc5d0\ub294 \uc778\ub371\uc2a4\ub97c \uc2e0\uc911\ud558\uac8c \uac78\uc5b4\uc57c \ud55c\ub2e4\"\ub294 \uc870\uc5b8\uc744 \uc790\uc8fc \ub4e3\uac8c \ub429\ub2c8\ub2e4. \uc65c \uadf8\ub7f4\uae4c\uc694? \ub2e8\uc21c\ud788 \uc778\ub371\uc2a4\ub97c \uad00\ub9ac\ud558\ub294 \ube44\uc6a9 \ub54c\ubb38\uc77c\uae4c\uc694?<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-path-to-node=\"4\" data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc624\ub298\uc740 MySQL InnoDB \uc5d4\uc9c4\uc758 \ub0b4\ubd80 \ub3d9\uc791 \ubc29\uc2dd\uc744 \ud1b5\ud574, \uc2e4\uc81c \ub370\uc774\ud130\ub294 10\ub9cc \uac74\uc778\ub370 \uc778\ub371\uc2a4\ub9cc \ube44\ub300\ud574\uc838 \uc131\ub2a5\uc774 \uac09\uc544\uba39\ud788\ub294 \uc774\uc720\ub97c '\ucc45\uc758 \uc0c9\uc778' \ube44\uc720\uc640 \ud568\uaed8 \ud30c\ud5e4\uccd0 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><b><span style=\"font-family: 'Nanum Gothic';\">1. \ud575\uc2ec \uac1c\ub150: DB\ub294 \uc989\uc2dc \uc0ad\uc81c\ud558\uc9c0 \uc54a\ub294\ub2e4 (Ghost Record)<\/span><\/b><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ub370\uc774\ud130\ubca0\uc774\uc2a4\ub294 DELETE\ub098 UPDATE \uba85\ub839\uc774 \ub4e4\uc5b4\uc654\uc744 \ub54c, \ud574\ub2f9 \ub370\uc774\ud130\ub97c \uc989\uc2dc \ubb3c\ub9ac\uc801\uc73c\ub85c \uc9c0\uc6b0\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ub300\uc2e0 \"\uc0ad\uc81c\ub428(Deleted Mark)\" \ud45c\uc2dc\ub9cc \ud574\ub461\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h4 data-ke-size=\"size20\"><b><span style=\"font-family: 'Nanum Gothic';\">\uc65c \ubc14\ub85c \uc0ad\uc81c\ud558\uc9c0 \uc54a\uc744\uae4c?<\/span><\/b><\/h4>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li><span style=\"font-family: 'Nanum Gothic';\">\uc18d\ub3c4 \ub54c\ubb38\uc785\ub2c8\ub2e4: \uc989\uc2dc \ubb3c\ub9ac\uc801\uc73c\ub85c \uc0ad\uc81c\ud558\uba74 \uc778\ub371\uc2a4 \uad6c\uc870(B-Tree)\ub97c \uadf8 \uc989\uc2dc \uc7ac\uc870\uc815\ud574\uc57c \ud558\ubbc0\ub85c \uc791\uc5c5\uc774 \ub290\ub824\uc9d1\ub2c8\ub2e4.<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">\ud6a8\uc728\uc131: \ud45c\uc2dc\ub9cc \ud574\ub450\uace0 \ub098\uc911\uc5d0 \ubc31\uadf8\ub77c\uc6b4\ub4dc \uc2a4\ub808\ub4dc(Purge Thread)\uac00 \ud55c\uaebc\ubc88\uc5d0 \uc815\ub9ac\ud558\ub294 \uac83\uc774 \ud6e8\uc52c \ud6a8\uc728\uc801\uc785\ub2c8\ub2e4.<\/span><\/li>\n<\/ul>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><b><span style=\"font-family: 'Nanum Gothic';\">2. \ucc45\uc758 '\uc0c9\uc778'\uc73c\ub85c \uc774\ud574\ud558\uae30 (\ube44\uc720)<\/span><\/b><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ucc45 \ub4b7\uba74\uc758 \uc0c9\uc778(Index)\uc744 \uc0c1\uc0c1\ud574 \ubcf4\uc138\uc694. \ucc45 \ubcf8\ubb38\uc740 100\ud398\uc774\uc9c0, \uc0c9\uc778\uc740 2\ud398\uc774\uc9c0 \ubd84\ub7c9\uc785\ub2c8\ub2e4.<\/span><\/p>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li><span style=\"font-family: 'Nanum Gothic';\">\uc0c1\ud669: 1,000\ubc88\uc758 \ub370\uc774\ud130 \uc0ad\uc81c\/\uc218\uc815\uc774 \uc77c\uc5b4\ub0ac\uc2b5\ub2c8\ub2e4.<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">\uacb0\uacfc: \uc2e4\uc81c \ubcf8\ubb38 \ub0b4\uc6a9\uc740 \uc5ec\uc804\ud788 100\ud398\uc774\uc9c0 \ubd84\ub7c9\uc774\uc9c0\ub9cc, \uc0c9\uc778 \ud398\uc774\uc9c0\ub294 \ucde8\uc18c\uc120\uc774 \uadf8\uc5b4\uc9c4 \uc815\ubcf4\ub4e4\ub85c \uac00\ub4dd \ucc28\uc11c 20\ud398\uc774\uc9c0\ub85c \ub298\uc5b4\ub0ac\uc2b5\ub2c8\ub2e4.<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">\ubb38\uc81c: \uc608\uc804\uc5d0\ub294 '\uae40\uce58'\ub77c\ub294 \ub2e8\uc5b4\ub97c \ucc3e\uae30 \uc704\ud574 2\ud398\uc774\uc9c0\ub9cc \ubcf4\uba74 \ub410\uc9c0\ub9cc, \uc774\uc81c\ub294 \ubd88\ud544\uc694\ud55c \ucde8\uc18c\uc120\uc774 \uac00\ub4dd\ud55c 20\ud398\uc774\uc9c0 \uc804\uccb4\ub97c \ub2e4 \ub4a4\uc838\uc57c \ud569\ub2c8\ub2e4. \ub2f9\uc5f0\ud788 \uc870\ud68c \uc18d\ub3c4\uac00 \ub290\ub824\uc9c8 \uc218\ubc16\uc5d0 \uc5c6\uc2b5\ub2c8\ub2e4.<\/span><\/li>\n<\/ul>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><b><span style=\"font-family: 'Nanum Gothic';\">3. DELETE vs UPDATE \ub0b4\ubd80 \ub3d9\uc791 \ube44\uad50<\/span><\/b><\/h3>\n<h4 data-path-to-node=\"16\" data-ke-size=\"size20\"><b><span style=\"font-family: 'Nanum Gothic';\">DELETE\uc758 \uacbd\uc6b0: \"\uacf5\uac04\uc740 \uadf8\ub300\ub85c, \ub370\uc774\ud130\ub9cc \uc904\uc5b4\ub4e6\"<\/span><\/b><\/h4>\n<ul style=\"list-style-type: disc;\" data-path-to-node=\"17\" data-ke-list-type=\"disc\">\n<li><span style=\"font-family: 'Nanum Gothic';\">\ucd08\uae30: \ub370\uc774\ud130 100\uac1c (100GB) &rarr; Data_length: 100GB<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">20\uac1c \uc0ad\uc81c \ud6c4: 80\uac1c \uc0dd\uc874, 20\uac1c \uc0ad\uc81c \ud45c\uc2dc &rarr; Data_length: \uc5ec\uc804\ud788 100GB<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">\ubb38\uc81c\uc810: SELECT \uc2dc 100GB \uacf5\uac04\uc744 \uc804\ubd80 \uc2a4\uce94\ud558\uba70 \uc0ad\uc81c \ud45c\uc2dc\ub41c 20GB\ub97c \uac74\ub108\ub701\ub2c8\ub2e4. \uc989, \ubd88\ud544\uc694\ud55c \uc2a4\uce94 \ubc94\uc704\uac00 \ub0a8\uc2b5\ub2c8\ub2e4.<\/span><\/li>\n<\/ul>\n<h4 data-path-to-node=\"18\" data-ke-size=\"size20\">&nbsp;<\/h4>\n<h4 data-path-to-node=\"18\" data-ke-size=\"size20\"><b><span style=\"font-family: 'Nanum Gothic';\">UPDATE\uc758 \uacbd\uc6b0: \"\ub370\uc774\ud130\ub294 \uadf8\ub300\ub85c, \uacf5\uac04\uc740 \ub298\uc5b4\ub0a8\" (\ub354 \uc704\ud5d8!)<\/span><\/b><\/h4>\n<p data-path-to-node=\"19\" data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">InnoDB\uc5d0\uc11c UPDATE\ub294 \ub0b4\ubd80\uc801\uc73c\ub85c Delete + Insert \ubc29\uc2dd\uc73c\ub85c \ub3d9\uc791\ud569\ub2c8\ub2e4.<\/span><\/p>\n<ul style=\"list-style-type: disc;\" data-path-to-node=\"20\" data-ke-list-type=\"disc\">\n<li><span style=\"font-family: 'Nanum Gothic';\">\uae30\uc874 \ub808\ucf54\ub4dc: \uc0ad\uc81c \ud45c\uc2dc (Old)<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">\uc0c8 \ub808\ucf54\ub4dc: \uc0c8\ub85c\uc6b4 \uacf5\uac04\uc5d0 \uc0bd\uc785 (New)<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">\uacb0\uacfc: \ub370\uc774\ud130 100\uac1c \uc911 20\uac1c\ub97c \uc218\uc815\ud558\uba74, \uc804\uccb4 \uc810\uc720 \uacf5\uac04\uc740 120GB\ub85c \ub298\uc5b4\ub0a9\ub2c8\ub2e4.<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">\uc704\ud5d8\uc131: \uc218\uc815\uc774 \ubc18\ubcf5\ub420\uc218\ub85d \uc2e4\uc81c \ub370\uc774\ud130 \uc591\uc740 \uac19\uc740\ub370 \uc2a4\uce94\ud574\uc57c \ud560 \ubc94\uc704(\uc4f0\ub808\uae30 \ub370\uc774\ud130 \uacf5\uac04)\ub9cc \uae30\ud558\uae09\uc218\uc801\uc73c\ub85c \ucee4\uc9d1\ub2c8\ub2e4.<\/span><\/li>\n<\/ul>\n<table style=\"border-collapse: collapse; width: 100%; height: 86px;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr style=\"height: 18px;\">\n<td style=\"width: 33.3333%; height: 18px;\"><b><span style=\"font-family: 'Nanum Gothic';\">\uad6c\ubd84<\/span><\/b><\/td>\n<td style=\"width: 33.3333%; height: 18px;\"><b><span style=\"font-family: 'Nanum Gothic';\">DELETE<\/span><\/b><\/td>\n<td style=\"width: 33.3333%; height: 18px;\"><b><span style=\"font-family: 'Nanum Gothic';\">UPDATE<\/span><\/b><\/td>\n<\/tr>\n<tr style=\"height: 17px;\">\n<td style=\"width: 33.3333%; height: 17px;\"><b><span style=\"font-family: 'Nanum Gothic';\">\uc2e4\uc81c \ub370\uc774\ud130<\/span><\/b><\/td>\n<td style=\"width: 33.3333%; height: 17px;\"><b><span style=\"font-family: 'Nanum Gothic';\">80\uac1c(\uc904\uc5b4\ub4ec)<\/span><\/b><\/td>\n<td style=\"width: 33.3333%; height: 17px;\"><b><span style=\"font-family: 'Nanum Gothic';\">100\uac1c(\uadf8\ub300\ub85c)<\/span><\/b><\/td>\n<\/tr>\n<tr style=\"height: 17px;\">\n<td style=\"width: 33.3333%; height: 17px;\"><b><span style=\"font-family: 'Nanum Gothic';\">\uc804\uccb4 \uacf5\uac04<\/span><\/b><\/td>\n<td style=\"width: 33.3333%; height: 17px;\"><b><span style=\"font-family: 'Nanum Gothic';\">100GB(\uadf8\ub300\ub85c)<\/span><\/b><\/td>\n<td style=\"width: 33.3333%; height: 17px;\"><b><span style=\"font-family: 'Nanum Gothic';\">120GB(\ub298\uc5b4\ub0a8)<\/span><\/b><\/td>\n<\/tr>\n<tr style=\"height: 17px;\">\n<td style=\"width: 33.3333%; height: 17px;\"><b><span style=\"font-family: 'Nanum Gothic';\">\uc4f0\ub808\uae30 \uacf5\uac04<\/span><\/b><\/td>\n<td style=\"width: 33.3333%; height: 17px;\"><b><span style=\"font-family: 'Nanum Gothic';\">20GB<\/span><\/b><\/td>\n<td style=\"width: 33.3333%; height: 17px;\"><b><span style=\"font-family: 'Nanum Gothic';\">20GB<\/span><\/b><\/td>\n<\/tr>\n<tr style=\"height: 17px;\">\n<td style=\"width: 33.3333%; height: 17px;\"><b><span style=\"font-family: 'Nanum Gothic';\">\uc2a4\uce94 \ubc94\uc704&nbsp;<\/span><\/b><\/td>\n<td style=\"width: 33.3333%; height: 17px;\"><b><span style=\"font-family: 'Nanum Gothic';\">100GB<\/span><\/b><\/td>\n<td style=\"width: 33.3333%; height: 17px;\"><b><span style=\"font-family: 'Nanum Gothic';\">120GB<\/span><\/b><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc218\uc815\uc774 \ub354 \uc2ec\uac01\ud55c \uc774\uc720\ub294 \ub370\uc774\ud130\ub294 \uadf8\ub300\ub85c\uc778\ub370 \uacf5\uac04\ub9cc \uacc4\uc18d \ub298\uc5b4\ub098\uba70 \uc2a4\uce94\ud574\uc57c \ud560 \ubc94\uc704\uac00 \uacc4\uc18d \ucee4\uc9d1\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc774\ub7f0 \uac78 \uace0\ub824\ud588\uc744 \ub54c \uc218\uc815\uc774 \ubc18\ubcf5\ub41c\ub2e4\uba74 \uc5bc\ub9c8\ub098 \uc2ec\uac01\ud574\uc9c8\uae4c\uc694?<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">100\uac1c\uc758 \ub808\ucf54\ub4dc\ub97c 100\ubc88 update \ud558\uba74 \uc2e4\uc81c \ub370\uc774\ud130\ub294 100GB\uc778\ub370 10TB\ub97c \uc2a4\uce94\ud574\uc57c \ud558\ubbc0\ub85c \uc131\ub2a5\uc740 \ucd5c\uc545\uc774 \ub429\ub2c8\ub2e4.<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><b><span style=\"font-family: 'Nanum Gothic';\">4. \ub0b4 DB \uc0c1\ud0dc \uc9c4\ub2e8\ud558\uae30<\/span><\/b><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">MySQL\uc5d0\uc11c\ub294 \uac04\ub2e8\ud55c \ucffc\ub9ac\ub85c \uc6b0\ub9ac \ud14c\uc774\ube14\uc5d0 '\uc4f0\ub808\uae30 \ub370\uc774\ud130(Fragment)'\uac00 \uc5bc\ub9c8\ub098 \uc313\uc600\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<pre id=\"code_1769669452397\" class=\"sql\" data-ke-language=\"sql\" data-ke-type=\"codeblock\"><code>SHOW TABLE STATUS LIKE '\ud14c\uc774\ube14\uba85';<\/code><\/pre>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li><span style=\"font-family: 'Nanum Gothic';\">Data_length: \uc804\uccb4 \ub370\uc774\ud130\uac00 \ucc28\uc9c0\ud558\ub294 \uacf5\uac04<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">Data_free: \ube48 \uacf5\uac04(\uc4f0\ub808\uae30)<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">Index_length: \uc778\ub371\uc2a4 \ud06c\uae30<\/span><\/li>\n<\/ul>\n<h4 data-ke-size=\"size20\"><b><span style=\"font-family: 'Nanum Gothic';\">\ucd5c\uc801\ud654\uac00 \ud544\uc694\ud55c \uc2dc\uc810<\/span><\/b><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">Data_free \ube44\uc728 = Data_free &divide; Data_length\uc774&nbsp; 20% \uc774\uc0c1\uc774\uba74 OPTIMIZE TABLE \uba85\ub839\uc744 \ud1b5\ud574 \ud30c\ud3b8\ud654\ub41c \uacf5\uac04\uc744 \uc815\ub9ac\ud574 \uc8fc\ub294 \uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4. (AI \uc0dd\uac01)<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><b><span style=\"font-family: 'Nanum Gothic';\">5. \uc2e4\ubb34\uc5d0\uc11c\uc758 \ud310\ub2e8\uae30\uc900<\/span><\/b><\/h3>\n<h4 data-ke-size=\"size20\"><b><span style=\"font-family: 'Nanum Gothic';\">\uc778\ub371\uc2a4\ub97c \uac78\uc5b4\uc57c \ud558\ub294 \uacbd\uc6b0&nbsp;<\/span><\/b><\/h4>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li><span style=\"font-family: 'Nanum Gothic';\">\uc870\ud68c\uac00 \ube48\ubc88\ud55c \uceec\ub7fc<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">where\uc808\uc5d0 \uc790\uc8fc \uc0ac\uc6a9\ub418\ub294 \uceec\ub7fc<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">INSERT\uc704\uc8fc\uc774\uace0 \uc218\uc815\/\uc0ad\uc81c\uac00 \uac70\uc758 \uc5c6\ub294 \uceec\ub7fc<\/span><\/li>\n<\/ul>\n<h4 data-path-to-node=\"33\" data-ke-size=\"size20\"><b><span style=\"font-family: 'Nanum Gothic';\">\uc778\ub371\uc2a4\ub97c \uc2e0\uc911\ud574\uc57c \ud558\ub294 \uacbd\uc6b0<\/span><\/b><\/h4>\n<ul style=\"list-style-type: disc;\" data-path-to-node=\"34\" data-ke-list-type=\"disc\">\n<li><span style=\"font-family: 'Nanum Gothic';\">\uc218\uc815\/\uc0ad\uc81c\uac00 \uc2e4\uc2dc\uac04\uc73c\ub85c \ub300\ub7c9 \ubc1c\uc0dd\ud558\ub294 \uceec\ub7fc<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">\ub370\uc774\ud130\uc758 \uc911\ubcf5\ub3c4(\uc120\ud0dd\ub3c4)\uac00 \ub0ae\uc740 \uceec\ub7fc (\uc608: \uc131\ubcc4, \uc9c4\ud589\uc0c1\ud0dc \ub4f1)<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">\uc778\ub371\uc2a4 \ud06c\uae30\uac00 \uc2e4\uc81c \ub370\uc774\ud130 \ud06c\uae30\ubcf4\ub2e4 \ube44\ub300\ud574\uc9c4 \uacbd\uc6b0<\/span><\/li>\n<\/ul>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><b><span style=\"font-family: 'Nanum Gothic';\">6. \uc2e4\uc81c \uc0ac\ub840 \ubd84\uc11d<\/span><\/b><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc81c\uac00 \ud655\uc778\ud55c \uc2e4\uc81c \ud14c\uc774\ube14 \uc0c1\ud0dc\uc785\ub2c8\ub2e4.<\/span><\/p>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li>Data_length: 6.47GB<\/li>\n<li>Data_free: 7MB (0.1%)<\/li>\n<li>Index_length: 6.97GB<\/li>\n<\/ul>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">Data_free \ube44\uc728\uc774 0.1%\uc73c\ub85c \uc4f0\ub808\uae30\uac00 \uac70\uc758 \uc5c6\uc2b5\ub2c8\ub2e4. \ucd5c\uc801\ud654 \ubd88\ud544\uc694\ud558\ub2e4.<\/span><\/p>\n<h4 data-ke-size=\"size20\"><b><span style=\"font-family: 'Nanum Gothic';\">\uc8fc\uc758\ud560 \uc810<\/span><\/b><\/h4>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li><span style=\"font-family: 'Nanum Gothic';\">\uc778\ub371\uc2a4(6.97GB)\uac00 \ub370\uc774\ud130(6.47GB) \ubcf4\ub2e4 \ud07c<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">\ubd88\ud544\uc694\ud55c \uc778\ub371\uc2a4\uac00 \uc788\ub294\uc9c0 \uc810\uac80 \ud544\uc694<\/span><\/li>\n<\/ul>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-path-to-node=\"36\" data-ke-size=\"size23\"><b><span style=\"font-family: 'Nanum Gothic';\">6. \uacb0\ub860<\/span><\/b><\/h3>\n<ol style=\"list-style-type: decimal;\" data-path-to-node=\"37\" data-ke-list-type=\"decimal\">\n<li><span style=\"font-family: 'Nanum Gothic';\">DB\ub294 \uc0ad\uc81c\/\uc218\uc815 \uc2dc \uc989\uc2dc \uc9c0\uc6b0\uc9c0 \uc54a\uace0 \ud45c\uc2dc\ub9cc \ud55c\ub2e4.<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">UPDATE\ub294 Delete + Insert\uc774\ubbc0\ub85c \uc0ad\uc81c\ubcf4\ub2e4 \ub354 \ube48\ubc88\ud558\uac8c \uacf5\uac04\uc744 \ub0ad\ube44\ud55c\ub2e4.<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">\uc4f0\ub808\uae30 \ub370\uc774\ud130\uac00 \uc313\uc774\uba74 \uc778\ub371\uc2a4 \uc2a4\uce94 \ubc94\uc704\uac00 \ub113\uc5b4\uc838 \uc870\ud68c \uc131\ub2a5\uc774 \ub5a8\uc5b4\uc9c4\ub2e4.<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">\uc815\uae30\uc801\uc73c\ub85c Data_free \ube44\uc728\uc744 \ubaa8\ub2c8\ud130\ub9c1\ud558\uace0 \ucd5c\uc801\ud654(Optimize)\ub97c \uc9c4\ud589\ud55c\ub2e4.<\/span><\/li>\n<\/ol>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uacb0\uad6d \uc88b\uc740 DB \uc124\uacc4\ub780, \ubb34\uc870\uac74 \ube60\ub978 \uc870\ud68c\ub97c \uc704\ud574 \uc778\ub371\uc2a4\ub97c \ub0a8\ubc1c\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub77c <b data-index-in-node=\"45\" data-path-to-node=\"38\">\ub370\uc774\ud130\uc758 \uc0dd\uc560 \uc8fc\uae30(C.R.U.D)\ub97c \uace0\ub824\ud558\uc5ec \uc801\uc808\ud55c \uade0\ud615<\/b>\uc744 \ucc3e\ub294 \uac83\uc785\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>","category":"Backend","author":"seungwonlee","guid":"https:\/\/seungwontech.tistory.com\/128","comments":"https:\/\/seungwontech.tistory.com\/128#entry128comment","pubDate":"Thu, 29 Jan 2026 19:02:35 +0900"},{"title":"\ub370\ub4dc\ub77d\uacfc \uac31\uc2e0 \uc720\uc2e4\uc744 \uacaa\uace0 \ubc30\uc6b4 \uc1a1\uae08 \uc2dc\uc2a4\ud15c \uc124\uacc4 \ud68c\uace0","link":"https:\/\/seungwontech.tistory.com\/127","description":"<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uae08\uc735 \uc11c\ube44\uc2a4\uc758 \ud575\uc2ec\uc740 \ub370\uc774\ud130 \ubb34\uacb0\uc131\uc774\ub77c\uace0 \uc0dd\uac01\ud569\ub2c8\ub2e4. \ub2e8\uc21c\ud788 \uc794\uc561\uc744 \uc62e\uae30\ub294 \uae30\ub2a5\uc744 \ub118\uc5b4, \uc218\ucc9c \uac74\uc758 \uc694\uccad\uc774 \ub3d9\uc2dc\uc5d0 \ubc1c\uc0dd\ud574\ub3c4 \ub370\uc774\ud130\uac00 \uaf2c\uc774\uc9c0 \uc54a\uace0 \ub124\ud2b8\uc6cc\ud06c \uc624\ub958\uac00 \uc788\uc5b4\ub3c4 \uc911\ubcf5 \uac70\ub798\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub3c4\ub85d \uc548\uc815\uc801\uc778 \uc1a1\uae08 \uc2dc\uc2a4\ud15c\uc744 \uc124\uacc4&middot;\uad6c\ud604\ud558\uba70 \uacaa\uc740 \uacfc\uc815\uc744 \uae30\ub85d\ud569\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ubcf8 \uae00\uc5d0\uc11c &lsquo;\uc1a1\uae08&rsquo;\uc740 \ud0c0\ud589 \uc774\uccb4\uac00 \uc544\ub2cc \ub3d9\uc77c \uc2dc\uc2a4\ud15c \ub0b4 \uacc4\uc88c \uac04 \uc774\uccb4\ub97c \uc758\ubbf8\ud569\ub2c8\ub2e4.<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>1. \ud504\ub85c\uc81d\ud2b8 \ubaa9\ud45c \ubc0f \ud575\uc2ec \uc124\uacc4&nbsp;<\/b><\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ud504\ub85c\uc81d\ud2b8\ub294 \ud655\uc7a5 \uac00\ub2a5\ud558\uace0 \uc2e0\ub8b0\ud560 \uc218 \uc788\ub294 \uc1a1\uae08 \uc2dc\uc2a4\ud15c\uc744 \uad6c\ucd95\uc744 \ubaa9\ud45c\ub85c \ud558\uba70 \uc544\ub798 4\uac00\uc9c0 \uc6d0\uce59\uc744 \uc900\uc218\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<ol style=\"list-style-type: decimal;\" data-ke-list-type=\"decimal\">\n<li><span style=\"font-family: 'Nanum Gothic';\">\ub370\uc774\ud130 \uc815\ud569\uc131: \ubaa8\ub4e0 \uae08\uc735 \uac70\ub798\uc758 \uc6d0\uc790\uc131 \ubcf4\uc7a5<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">\ub3d9\uc2dc\uc131 \uc81c\uc5b4: \ub3d9\uc77c \uacc4\uc88c\uc5d0 \ub300\ud55c \uacbd\ud569 \uc0c1\ud669 \ud574\uacb0<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">\uba71\ub4f1\uc131 \ubcf4\uc7a5: \ub3d9\uc77c \uc694\uccad \uc7ac\uc2dc\ub3c4 \uc2dc \uc911\ubcf5 \ucc98\ub9ac \ubc29\uc9c0<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic';\">\uc131\ub2a5 \ucd5c\uc801\ud654: \ub300\ub7c9 \uac70\ub798 \ubc1c\uc0dd \uc2dc\uc5d0\ub3c4 \ube60\ub978 \ud55c\ub3c4 \uc870\ud68c \ubc0f \uc794\uc561 \uac31\uc2e0<\/span><\/li>\n<\/ol>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>2. DB \ubaa8\ub378\ub9c1<\/b><\/span><\/h3>\n<table style=\"border-collapse: collapse; width: 100%; height: 92px;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr style=\"height: 18px;\">\n<td style=\"width: 16.5116%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud14c\uc774\ube14<\/span><\/td>\n<td style=\"width: 18.1395%; height: 18px;\"><span style=\"background-color: #2780d4; color: #ffffff; text-align: start; font-family: 'Nanum Gothic';\">\uc124\uba85<\/span><\/td>\n<td style=\"width: 65.3489%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\ube44\uace0<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 16.5116%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">Account<\/span><\/td>\n<td style=\"width: 18.1395%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\uacc4\uc88c \ud14c\uc774\ube14<\/span><\/td>\n<td style=\"width: 65.3489%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud604\uc7ac \uc794\uc561\uacfc \uacc4\uc88c \uc0c1\ud0dc\ub97c \uad00\ub9ac\ud558\uba70, \uc0ad\uc81c \uc2dc Soft Delete \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 16.5116%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">DailyLimitUsage<\/span><\/td>\n<td style=\"width: 18.1395%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc77c\uc77c \ud55c\ub3c4 \ud14c\uc774\ube14<\/span><\/td>\n<td style=\"width: 65.3489%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc77c\uc790\ubcc4 \ub204\uc801 \ud569\uacc4 \ud14c\uc774\ube14\uc744 \ubcc4\ub3c4\ub85c \uad00\ub9ac\ud569\ub2c8\ub2e4.<\/span><\/td>\n<\/tr>\n<tr style=\"height: 20px;\">\n<td style=\"width: 16.5116%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">LimitSetting<\/span><\/td>\n<td style=\"width: 18.1395%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud55c\ub3c4 \uc124\uc815 \ud14c\uc774\ube14<\/span><\/td>\n<td style=\"width: 65.3489%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">\uacc4\uc88c\ubcc4 \ud55c\ub3c4 \uc124\uc815 \uc815\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 \ud14c\uc774\ube14\uc785\ub2c8\ub2e4.<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 16.5116%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">Transaction<\/span><\/td>\n<td style=\"width: 18.1395%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\uac70\ub798 \ub0b4\uc5ed \ud14c\uc774\ube14<\/span><\/td>\n<td style=\"width: 65.3489%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\ubaa8\ub4e0 \uac70\ub798\uc758 \ucd5c\uc885 \ub0b4\uc5ed\uc744 \uc800\uc7a5\ud569\ub2c8\ub2e4.<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\"><b>2.1 DailyLimitUsage \uc124\uacc4 \uc758\ub3c4<\/b><\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ub9e4\ubc88 Transaction \ud14c\uc774\ube14\uc744 \ud569\uc0b0(SUM)\ud558\uc5ec \ud55c\ub3c4 \uccb4\ud06c\ud558\ub294 \ubc29\uc2dd\uc740 \ub370\uc774\ud130\uac00 \ub298\uc5b4\ub0a0\uc218\ub85d \uc131\ub2a5\uc774 \uc800\ud558\ub429\ub2c8\ub2e4. \uc774\ub97c \ubc29\uc9c0\ud558\uace0\uc790 \uc77c\uc790\ubcc4 \ub204\uc801 \ud569\uacc4 \ud14c\uc774\ube14\uc744 \ubcc4\ub3c4\ub85c \uad00\ub9ac\ud558\uc5ec \uc870\ud68c \uc131\ub2a5\uc744 \ucd5c\uc801\ud654\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>3. \ud2b8\ub7ec\ube14 \uc288\ud305<\/b><\/span><\/h3>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\"><b>3.1 \ub3d9\uc2dc\uc131 \uc81c\uc5b4\uc640 \ub370\ub4dc\ub77d \ubc29\uc9c0<\/b><\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uae08\uc735 \ub370\uc774\ud130\ub294 \uc815\ud569\uc131\uc774 \ucd5c\uc6b0\uc120\uc785\ub2c8\ub2e4. \ucda9\ub3cc \ubc1c\uc0dd \uc2dc \ub864\ubc31\uacfc \uc7ac\uc2dc\ub3c4\uac00 \uc7a6\uc740 \ub099\uad00\uc801 \ub77d \ub300\uc2e0, \ub370\uc774\ud130 \uc218\uc815 \uc2dc\uc810\uc5d0 \uc989\uc2dc \ub77d\uc744 \uac70\ub294 \ube44\uad00\uc801 \ub77d\uc744 \uc120\ud0dd\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ud558\uc9c0\ub9cc&nbsp;\uc774\uccb4\ub294 \ub450 \uacc4\uc88c\uc758 \ub77d\uc744 \ub3d9\uc2dc\uc5d0 \ud68d\ub4dd\ud574\uc57c \ud558\ubbc0\ub85c, A &rarr; B, B &rarr; A \uc1a1\uae08\uc774 \ub3d9\uc2dc\uc5d0 \ubc1c\uc0dd\ud560 \uacbd\uc6b0 \uc11c\ub85c\uc758 \ub77d \ud574\uc81c\ub97c \uae30\ub2e4\ub9ac\ub294 \ub370\ub4dc\ub77d\uc5d0 \ube60\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud574\uacb0 \ubc29\ubc95\uc73c\ub85c \uacc4\uc88c ID\ub97c \uae30\uc900\uc73c\ub85c \uc815\ub82c\ub41c \uc21c\uc11c\uc5d0 \ub530\ub77c \ub77d\uc744 \ud68d\ub4dd\ud558\ub3c4\ub85d \uc124\uacc4\ud588\uc2b5\ub2c8\ub2e4.&nbsp;<\/span><\/p>\n<pre id=\"code_1768275794885\" class=\"sql\" data-ke-language=\"sql\" data-ke-type=\"codeblock\"><code>\/\/ \ucf54\ub4dc \ud575\uc2ec \ub85c\uc9c1 \uc608\uc2dc\nLong firstId = Math.min(fromAccountId, toAccountId);\nLong secondId = Math.max(fromAccountId, toAccountId);\n\n\/\/ \ub0ae\uc740 ID\ubd80\ud130 \uc21c\ucc28\uc801\uc73c\ub85c \ub77d \ud68d\ub4dd (\uc21c\ud658 \ub300\uae30 \ubc29\uc9c0)\naccountRepository.findLockedByAccountId(firstId);\naccountRepository.findLockedByAccountId(secondId);<\/code><\/pre>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\"><b>3.2 \uac31\uc2e0 \uc720\uc2e4 \ubc29\uc9c0\uc640 \uc2dd\ubcc4\uc790 \uc124\uacc4<\/b><\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ube44\uad00\uc801 \ub77d\uc744 \uc801\uc6a9\ud588\uc74c\uc5d0\ub3c4 \ubd88\uad6c\ud558\uace0, \uac1d\uccb4 \uc870\ud68c \uc21c\uc11c\uc5d0 \ub530\ub77c \ub370\uc774\ud130 \ucd5c\uc2e0\uc131\uc774 \ubcf4\uc7a5\ub418\uc9c0 \uc54a\uc544 \uc794\uc561\uc774 \uc720\uc2e4\ub418\ub294 \ubb38\uc81c\ub97c \uacbd\ud5d8\ud588\uc2b5\ub2c8\ub2e4. \uc774\ub294 \uc124\uacc4 \ub2f9\uc2dc \uc601\uc18d\uc131 \ucee8\ud14d\uc2a4\ud2b8\uc758 \ub3d9\uc791 \ubc29\uc2dd\uc744 \uac04\uacfc\ud558\uc5ec \ubc1c\uc0dd\ud55c \uc2e4\uc218\uc600\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ub77d\uc744 \ud68d\ub4dd\ud558\uae30 \uc804 \uacc4\uc88c \uc5d4\ud2f0\ud2f0\ub97c \uba3c\uc800 \uc870\ud68c\ud558\uc5ec \uba54\ubaa8\ub9ac\uc5d0 \uc62c\ub9ac\ub294 \uac83\uc774 \ubb38\uc81c\uc600\uc2b5\ub2c8\ub2e4. \uc774\ud6c4 findLockedByAccountId\ub85c \ube44\uad00\uc801 \ub77d\uc744 \uc2dc\ub3c4\ud558\ub354\ub77c\ub3c4, JPA\ub294 \uc774\ubbf8 \uc601\uc18d\uc131 \ucee8\ud14d\uc2a4\ud2b8\uc5d0 \uc874\uc7ac\ud558\ub294 \uacfc\uac70 \uc0c1\ud0dc\uc758 \uc5d4\ud2f0\ud2f0\ub97c \uadf8\ub300\ub85c \ubc18\ud658\ud569\ub2c8\ub2e4. \uacb0\uacfc\uc801\uc73c\ub85c \ub77d\uc740 \uac78\uc5c8\uc9c0\ub9cc \ub370\uc774\ud130\ub294 \ub77d\uc744 \uac78\uae30 \uc804\uc758 \uacfc\uac70 \uc2a4\ub0c5\uc0f7\uc744 \uc0ac\uc6a9\ud558\uac8c \ub418\uba70, \ub2e4\ub978 \ud2b8\ub79c\uc7ad\uc158\uc758 \ubcc0\uacbd \uc0ac\ud56d\uc744 \ub36e\uc5b4\uc4f0\ub294 \uac31\uc2e0 \uc720\uc2e4\uc774 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ubb38\uc81c\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574 \ub77d\uc744 \uac78\uae30 \uc804\uc5d0\ub294 \uacc4\uc88c\uc758 ID\ub9cc \ucd5c\uc18c\ud55c\uc73c\ub85c \uc870\ud68c\ud558\uace0, \uc2e4\uc81c \ube44\uad00\uc801 \ub77d\uc744 \ud68d\ub4dd\ud558\ub294 \uc2dc\uc810\uc5d0 \ucd5c\uc2e0 \uc5d4\ud2f0\ud2f0\ub97c \uc0c8\ub86d\uac8c \ub85c\ub4dc\ud558\ub3c4\ub85d \ub85c\uc9c1\uc744 \uac1c\uc120\ud588\uc2b5\ub2c8\ub2e4. \ub77d \ud68d\ub4dd \uc2dc\uc810\uacfc \uc5d4\ud2f0\ud2f0 \ub85c\ub4dc \uc2dc\uc810\uc744 \uc77c\uce58\uc2dc\ucf1c \ud56d\uc0c1 \ucd5c\uc2e0 \ub370\uc774\ud130\ub97c \ubc14\ud0d5\uc73c\ub85c \uc794\uc561 \uacc4\uc0b0\uc774 \uc774\ub8e8\uc5b4\uc9c0\uac8c \uc124\uacc4\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ub610\ud55c API \ud30c\ub77c\ubbf8\ud130 \uc124\uacc4 \uc2dc \uc2dc\uc2a4\ud15c \ub0b4\ubd80 \uc2dd\ubcc4\uc790\uc778 AccountId \ub300\uc2e0 AccountNo\ub97c \uc0ac\uc6a9\ud55c \uac83 \uc5ed\uc2dc \uc758\ub3c4\uc801\uc778 \uc120\ud0dd\uc774\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\ub294 \ubcf4\uc548\uc0c1 \ub0b4\ubd80 PK \uad6c\uc870\ub97c \uc678\ubd80\uc5d0 \ub178\ucd9c\ud558\uc9c0 \uc54a\uae30 \uc704\ud568\uc774\uc5c8\uc2b5\ub2c8\ub2e4. \ub0b4\ubd80 \ub85c\uc9c1\uc5d0\uc11c\ub294 \uacc4\uc88c\ubc88\ud638\ub97c \ud1b5\ud574 ID\ub97c \uba3c\uc800 \uc2dd\ubcc4\ud55c \ud6c4, \ud574\ub2f9 ID\ub97c \uae30\ubc18\uc73c\ub85c \ub370\uc774\ud130\uc5d0 \uc811\uadfc\ud568\uc73c\ub85c\uc368 \uc2dc\uc2a4\ud15c \ub0b4\ubd80 \uad6c\uc870\ub97c \uc740\ub2c9\ud558\uace0 \uc2dd\ubcc4\uc790 \ub178\ucd9c\ub85c \uc778\ud55c \ubcf4\uc548 \ub9ac\uc2a4\ud06c\ub97c \ucd5c\uc18c\ud654\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<pre id=\"code_1768286374833\" class=\"java\" data-ke-language=\"java\" data-ke-type=\"codeblock\"><code>\/\/ \uac1c\uc120\ub41c \ub85c\uc9c1: ID \uc2dd\ubcc4 \ud6c4, \ub77d \ud68d\ub4dd \uc2dc\uc810\uc5d0 \ucd5c\uc2e0 \uc5d4\ud2f0\ud2f0 \ub85c\ub4dc\nLong fromAccountId = accountRepository.findIdByAccountNo(fromAccountNo);\nLong toAccountId = accountRepository.findIdByAccountNo(toAccountNo);\n\n\/\/ PK \uae30\ubc18 \ub77d \ud68d\ub4dd \uc2dc\uc810\uc5d0 \ucd5c\uc2e0 \uc0c1\ud0dc\uc758 \uc5d4\ud2f0\ud2f0\ub97c \uc601\uc18d\uc131 \ucee8\ud14d\uc2a4\ud2b8\uc5d0 \ub85c\ub4dc\nAccount firstLockedAccount = accountRepository.findLockedByAccountId(firstId);\nAccount secondLockedAccount = accountRepository.findLockedByAccountId(secondId);<\/code><\/pre>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\"><b>3.3 \uba71\ub4f1\uc131 \uc774\uc911 \ubc29\uc5b4<\/b><\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ub124\ud2b8\uc6cc\ud06c \uc9c0\uc5f0\uc73c\ub85c \uc778\ud55c \uc911\ubcf5 \uc694\uccad\uc740 \uae08\uc804\uc801 \uc0ac\uace0\ub85c \uc774\uc5b4\uc9d1\ub2c8\ub2e4. \uc774\ub97c \ub9c9\uae30 \uc704\ud574 \uc774\uc911 \ubc29\uc5b4\ub9c9\uc744 \uad6c\ucd95\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<table style=\"border-collapse: collapse; width: 100%; height: 72px;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr style=\"height: 18px;\">\n<td style=\"width: 22.6744%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\uad6c\ubd84<\/span><\/td>\n<td style=\"width: 77.3256%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc124\uba85<\/span><\/td>\n<\/tr>\n<tr style=\"height: 36px;\">\n<td style=\"width: 22.6744%; height: 36px;\"><span style=\"font-family: 'Nanum Gothic';\">Application Level(Redis)<\/span><\/td>\n<td style=\"width: 77.3256%; height: 36px;\"><span style=\"font-family: 'Nanum Gothic';\">SETNX\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub3d9\uc77c\ud55c transaction_request_id\ub85c \ub4e4\uc5b4\uc624\ub294 \uc694\uccad\uc740 1\ucd08\uac04 \ub77d\ud0b9\ud558\uc5ec 1\ucc28 \ucc28\ub2e8\ud569\ub2c8\ub2e4.<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 22.6744%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">Database Level<\/span><\/td>\n<td style=\"width: 77.3256%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc720\ub2c8\ud06c \uc81c\uc57d \uc870\uac74\uc744 \ud1b5\ud574 \ub3d9\uc77c \uc694\uccad\uc774 DB\uc5d0 \uc911\ubcf5 \uc800\uc7a5\ub418\ub294 \uac83\uc744 \ub9c9\uc2b5\ub2c8\ub2e4.<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uba71\ub4f1\uc131\uc740 \uc911\ubcf5 \uc694\uccad\uc744 \ub9c9\ub294 \uac83\uc744 \ub118\uc5b4 \uc5ec\ub7ec \ubc88 \uc694\uccad\ud574\ub3c4 \uc77c\uad00\ub41c \uacb0\uacfc\ub97c \ubc1b\ub294 \uac83\uae4c\uc9c0 \ud3ec\ud568\ud574\uc57c \ud55c\ub2e4\uace0 \ud310\ub2e8\ud588\uc2b5\ub2c8\ub2e4. \ub77d \ud68d\ub4dd \uc2e4\ud328 \uc2dc \uc5d0\ub7ec\ub97c \ub0b4\uc9c0 \uc54a\uace0 DB\ub97c \uc870\ud68c\ud574 \uc774\ubbf8 \uc644\ub8cc\ub41c \uc694\uccad\uc774\uba74 \uae30\uc874 \uacb0\uacfc\ub97c \ubc18\ud658\ud558\uace0 \uc9c4\ud589 \uc911\uc774\uba74 '\ucc98\ub9ac \uc911' \uc751\ub2f5\uc744 \ub0b4\ub824\uc8fc\uc5c8\uc2b5\ub2c8\ub2e4. \ud504\ub860\ud2b8\uc5d4\ub4dc\ub294 \uc774\ub97c \uae30\ubc18\uc73c\ub85c \ub85c\ub529 UI\ub97c \ub178\ucd9c\ud558\uac70\ub098 \ud3f4\ub9c1\uc744 \uc218\ud589\ud558\uc5ec, \uc911\ubcf5 \ud074\ub9ad \uc2dc\uc5d0\ub3c4 \ucd5c\uc885\uc801\uc73c\ub85c \ub3d9\uc77c\ud55c \uc131\uacf5 \ud654\uba74\uc744 \ubcf4\uac8c \uc124\uacc4\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>4. \uae30\uc220\uc801 \ud2b8\ub808\uc774\ub4dc\uc624\ud504<\/b><\/span><\/h3>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\"><b>4.1 Redis vs MySQL Native<\/b><\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uba71\ub4f1\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud55c \uc124\uacc4 \uacfc\uc815\uc5d0\uc11c&nbsp;Redis \ubd84\uc0b0 \ub77d\uacfc MySQL\uc758 INSERT IGNORE<span style=\"color: #333333; text-align: start;\"> \ubc29\uc2dd \uc0ac\uc774\uc5d0\uc11c \uace0\ubbfc\uc774 \uc788\uc5c8\uc2b5\ub2c8\ub2e4<\/span><span style=\"color: #333333; text-align: start;\">.<\/span><\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"color: #333333; text-align: start; font-family: 'Nanum Gothic';\">MySQL Native \ubc29\uc2dd\uc744 \ud65c\uc6a9\ud558\uba74 \ubcc4\ub3c4\uc758 Redis \uc778\ud504\ub77c \uad6c\ucd95 \uc5c6\uc774\ub3c4 \ucda9\ubd84\ud788 \uba71\ub4f1\uc131\uc744 \ubcf4\uc7a5\ud560 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\uc2b5\ub2c8\ub2e4. \uc0ac\uc804 \uc870\ud68c \uacfc\uc815 \uc5c6\uc774 \ubc14\ub85c \uc0bd\uc785\uc744 \uc2dc\ub3c4\ud574 \ub124\ud2b8\uc6cc\ud06c \uc655\ubcf5 \ud69f\uc218\ub97c \uc904\uc77c \uc218 \uc788\uace0, \uc911\ubcf5 \uc2dc\uc5d0\ub3c4 \uc608\uc678 \ub300\uc2e0 \ub2e8\uc21c\ud788 0\uc744 \ubc18\ud658\ubc1b\uc544 \ucc98\ub9ac\ud558\ub294 \ubc29\uc2dd\uc774 \ub9e4\uc6b0 \ud6a8\uc728\uc801\uc778 \uc804\ub7b5\uc774\ub77c\uace0 \ud310\ub2e8\ud588\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. \ucd94\uac00 \uc778\ud504\ub77c \uc6b4\uc601 \ubd80\ub2f4 \uc5c6\uc774 DB\uac00 \uc81c\uacf5\ud558\ub294 \uae30\ub2a5\ub9cc\uc73c\ub85c \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\ub2e4\ub294 \uc810\ub3c4 \ud070 \uc7a5\uc810\uc774\uc5c8\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"color: #333333; text-align: start; font-family: 'Nanum Gothic';\">\ud558\uc9c0\ub9cc \uace0\ubbfc \ub05d\uc5d0 \uc778\ud504\ub77c \ubcf5\uc7a1\ub3c4\uac00 \ub192\uc544\uc9c0\ub354\ub77c\ub3c4 Redis\ub97c \ud65c\uc6a9\ud55c \uc774\uc911 \ubc29\uc5b4 \uc804\ub7b5\uc744 \uc120\ud0dd\ud588\uc2b5\ub2c8\ub2e4. \uadf8 \uc774\uc720\ub294 \ud575\uc2ec \uc790\uc6d0\uc778 DB\uc758 \ubd80\ud558\ub97c \ub0ae\ucd94\ub294 \uac83\uc774 \ub354 \uc911\uc694\ud558\ub2e4\uace0 \ubcf4\uc558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. \uc1a1\uae08 \uc11c\ube44\uc2a4\ucc98\ub7fc \ud2b8\ub798\ud53d\uc774 \uc9d1\uc911\ub418\ub294 \ud658\uacbd\uc5d0\uc11c DB \ucee4\ub125\uc158\uacfc \ub77d\uc740 \ub9e4\uc6b0 \ud55c\uc815\uc801\uc778 \uc790\uc6d0\uc785\ub2c8\ub2e4. \uc911\ubcf5 \uc694\uccad\uc774 \uc654\uc744 \ub54c, DB \ud2b8\ub79c\uc7ad\uc158\uc744 \uc2dc\uc791\ud558\uae30 \uc804 \ub2e8\uacc4\uc778 Redis\uc5d0\uc11c \uc694\uccad\uc744 \uc120\uc81c\uc801\uc73c\ub85c \ucc28\ub2e8\ud568\uc73c\ub85c\uc368 \uc6d0\ucc9c DB\ub97c \ubcf4\ud638\ud558\uace0 \uc2f6\uc5c8\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uacb0\uad6d \uc2dc\uc2a4\ud15c\uc758 \ubcf5\uc7a1\ub3c4\ub294 \ub2e4\uc18c \ub192\uc544\uc9c0\ub354\ub77c\ub3c4, DB\uc758 \uc548\uc815\uc131\uc744 \ucd5c\uc6b0\uc120\uc73c\ub85c \uace0\ub824\ud558\uc5ec \ubd80\ud558\ub97c \ubd84\uc0b0\uc2dc\ud0a4\ub294 \uad6c\uc870\ub97c \uac16\ucd94\ub294 \uac83\uc774 \uae08\uc735 \uc2dc\uc2a4\ud15c\uc5d0 \ub354 \uc801\ud569\ud55c \uc120\ud0dd\uc774\ub77c\uace0 \ud310\ub2e8\ud558\uc5ec Redis \uae30\ubc18\uc758 \uc124\uacc4\ub97c \ucd5c\uc885\uc801\uc73c\ub85c \ucc44\ud0dd\ud558\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\"><b>4.2 \ub2e4\uc911 \ub77d (\uacc4\uc88c \ub77d + \uc77c\uc77c \ud55c\ub3c4 \ub77d)<\/b><\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uacc4\uc88c \ub77d\uc5d0 \uc774\uc5b4, \uc77c\uc77c \ud55c\ub3c4(AccountDailyLimitUsage)\ub97c \uc870\ud68c&middot;\uc0dd\uc131(\uc5c6\uc73c\uba74 \uc0dd\uc131)\ud558\ub294 \uacfc\uc815\uc5d0\uc11c\ub3c4 \ube44\uad00\uc801 \ub77d\uc744 \uc801\uc6a9\ud560\uc9c0 \uc5ec\ubd80\ub294 \uc774\ubc88 \uc124\uacc4\uc5d0\uc11c \uac00\uc7a5 \ud070 \uace0\ubbfc \uc911 \ud558\ub098\uc600\uc2b5\ub2c8\ub2e4. \uc774\uccb4 \ub85c\uc9c1\uc740 \uc774\ubbf8 \ub450 \uacc4\uc88c\uc5d0 \ub300\ud574 \ub77d\uc744 \ud68d\ub4dd\ud55c \uc0c1\ud0dc\uc5d0\uc11c \uc9c4\ud589\ub418\uae30 \ub54c\ubb38\uc5d0, \uc5ec\uae30\uc5d0 \ud55c\ub3c4 \ud14c\uc774\ube14\uae4c\uc9c0 \ucd94\uac00\ub85c \ub77d\uc744 \uc7a1\uc73c\uba74 DB \ucee4\ub125\uc158 \uc810\uc720 \uc2dc\uac04\uacfc \ub77d \ub300\uae30 \uc2dc\uac04\uc774 \ub298\uc5b4\ub098 \uc804\uccb4 \ucc98\ub9ac\ub7c9\uc774 \ub5a8\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-end=\"1124\" data-start=\"914\" data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc131\ub2a5\ub9cc \uace0\ub824\ud55c\ub2e4\uba74 \ud55c\ub3c4 \uc870\ud68c\ub97c \ub77d \uc5c6\uc774 \uc218\ud589\ud558\ub294 \ud3b8\uc774 \uc720\ub9ac\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uae08\uc735 \uc11c\ube44\uc2a4\uc5d0\uc11c &lsquo;\uc77c\uc77c \ud55c\ub3c4&rsquo;\ub294 \ubcf4\uc548 \ubc0f \uaddc\uc81c\uc640 \uc9c1\uacb0\ub41c \ud575\uc2ec \ube44\uc988\ub2c8\uc2a4 \uaddc\uce59\uc774\uba70, \ud55c \ubc88\uc774\ub77c\ub3c4 \ucd08\uacfc\ub418\uba74 \uc2ec\uac01\ud55c \uc0ac\uace0\ub85c \uc774\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub77d\uc744 \ud3ec\uae30\ud558\uba74 \uc9e7\uc740 \uc21c\uac04\uc5d0 \ub3d9\uc2dc \uc694\uccad\ub4e4\uc774 \ud55c\ub3c4 \uccb4\ud06c\ub97c \ub3d9\uc2dc\uc5d0 \ud1b5\uacfc\ud558\ub294 \ub808\uc774\uc2a4 \ucee8\ub514\uc158\uc774 \ubc1c\uc0dd\ud560 \uc218 \uc788\uace0, \uadf8 \uacb0\uacfc \uc124\uc815\ub41c \ud55c\ub3c4\ub97c \ucd08\uacfc\ud55c \uc774\uccb4\uac00 \uc2e4\ud589\ub420 \uc704\ud5d8\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p data-end=\"1124\" data-start=\"914\" data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-end=\"1258\" data-start=\"1126\" data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uacb0\uad6d \uc800\ub294 \uc131\ub2a5 \ube44\uc6a9\uc744 \uac10\uc218\ud558\ub354\ub77c\ub3c4 \ud55c\ub3c4 \uc870\ud68c \ub2e8\uacc4\uc5d0\uc11c\ub3c4 \ube44\uad00\uc801 \ub77d\uc744 \uc801\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud588\uc2b5\ub2c8\ub2e4. \ucc98\ub9ac \uc18d\ub3c4\ubcf4\ub2e4 &ldquo;\ud55c\ub3c4\ub294 \ubc18\ub4dc\uc2dc \uc9c0\ucf1c\uc838\uc57c \ud55c\ub2e4&rdquo;\ub294 \uc6d0\uce59\uc744 \uc6b0\uc120\ud588\uace0, \ub77d\uc744 \ud1b5\ud574 \ud55c\ub3c4 \ub204\uc801\uacfc \uc774\uccb4 \uc2e4\ud589\uc774 \ud56d\uc0c1 \uc6d0\uc790\uc801\uc73c\ub85c \uc77c\uc5b4\ub098\ub3c4\ub85d \ubcf4\uc7a5\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<pre id=\"code_1768296418767\" class=\"java\" data-ke-language=\"java\" data-ke-type=\"codeblock\"><code>private DailyLimitUsage getOrCreateUsage(Long accountId, LocalDate today) {\n    return dailyLimitUsageRepository.findLockedByAccountIdAndLimitDate(accountId, today)\n            .orElseGet(() -&gt; dailyLimitUsageRepository.save(dailyLimitUsage.init(accountId, today)));\n}<\/code><\/pre>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>5. \uac80\uc99d \ud14c\uc2a4\ud2b8<\/b><\/span><\/h3>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\"><b>5.1 \uba71\ub4f1\uc131 \ud14c\uc2a4\ud2b8<\/b><\/span><\/h4>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li data-end=\"321\" data-start=\"198\"><span style=\"font-family: 'Nanum Gothic';\">\ub3d9\uc2dc\uc5d0 \uc911\ubcf5 \ucd9c\uae08 \uc694\uccad\uc774 \uc640\ub3c4, \uc2e4\uc81c \ucd9c\uae08\uc740 \ub2e8 \ud55c \ubc88\ub9cc \ubc18\uc601\ub418\uc5b4 \uc794\uc561\uacfc \uac70\ub798 \ub0b4\uc5ed\uc774 \uc911\ubcf5 \uc0dd\uc131\ub418\uc9c0 \uc54a\uc74c\uc744 \uac80\uc99d\ud55c\ub2e4.<\/span><\/li>\n<\/ul>\n<p data-end=\"321\" data-start=\"198\" data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ub3d9\uc2dc\uc5d0 \ucd9c\uae08 \uc694\uccad 10\uac74\uc744 \ubc1c\uc0dd\ud574 \uacc4\uc88c \uc794\uc561\uc774 100,000\uc6d0\uc778 \uacc4\uc88c\uc5d0 5,000\uc6d0\uc744 \ucd9c\uae08\ud55c\ub2e4.<\/span><\/p>\n<pre id=\"code_1768282906781\" class=\"java\" data-ke-language=\"java\" data-ke-type=\"codeblock\"><code>@Test\n@DisplayName(\"\ud2b8\ub79c\uc7ad\uc158\uc694\uccad\uc544\uc774\ub514\uac00 \uac19\uc73c\uba74 \ud55c\ubc88\ub9cc \ucd9c\uae08\ud55c\ub2e4.\")\nvoid idempotent_test() throws Exception {\n \n    int requestCount = 10;\n    ExecutorService executorService = Executors.newFixedThreadPool(requestCount);\n\n    CountDownLatch readyLatch = new CountDownLatch(requestCount);\n    CountDownLatch startLatch = new CountDownLatch(1);\n    CountDownLatch endLatch = new CountDownLatch(requestCount);\n\n    AtomicInteger success = new AtomicInteger();\n    AtomicInteger fail = new AtomicInteger();\n\n    String transactionRequestId = \"c1e12a85-46c8-4bp4-cc9b-2482b9f214et\";\n\n    for (int i = 0; i &lt; requestCount; i++) {\n        executorService.submit(() -&gt; {\n            try {\n                readyLatch.countDown();\n                startLatch.await();\n                withdrawUseCase.execute(accountNo, withdrawAmount, transactionRequestId);\n                success.incrementAndGet();\n            } catch (Exception e) {\n                fail.incrementAndGet();\n            } finally {\n                endLatch.countDown();\n            }\n        });\n    }\n    readyLatch.await();\n    startLatch.countDown();\n    endLatch.await();\n    executorService.shutdown();\n\n    Account result = accountRepository.findById(accountId).orElseThrow();\n    Long historyCount = accountTransactionRepository.countByAccountId(accountId);\n    Transaction transaction = accountTransactionRepository.findByAccountIdAndTransactionRequestId(accountId, sameTransactionId).orElseThrow();\n\n    assertThat(result.getBalance()).isEqualTo(balance - withdrawAmount);\n\n    assertThat(fail.get()).isEqualTo(0);\n    assertThat(historyCount).isEqualTo(1);\n    assertThat(accountTransactionRepository.findByAccountIdAndTransactionRequestId(accountId, transactionRequestId)).isPresent();\n}<\/code><\/pre>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1306\" data-origin-height=\"318\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/cZSl7D\/dJMcadOdu9p\/0rg35joc2ZypbHToMRbCnk\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/cZSl7D\/dJMcadOdu9p\/0rg35joc2ZypbHToMRbCnk\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/cZSl7D\/dJMcadOdu9p\/0rg35joc2ZypbHToMRbCnk\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZSl7D%2FdJMcadOdu9p%2F0rg35joc2ZypbHToMRbCnk%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1306\" height=\"318\" data-origin-width=\"1306\" data-origin-height=\"318\"\/><\/span><\/figure>\n<\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\"><b>5.2. \ub3d9\uc2dc\uc131 \ud14c\uc2a4\ud2b8<\/b><\/span><\/h4>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li><span style=\"font-family: 'Nanum Gothic';\">\ub2e4\uc218\uc758 \uc1a1\uae08 \uc694\uccad\uc774 \ub3d9\uc2dc\uc5d0 \ubc1c\uc0dd\ud574\ub3c4 \uc794\uc561 \uc815\ud569\uc131\uc774 \uae68\uc9c0\uc9c0 \uc54a\uace0, \ubaa8\ub4e0 \uc694\uccad\uc774 \uc815\ud655\ud788 \ud55c \ubc88\uc529 \ubc18\uc601\ub418\ub294\uc9c0\ub97c \uac80\uc99d\ud55c\ub2e4.<\/span><\/li>\n<\/ul>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ub3d9\uc2dc\uc5d0 \uc774\uccb4 \uc694\uccad 100\uac74\uc744 \ubc1c\uc0dd\ud574 \uc794\uc561\uc774 \uac01\uac01 1,000,000\uc6d0\uc778 \uacc4\uc88c A\uc5d0\uc11c \uacc4\uc88c B\ub85c 10,000\uc6d0\uc744 \uc1a1\uae08\ud55c\ub2e4.<\/span><br \/><span style=\"font-family: 'Nanum Gothic';\">\ubaa8\ub4e0 \uc694\uccad\uc774 \uc131\uacf5\ud588\uc744 \ub54c \uacc4\uc88c A\uc758 \uc794\uc561\uc740 0\uc6d0, \uacc4\uc88c B\uc758 \uc794\uc561\uc740 2,000,000\uc6d0\uc774 \ub418\uc5b4\uc57c \ud55c\ub2e4.<\/span><\/p>\n<pre id=\"code_1768283465868\" class=\"java\" data-ke-language=\"java\" data-ke-type=\"codeblock\"><code>@Test\n@DisplayName(\"A\uc5d0\uc11c B\ub85c 100\uba85\uc774 \ub3d9\uc2dc\uc5d0 1\ub9cc\uc6d0\uc529 \uc1a1\uae08\ud558\uba74 A\ub294 0\uc6d0, B\ub294 200\ub9cc\uc6d0\uc774 \ub41c\ub2e4.\")\nvoid transfer_test() throws Exception {\n    int threadCount = 100;\n    long transferAmount = 10_000L;\n\n    ExecutorService executorService = Executors.newFixedThreadPool(threadCount);\n    CountDownLatch latch = new CountDownLatch(threadCount);\n    AtomicInteger successCount = new AtomicInteger();\n\n    for (int i = 0; i &lt; threadCount; i++) {\n        executorService.submit(() -&gt; {\n            try {\n                transferUseCase.execute(accountNoA, accountNoB, transferAmount, UUID.randomUUID().toString());\n                successCount.incrementAndGet();\n            } catch (Exception e) {\n                System.err.println(\"Transfer failed: \" + e.getMessage());\n            } finally {\n                latch.countDown();\n            }\n        });\n    }\n\n    latch.await();\n    executorService.shutdown();\n\n    Account finalA = accountRepository.findById(accountIdA).orElseThrow();\n    Account finalB = accountRepository.findById(accountIdB).orElseThrow();\n\n    assertThat(successCount.get()).isEqualTo(threadCount);\n    assertThat(finalA.getBalance()).isEqualTo(0L);\n    assertThat(finalB.getBalance()).isEqualTo(2_000_000L);\n    \/\/ \ud2b8\ub79c\uc7ad\uc158 \uae30\ub85d\uc740 \ucd9c\uae08\/\uc785\uae08 \uc30d\uc73c\ub85c \ucd1d 200\uac74\uc774\uc5b4\uc57c \ud568\n    assertThat(transactionRepository.count()).isEqualTo(threadCount * 2);\n}<\/code><\/pre>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1396\" data-origin-height=\"158\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/bz3QFn\/dJMcabv9P7P\/vyz2gLQKaf5JM0shW2hXbk\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/bz3QFn\/dJMcabv9P7P\/vyz2gLQKaf5JM0shW2hXbk\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/bz3QFn\/dJMcabv9P7P\/vyz2gLQKaf5JM0shW2hXbk\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz3QFn%2FdJMcabv9P7P%2Fvyz2gLQKaf5JM0shW2hXbk%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1396\" height=\"158\" data-origin-width=\"1396\" data-origin-height=\"158\"\/><\/span><\/figure>\n<\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\"><b>5.3 \ub370\ub4dc\ub77d \ud14c\uc2a4\ud2b8<\/b><\/span><\/h4>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li><span style=\"font-family: 'Nanum Gothic';\">A&rarr;B, B&rarr;A \uad50\ucc28 \uc1a1\uae08 \uc2dc\ub098\ub9ac\uc624\ub97c \ud1b5\ud574 \ub370\ub4dc\ub77d \ubc29\uc9c0 \ub85c\uc9c1\uc744 \uac80\uc99d\ud55c\ub2e4.<\/span><\/li>\n<\/ul>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uacc4\uc88c A, B (\uc794\uc561 1,000,000\uc6d0)\uc73c\ub85c A &rarr; B\ub85c 10,000\uc6d0 \uc1a1\uae08 (50\ud68c), B &rarr; A\ub85c 10,000\uc6d0 \uc1a1\uae08 (50\ud68c) \ud55c\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ucd5c\uc885 \uc794\uc561\uc740 \uac01\uac01 1,000,000\uc6d0(\ubcf4\ub0b8 \ub3c8 50\ub9cc, \ubc1b\uc740 \ub3c8 50\ub9cc)\uc73c\ub85c \uc720\uc9c0\ub418\uc5b4\uc57c \ud55c\ub2e4.<\/span><\/p>\n<pre id=\"code_1768291906424\" class=\"java\" data-ke-language=\"java\" data-ke-type=\"codeblock\"><code>@Test\n@DisplayName(\"A&rarr;B\uc640 B&rarr;A \uc1a1\uae08\uc774 \ub3d9\uc2dc\uc5d0 100\uac74 \ubc1c\uc0dd\ud574\ub3c4 \ub370\ub4dc\ub77d \uc5c6\uc774 \uc815\ud569\uc131\uc774 \uc720\uc9c0\ub41c\ub2e4.\")\nvoid deadlock_prevention_test() throws Exception {\n    \/\/ given\n    int threadCount = 100; \/\/ \ucd1d 100\ubc88\uc758 \uc1a1\uae08 (A-&gt;B 50\ubc88, B-&gt;A 50\ubc88)\n    long transferAmount = 10_000L;\n\n    ExecutorService executorService = Executors.newFixedThreadPool(32);\n    CountDownLatch latch = new CountDownLatch(threadCount);\n\n    AtomicInteger successCount = new AtomicInteger();\n    AtomicInteger failCount = new AtomicInteger();\n\n    \/\/ when\n    for (int i = 0; i &lt; threadCount; i++) {\n        boolean isAtoB = (i % 2 == 0); \/\/ \uc808\ubc18\uc740 A-&gt;B, \uc808\ubc18\uc740 B-&gt;A\n        String fromNo = isAtoB ? accountNoA : accountNoB;\n        String toNo = isAtoB ? accountNoB : accountNoA;\n\n        executorService.submit(() -&gt; {\n            try {\n                \/\/ \uac01 \uc694\uccad\ub9c8\ub2e4 \uace0\uc720\ud55c requestId(UUID) \uc0dd\uc131\n                transferUseCase.execute(fromNo, toNo, transferAmount, UUID.randomUUID().toString());\n                successCount.incrementAndGet();\n            } catch (Exception e) {\n                failCount.incrementAndGet();\n                System.err.println(\"Transfer failed: \" + e.getMessage());\n            } finally {\n                latch.countDown();\n            }\n        });\n    }\n\n    latch.await();\n    executorService.shutdown();\n\n    \/\/ then\n    Account finalA = accountRepository.findById(accountIdA).orElseThrow();\n    Account finalB = accountRepository.findById(accountIdB).orElseThrow();\n\n    \/\/ 1. \ubaa8\ub4e0 \uc694\uccad\uc774 \uc131\uacf5\ud588\ub294\uc9c0 \ud655\uc778 (\ub370\ub4dc\ub77d \ubc1c\uc0dd \uc2dc \uc77c\ubd80 \ud0c0\uc784\uc544\uc6c3\/\uc2e4\ud328 \ubc1c\uc0dd)\n    assertThat(successCount.get()).isEqualTo(threadCount);\n    assertThat(failCount.get()).isEqualTo(0);\n\n    \/\/ 2. \ucd5c\uc885 \uc794\uc561 \uac80\uc99d\n    \/\/ A: 100\ub9cc - (50\ubc88 * 1\ub9cc) + (50\ubc88 * 1\ub9cc) = 100\ub9cc\n    \/\/ B: 100\ub9cc - (50\ubc88 * 1\ub9cc) + (50\ubc88 * 1\ub9cc) = 100\ub9cc\n    assertThat(finalA.getBalance()).isEqualTo(1_000_000L);\n    assertThat(finalB.getBalance()).isEqualTo(1_000_000L);\n\n    \/\/ \ud2b8\ub79c\uc7ad\uc158 \uae30\ub85d\uc740 \ucd9c\uae08\/\uc785\uae08 \uac01 100\uac74\uc774\uc5b4\uc57c \ud568\n    assertThat(transactionRepository.countByAccountId(accountIdA)).isEqualTo(threadCount);\n    assertThat(transactionRepository.countByAccountId(accountIdB)).isEqualTo(threadCount);\n}<\/code><\/pre>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1054\" data-origin-height=\"108\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/biUW1o\/dJMcaiPxy8m\/mQk3gDsVDO205rc44hM6E1\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/biUW1o\/dJMcaiPxy8m\/mQk3gDsVDO205rc44hM6E1\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/biUW1o\/dJMcaiPxy8m\/mQk3gDsVDO205rc44hM6E1\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiUW1o%2FdJMcaiPxy8m%2FmQk3gDsVDO205rc44hM6E1%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1054\" height=\"108\" data-origin-width=\"1054\" data-origin-height=\"108\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc544\ub798\uc758 Math.min, max \uc815\ub82c \ub85c\uc9c1\uc744 \uc8fc\uc11d \ucc98\ub9ac\ud55c \ub4a4 \ud14c\uc2a4\ud2b8\ub97c \uc218\ud589\ud588\uc744 \ub54c, \ub2e4\uc74c\uacfc \uac19\uc740 \uc5d0\ub7ec \ub85c\uadf8\ub97c \ubaa9\uaca9\ud560 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"956\" data-origin-height=\"379\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/dwHHTn\/dJMcajt8z8X\/4lutFb0mL7rMU5590IhJ60\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/dwHHTn\/dJMcajt8z8X\/4lutFb0mL7rMU5590IhJ60\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/dwHHTn\/dJMcajt8z8X\/4lutFb0mL7rMU5590IhJ60\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwHHTn%2FdJMcajt8z8X%2F4lutFb0mL7rMU5590IhJ60%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"956\" height=\"379\" data-origin-width=\"956\" data-origin-height=\"379\"\/><\/span><\/figure>\n<figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1643\" data-origin-height=\"86\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/bmnA6a\/dJMcabbQYHR\/kpkN52a0RrPjxCzVdNx2w1\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/bmnA6a\/dJMcabbQYHR\/kpkN52a0RrPjxCzVdNx2w1\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/bmnA6a\/dJMcabbQYHR\/kpkN52a0RrPjxCzVdNx2w1\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmnA6a%2FdJMcabbQYHR%2FkpkN52a0RrPjxCzVdNx2w1%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1643\" height=\"86\" data-origin-width=\"1643\" data-origin-height=\"86\"\/><\/span><\/figure>\n<\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>6. \ub9c8\uce58\uba70<\/b><\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic'; color: #333333;\">\uc774\ubc88 \uc1a1\uae08 \uc2dc\uc2a4\ud15c\uc744 \uad6c\ud604\ud558\uba70 \uac00\uc7a5 \ud06c\uac8c \ub290\ub080 \uc810\uc740 <b>\uae30\uc220\uc740 \ub2e8\uc21c\ud55c \ub3c4\uad6c\uc77c \ubfd0\uc774\uace0, \ube44\uc988\ub2c8\uc2a4\uc758 \uc131\uaca9\uacfc \uc6b0\uc120\uc21c\uc704\uc5d0 \ub530\ub77c \ucd5c\uc120\uc758 \uc120\ud0dd\uc740 \ub2ec\ub77c\uc9c4\ub2e4<\/b>\ub294 \uac83\uc785\ub2c8\ub2e4. \uae08\uc735 \uc11c\ube44\uc2a4\uc5d0\uc11c\ub294 \uae30\ub2a5\uc744 \ube60\ub974\uac8c \uc644\uc131\ud558\ub294 \uac83\ubcf4\ub2e4 <b>\ub370\uc774\ud130 \ubb34\uacb0\uc131\uc744 \ub05d\uae4c\uc9c0 \uc9c0\ucf1c\ub0b4\ub294 \uc124\uacc4<\/b>\uac00 \ub354 \uc911\uc694\ud558\ub2e4\ub294 \uac83\uc744 \ub2e4\uc2dc \ud55c \ubc88 \ud655\uc778\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-end=\"444\" data-start=\"179\" data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic'; color: #333333;\">\ub3d9\uc2dc\uc131 \uc81c\uc5b4\ub97c \uc704\ud574 \ube44\uad00\uc801 \ub77d\uc744 \uc120\ud0dd\ud558\uace0, \uc774\uccb4 \uc2dc\uc5d0\ub294 \ub77d \uc21c\uc11c\ub97c \uace0\uc815\ud574 \ub370\ub4dc\ub77d\uc744 \ubc29\uc9c0\ud588\uc73c\uba70, \uc601\uc18d\uc131 \ucee8\ud14d\uc2a4\ud2b8\ub85c \uc778\ud574 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub294 \uac31\uc2e0 \uc720\uc2e4 \ubb38\uc81c\uae4c\uc9c0 \uc9c1\uc811 \uacaa\uc73c\uba70 <b>\ub77d \ud68d\ub4dd \uc2dc\uc810\uacfc \uc5d4\ud2f0\ud2f0 \ub85c\ub4dc \uc2dc\uc810\uc744 \uc77c\uce58\uc2dc\ud0a4\ub294 \uc124\uacc4\uc758 \uc911\uc694\uc131<\/b>\uc744 \uccb4\ub4dd\ud588\uc2b5\ub2c8\ub2e4. \ub610\ud55c \uba71\ub4f1\uc131\uc740 \uc911\ubcf5\uc744 \ub9c9\ub294 \uac83\uc744 \ub118\uc5b4, \uc5ec\ub7ec \ubc88 \uc694\uccad\ud558\ub354\ub77c\ub3c4 \ud56d\uc0c1 \ub3d9\uc77c\ud55c \uacb0\uacfc\ub85c \uc218\ub834\ud558\ub3c4\ub85d \ub9cc\ub4dc\ub294 UX\uae4c\uc9c0 \ud3ec\ud568\ub418\uc5b4\uc57c \ud55c\ub2e4\uace0 \ud310\ub2e8\ud588\uace0, \uc774\ub97c \uc704\ud574 Redis \uc120\ucc28\ub2e8\uacfc DB \uc720\ub2c8\ud06c \uc81c\uc57d\uc744 \uacb0\ud569\ud55c \uc774\uc911 \ubc29\uc5b4 \uad6c\uc870\ub97c \uc801\uc6a9\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p data-end=\"444\" data-start=\"179\" data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-is-only-node=\"\" data-is-last-node=\"\" data-end=\"573\" data-start=\"446\" data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic'; color: #333333;\">\uc774 \uacfc\uc815\uc744 \ud1b5\ud574 \uc124\uacc4 \uad00\uc810\uc774 \ud55c\uce35 \ub354 \uc131\uc7a5\ud55c \uae30\ubd84\uc774\uba70, \uc55e\uc73c\ub85c\ub294 Outbox \ud328\ud134, \ud0c0\uc784\uc544\uc6c3\/\ubc31\uc624\ud504 \uc815\ucc45, \uc7a5\uc560&middot;\ub3d9\uc2dc\uc131 \ub4f1 \ub2e4\uc591\ud55c \uc2dc\ub098\ub9ac\uc624 \ud14c\uc2a4\ud2b8\uae4c\uc9c0 \ud655\uc7a5\ud574 \ubcf4\uba74\uc11c \uc6b4\uc601 \uad00\uc810\uc5d0\uc11c\ub3c4 \ub354 \uc2e0\ub8b0\ud560 \uc218 \uc788\ub294 \uad6c\uc870\ub85c \ubc1c\uc804\uc2dc\ucf1c\ubcf4\ub824\uace0 \ud569\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>","category":"Backend","author":"seungwonlee","guid":"https:\/\/seungwontech.tistory.com\/127","comments":"https:\/\/seungwontech.tistory.com\/127#entry127comment","pubDate":"Tue, 13 Jan 2026 16:17:34 +0900"},{"title":"\ube44\uad00\uc801 \ub77d\uc740 \ub300\uae30\uc9c0\uc625, \ub099\uad00\uc801 \ub77d\uc740 \uc7ac\uc2dc\ub3c4\uc9c0\uc625\uc774\uc5c8\ub2e4","link":"https:\/\/seungwontech.tistory.com\/126","description":"<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic'; color: #000000;\">\uc120\ucc29\uc21c 100\uba85\uc5d0\uac8c \ucfe0\ud3f0\uc744 \uc9c0\uae09\ud558\ub294 \uc774\ubca4\ud2b8. \ub2e8\uc21c\ud574 \ubcf4\uc774\uc9c0\ub9cc, \uc21c\uac04\uc801\uc73c\ub85c \uc218\ub9cc \uba85\uc774 &ldquo;\uad11\ud074&rdquo;\uc744 \uc2dc\uc791\ud558\uba74 \uc11c\ubc84\ub294 \uc544\uc218\ub77c\uc7a5\uc774 \ub41c\ub2e4. \uc774 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574 \uace0\ubbfc\ud588\ub358 \uacfc\uc815\uacfc \ub0b4\uac00 \uc120\ud0dd\ud55c \ud574\uacb0\ucc45\uc744 \uc815\ub9ac\ud574 \ubcf8\ub2e4.<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"color: #000000;\"><b><span style=\"font-family: 'Nanum Gothic';\">1. \uc694\uad6c\uc0ac\ud56d<\/span><\/b><\/span><\/h3>\n<ol style=\"list-style-type: decimal;\" data-ke-list-type=\"decimal\">\n<li><span style=\"font-family: 'Nanum Gothic'; color: #000000;\">\uc120\ucc29\uc21c\uc73c\ub85c 100\uba85\uc5d0\uac8c \ud560\uc778 \ucfe0\ud3f0\uc744 \uc81c\uacf5\ud55c\ub2e4.<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic'; color: #000000;\">101\uac1c \uc774\uc0c1\uc774 \uc9c0\uae09\ub418\uba74 \uc548 \ub41c\ub2e4.<\/span><\/li>\n<li><span style=\"font-family: 'Nanum Gothic'; color: #000000;\">\uc21c\uac04\uc801\uc73c\ub85c \ubab0\ub9ac\ub294 \ud2b8\ub798\ud53d\uc744 \uac10\ub2f9\ud574\uc57c \ud55c\ub2e4.<\/span><\/li>\n<\/ol>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic'; color: #000000;\"><b>2. \ub3d9\uc2dc\uc131 \uc81c\uc5b4, \uc5b4\ub5a4 \ub3c4\uad6c\ub97c \uc4f8 \uac83\uc778\uac00?&nbsp;<\/b><\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic'; color: #000000;\">\uac00\uc7a5 \uba3c\uc800 \ub5a0\uc624\ub978 3\uac00\uc9c0 \ubc29\ubc95\uc758 \ud55c\uacc4\ub97c \uc815\ub9ac\ud574 \ubd24\ub2e4.<\/span><\/p>\n<h4 data-ke-size=\"size20\"><span style=\"color: #000000;\"><b><span style=\"font-family: 'Nanum Gothic';\">1\ufe0f\u20e3 synchronized<\/span><\/b><\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic'; color: #000000;\">synchronized\ub294 JVM \ub0b4\ubd80\uc5d0\uc11c\ub9cc \ub3d9\uc791\ud558\ub294 \ub77d\uc774\ub2e4. \ub2e8\uc77c \uc11c\ubc84\uc5d0\uc11c\ub294 \ub3d9\uc2dc\uc131 \ubb38\uc81c\ub97c \ub9c9\uc744 \uc218 \uc788\uc9c0\ub9cc, \uc11c\ubc84\uac00 \uc5ec\ub7ec \ub300\ub85c \ud655\uc7a5\ub418\uba74 \ub77d\uc774 \uacf5\uc720\ub418\uc9c0 \uc54a\ub294\ub2e4. \uadf8 \uacb0\uacfc \uc5ec\ub7ec \uc11c\ubc84\uc5d0\uc11c \ubc1c\uae09 \ub85c\uc9c1\uc774 \ub3d9\uc2dc\uc5d0 \uc2e4\ud589\ub418\uc5b4 \uc911\ubcf5 \ubc1c\uae09(\uacbd\uc7c1 \uc870\uac74)\uc774 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4.<\/span><\/p>\n<h4 data-ke-size=\"size20\"><span style=\"color: #000000;\"><b><span style=\"font-family: 'Nanum Gothic';\">2\ufe0f\u20e3 \ube44\uad00\uc801 \ub77d (\ub300\uae30\uc9c0\uc625)<\/span><\/b><\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic'; color: #000000;\">\ub77d\uc73c\ub85c \ubaa8\ub4e0 \uc694\uccad\uc744 \uc21c\ucc28 \ucc98\ub9ac\ud558\uba74 \uc815\ud569\uc131\uc740 \ubcf4\uc7a5\ub41c\ub2e4. \ud558\uc9c0\ub9cc \ud2b8\ub798\ud53d\uc774 \ubab0\ub9ac\uba74 \ub300\uae30 \uc2dc\uac04\uc774 \uae09\uaca9\ud788 \uc99d\uac00\ud558\uace0, \uc9c0\uc5f0\/\ud0c0\uc784\uc544\uc6c3\uc774 \ubc1c\uc0dd\ud574 \uc0ac\uc6a9\uc790 \uacbd\ud5d8\uc774 \ud06c\uac8c \ub098\ube60\uc9c8 \uc218 \uc788\ub2e4. \uc18c\uaddc\ubaa8\ub77c\uba74 \uac00\ub2a5\ud558\uc9c0\ub9cc \ub300\uaddc\ubaa8 \uc120\ucc29\uc21c\uc5d0\ub294 \ubcd1\ubaa9\uc774 \ub418\uae30 \uc27d\ub2e4.<\/span><\/p>\n<h4 data-ke-size=\"size20\"><span style=\"color: #000000;\"><b><span style=\"font-family: 'Nanum Gothic';\">3\ufe0f\u20e3 \ub099\uad00\uc801 \ub77d (\ubb34\ud55c\uc9c0\uc625)<\/span><\/b><\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic'; color: #000000;\">version\uc73c\ub85c \ub3d9\uc2dc \uc218\uc815 \ucda9\ub3cc\uc744 \uac10\uc9c0\ud574 \ucda9\ub3cc \uc2dc \uc5c5\ub370\uc774\ud2b8\ub97c \uc2e4\ud328\uc2dc\ud0a4\ub294 \ubc29\uc2dd\uc774\uba70, \ubcf4\ud1b5 \uc7ac\uc2dc\ub3c4\uc640 \ud568\uaed8 \uc0ac\uc6a9\ub41c\ub2e4. \ud558\uc9c0\ub9cc \uc120\ucc29\uc21c\ucc98\ub7fc \uac19\uc740 \uc7ac\uace0\ub97c \ub3d9\uc2dc\uc5d0 \uac31\uc2e0\ud558\uba74 \ucda9\ub3cc\uc774 \uc7a6\uc544\uc838 \uc7ac\uc2dc\ub3c4 \uc9c0\uc625\uc73c\ub85c \ube60\uc9c8 \uc218 \uc788\ub2e4. \uc11c\ubc84 \uc7ac\uc2dc\ub3c4\ub97c \ud558\uc9c0 \uc54a\ub294 \uc804\ub7b5\ub3c4 \uac00\ub2a5\ud558\uc9c0\ub9cc, \uc0ac\uc6a9\uc790\uc758 \uc5f0\ud0c0\/\uc0c8\ub85c\uace0\uce68\uc73c\ub85c \ud2b8\ub798\ud53d\uc774 \ub2e4\uc2dc \ud3ed\ubc1c\ud560 \uc218 \uc788\uc5b4 \ubcc4\ub3c4 \uc81c\uc5b4\uac00 \ud544\uc694\ud558\ub2e4.<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic'; color: #000000;\"><b><span style=\"font-size: 1.44em; letter-spacing: -1px;\">3. \uc120\ucc29\uc21c \uc774\ubca4\ud2b8\uc5d0\uc11c \uc815\ub9d0 \uc911\uc694\ud55c \uac83<\/span><\/b><\/span><\/p>\n<blockquote data-ke-style=\"style2\"><span style=\"color: #000000;\">\ucfe0\ud3f0\uc774 \uc218\ub7c9\uc744 \ucd08\uacfc\ud574 \ubc1c\uae09\ub418\uc9c0 \uc54a\ub294 \uac83\uc774\ub2e4.<\/span><\/blockquote>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic'; color: #000000;\">\uc120\ucc29\uc21c\uc5d0\uc11c \ud575\uc2ec\uc740 &ldquo;\ub204\uac00 1ms \uba3c\uc800 \ub20c\ub800\ub294\uc9c0&rdquo;\uac00 \uc544\ub2c8\ub77c \uc218\ub7c9 \uc815\ud569\uc131\uc774\ub2e4. \uc2dc\uc2a4\ud15c \uad00\uc810\uc5d0\uc11c\ub294 \ucfe0\ud3f0 \uc218\ub7c9\uc774 \ucd08\uacfc \ubc1c\uae09\ub418\uc9c0 \uc54a\ub3c4\ub85d \ubcf4\uc7a5\ud558\ub294 \uac83\uc774 \ucd5c\uc6b0\uc120\uc774\uba70, \ubaa8\ub4e0 \uc694\uccad\uc744 \uc21c\ucc28 \ucc98\ub9ac\ud560 \ud544\uc694\ub294 \uc5c6\ub2e4. \uacb0\uad6d &ldquo;\ucd1d \ubc1c\uae09 \uc218\uac00 \ud55c\ub3c4\ub97c \ub118\uc9c0 \uc54a\ub3c4\ub85d&rdquo;\ub9cc \ubcf4\uc7a5\ud558\uba74 \ub41c\ub2e4.<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic'; color: #000000;\"><b>4. Redis INCR\ub97c \uc120\ud0dd\ud55c \uc774\uc720<\/b><\/span><\/h3>\n<blockquote data-ke-style=\"style2\"><span style=\"font-family: 'Nanum Gothic'; color: #000000;\">Redis\ub294 \uc2f1\uae00 \uc2a4\ub808\ub4dc\ub85c \ub3d9\uc791\ud558\uba70 \uba85\ub839\uc5b4\uac00 \uc6d0\uc790\uc801\uc774\ub2e4.<\/span><\/blockquote>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic'; color: #000000; text-align: left;\">\uc5ec\ub7ec \uc694\uccad\uc774 \ub3d9\uc2dc\uc5d0 INCR\ub97c \ud638\ucd9c\ud574\ub3c4 Redis\uac00 \uc21c\uc11c\ub300\ub85c \ucc98\ub9ac\ud558\ubbc0\ub85c \uac12\uc774 \uaf2c\uc774\uc9c0 \uc54a\ub294\ub2e4. \ub610\ud55c \uba54\ubaa8\ub9ac \uae30\ubc18\uc774\ub77c DB\ubcf4\ub2e4 \ube60\ub974\uace0, \ubcf5\uc7a1\ud55c \ubd84\uc0b0 \ub77d \uc5c6\uc774\ub3c4 IINCR \ud55c \ubc88(\uc6d0\uc790\uc801 \uc99d\uac00)\uc73c\ub85c \uc218\ub7c9 \uc81c\uc5b4\uac00 \uac00\ub2a5\ud558\ub2e4.<\/span><\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic'; color: #000000;\"><b>5. Redis \uae30\ubc18 \ubc29\uc2dd\uc758 \uc8fc\uc758\uc810<\/b><\/span><\/h3>\n<blockquote data-ke-style=\"style2\"><span style=\"font-family: 'Nanum Gothic'; color: #000000;\">Redis\ub97c \uc4f4\ub2e4\uace0 \ub05d\uc740 \uc544\ub2c8\ub2e4. \uc608\uc678 \ucf00\uc774\uc2a4\ub97c \uace0\ub824\ud574\uc57c \ud55c\ub2e4.<\/span><\/blockquote>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"color: #000000;\"><span style=\"font-family: 'Nanum Gothic';\">Redis\uc5d0\uc11c\ub294 \ubc1c\uae09\uc774 \uc131\uacf5\ud588\uc9c0\ub9cc DB \uc800\uc7a5\uc774 \uc2e4\ud328\ud558\uba74 \uc218\ub7c9\uacfc \ubc1c\uae09 \uc0c1\ud0dc\uac00 \uc5b4\uae0b\ub0a0 \uc218 \uc788\ub2e4. \uc774 \uacbd\uc6b0 \uba54\uc2dc\uc9c0 \ud050\ub97c \ud65c\uc6a9\ud574 \ube44\ub3d9\uae30\ub85c \uc800\uc7a5\ud558\uac70\ub098 \uc2e4\ud328 \uc7ac\ucc98\ub9ac \uc804\ub7b5\uc774 \ud544\uc694\ud558\ub2e4. \uadf8\ub9ac\uace0&nbsp;<\/span><span style=\"font-family: 'Nanum Gothic';\">\ud55c \uc0ac\uc6a9\uc790\uac00 \uc5f0\ud0c0\ub85c \uc5ec\ub7ec \uc7a5\uc744 \uac00\uc838\uac00\uba74 \uc548 \ub41c\ub2e4. SADD \uac19\uc740 Set \uae30\ubc18 \uc911\ubcf5 \uccb4\ud06c\ub85c &ldquo;\uc0ac\uc6a9\uc790\ub2f9 1\ud68c&rdquo;\ub97c \ubcf4\uc7a5\ud558\ub294 \uba71\ub4f1 \uc124\uacc4\uac00 \ud544\uc694\ud558\ub2e4.<\/span><\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"color: #000000;\"><span style=\"font-family: 'Nanum Gothic';\"><b>6. \uc694\uc57d<\/b><\/span><span style=\"font-family: 'Nanum Gothic';\"><\/span><\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic'; color: #000000;\">\uc694\uccad\uc774 \ub4e4\uc5b4\uc624\uba74 <b>Redis\uc5d0\uc11c SADD(\uc911\ubcf5 \uccb4\ud06c) + INCR(\uc218\ub7c9 \uc81c\uc5b4)\ub85c<\/b> \uba3c\uc800 \ucef7 \ud55c\ub2e4. \uc774\ud6c4 \uc2e4\uc81c \ubc1c\uae09 \ub370\uc774\ud130 \uc800\uc7a5\uc740 \uba54\uc2dc\uc9c0 \ud050\ub85c \ubd84\ub9ac\ud574 DB \ubd80\ud558\ub97c \uc870\uc808\ud558\uba70 \uc548\uc804\ud558\uac8c \ucc98\ub9ac\ud55c\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>","category":"Backend","author":"seungwonlee","guid":"https:\/\/seungwontech.tistory.com\/126","comments":"https:\/\/seungwontech.tistory.com\/126#entry126comment","pubDate":"Fri, 9 Jan 2026 17:22:02 +0900"},{"title":"1000\ub9cc \uac74 \ud14c\uc774\ube14 13\ucd08\ub97c 0.2\ucd08\ub85c \uc904\uc778 \ud398\uc774\uc9d5 \uc131\ub2a5 \ucd5c\uc801\ud654","link":"https:\/\/seungwontech.tistory.com\/125","description":"<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\"><span style=\"color: #333333;\">\ub300\uaddc\ubaa8 \ud2b8\ub798\ud53d\uc744 \ucc98\ub9ac\ud558\ub294 \uac8c\uc2dc\ud310 \uc11c\ube44\uc2a4\uc5d0\uc11c \uac8c\uc2dc\uae00 \ubaa9\ub85d \uc870\ud68c\ub294 \uac00\uc7a5 \ube48\ubc88\ud558\uac8c \ud638\ucd9c\ub418\ub294 \ud575\uc2ec API\uc785\ub2c8\ub2e4. \ud2b9\ud788 \ud398\uc774\uc9c0 \ubc88\ud638 \uae30\ubc18 \ud398\uc774\uc9d5\uc5d0\uc11c offset\uc774 \ucee4\uc9c8\uc218\ub85d \ub290\ub824\uc9c0\ub294 \ubb38\uc81c\ub294 \ub9ce\uc740 \uac1c\ubc1c\uc790\uac00 \uacaa\ub294 \uc774\uc288\uc785\ub2c8\ub2e4. \ud574\ub2f9 \ub0b4\uc6a9\uc740 \uc778\ud504\ub7f0 \uac15\uc758\ub97c \ub4e3\uace0 \uc815\ub9ac\ud55c \uac83\uc73c\ub85c, \uc2e4\uc81c \uc81c \ud504\ub85c\uc81d\ud2b8\uc5d0\ub3c4 \ub3c4\uc6c0\uc774 \ub9ce\uc774 \ub418\uc5b4 \uae00\ub85c \ub0a8\uae41\ub2c8\ub2e4. <\/span><span style=\"color: #333333;\">DB\ub294 miaradb 11\uc785\ub2c8\ub2e4.<\/span><\/span><\/p>\n<h4 data-ke-size=\"size20\"><span style=\"color: #333333; font-family: 'Nanum Gothic';\">1. \ud398\uc774\uc9c0 \ubc88\ud638 \ubc29\uc2dd\uc758 \ubb38\uc81c\uc810<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"color: #333333; font-family: 'Nanum Gothic';\">\ucd1d \uac8c\uc2dc\uae00 1000\ub9cc \uac74, \ud398\uc774\uc9c0\ub2f9 30\uac1c, 4\ud398\uc774\uc9c0 \uc870\ud68c (offset = 90)<\/span><\/p>\n<pre id=\"code_1763020010916\" class=\"sql\" data-ke-language=\"sql\" data-ke-type=\"codeblock\"><code>select * from article\nwhere board_id = 1\norder by created_at desc\nlimit 30 offset 90;\n\n\uc870\ud68c \uc18d\ub3c4: 13s 456ms\nEXPLAIN: type = ALL, Extra = Using where; Using filesort<\/code><\/pre>\n<p data-ke-size=\"size16\"><span style=\"color: #333333; font-family: 'Nanum Gothic';\">\uc989 \uc804\uccb4 \ud14c\uc774\ube14 \uc2a4\uce94\uc774 \ubc1c\uc0dd\ud588\ub2e4. create_at\uc5d0 \uc778\ub371\uc2a4\uac00 \uc5c6\uc5b4 DB\ub294 \ubaa8\ub4e0 \ub370\uc774\ud130\ub97c \uc77d\uc740 \ub4a4 \ub514\uc2a4\ud06c \uae30\ubc18 \uc815\ub82c(filesort)\uc744 \uc218\ud589\ud558\uac8c \ub418\uc5b4 \uc870\ud68c \uc18d\ub3c4\uac00 \ud06c\uac8c \ub290\ub824\uc84c\ub2e4.<\/span><\/p>\n<h4 data-ke-size=\"size20\"><span style=\"color: #333333; font-family: 'Nanum Gothic';\">2. \uc778\ub371\uc2a4 \ucd94\uac00<\/span><\/h4>\n<pre id=\"code_1763020435597\" class=\"sql\" data-ke-language=\"sql\" data-ke-type=\"codeblock\"><code>create index idx_board_id_article_id on article(board_id asc, article_id desc);<\/code><\/pre>\n<pre id=\"code_1763020455610\" class=\"sql\" data-ke-language=\"sql\" data-ke-type=\"codeblock\"><code>select * from article\nwhere board_id = 1\norder by article_id desc\nlimit 30 offset 90;\n\n\uc870\ud68c \uc18d\ub3c4: 132ms \nEXPLAIN: type = range, Extra = Using index condition, key = idx_board_id_article_id<\/code><\/pre>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\"><span style=\"color: #333333;\">\uc989 \uc778\ub371\uc2a4\ub97c \uc0ac\uc6a9\ud588\ub2e4. <\/span><span style=\"color: #333333;\">\uc815\ub82c \uae30\uc900\uc744 created_at \ub300\uc2e0 article_id\ub85c \ubcc0\uacbd\ud55c \uc774\uc720\ub294 \ubd84\uc0b0 \ud658\uacbd\uc5d0\uc11c\ub294 \uc5ec\ub7ec \uc11c\ubc84\uc5d0\uc11c \ub3d9\uc2dc\uc5d0 \uac8c\uc2dc\uae00 \uc0dd\uc131 \uc2dc \ub3d9\uc77c timestamp\uac00 \ubc1c\uc0dd\ud558\uba70 \uc815\ub82c \uc21c\uc11c\uac00 \ubd88\uc548\uc815\ud574\uc9c4\ub2e4. \ubaa9\ub85d \uc870\ud68c \uc2dc \uc21c\uc11c\uac00 \ubc14\ub00c\uac70\ub098 \ub204\ub77d\ub418\ub294 \ubb38\uc81c\uac00 \uc0dd\uae38 \uc218 \uc788\ub2e4. <\/span><span style=\"color: #333333;\">Snowflake ID\ub294 \uc2dc\uac04 \uae30\ubc18 + \uc77c\ub828\ubc88\ud638 \uc870\ud569, \uc804\uc5ed \uc624\ub984\ucc28\uc21c \ubcf4\uc7a5, \ucd9c\ub3d9 \uac00\ub2a5\uc131\uc774 \ud76c\ubc15\ud558\ubbc0\ub85c article_id\ub85c \uc815\ub82c\ud558\ub294 \uac83\uc774 \ub354 \uc548\uc804\ud558\ub2e4.<\/span><\/span><\/p>\n<h4 data-ke-size=\"size20\"><span style=\"color: #333333; font-family: 'Nanum Gothic';\">3. offset\uc774 \ucee4\uc9c0\uba74 \ub2e4\uc2dc \ub290\ub824\uc9c4\ub2e4<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"color: #333333; font-family: 'Nanum Gothic';\">\uc608\ub97c \ub4e4\uc5b4 offset 1,455,570\ub97c \uc870\ud68c\ud55c\ub2e4.<\/span><\/p>\n<pre id=\"code_1763021095424\" class=\"sql\" data-ke-language=\"sql\" data-ke-type=\"codeblock\"><code>select * from article\nwhere board_id = 1\norder by article_id desc\nlimit 30 offset 1455570;\n\n\uc870\ud68c \uc18d\ub3c4: 1s 410ms\nEXPLAIN: type = range, Extra = Using index condition, key = idx_board_id_article_id<\/code><\/pre>\n<p data-ke-size=\"size16\"><span style=\"color: #333333; font-family: 'Nanum Gothic';\">\uc5ec\uc804\ud788 \uc778\ub371\uc2a4\ub97c \uc0ac\uc6a9 \uc911\uc774\uc9c0\ub9cc \uc18d\ub3c4\ub294 \ub290\ub824\uc84c\ub2e4. \uc65c \uc774\ub7f0 \uc77c\uc774 \ubc1c\uc0dd\ud588\uc744\uae4c?<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\"><span style=\"color: #333333;\">\uba3c\uc800 offset \ubc29\uc2dd\uc740 \uc544\ub798\ucc98\ub7fc \ub3d9\uc791\ud55c\ub2e4. <\/span><span style=\"color: #333333;\">offset + limit \ub9cc\ud07c\uc758 \uc778\ub371\uc2a4 \ub370\uc774\ud130\ub97c \uc77d\uace0 offset\uac1c\ub294 \ubc84\ub9ac\uace0 \ub9c8\uc9c0\ub9c9 limit\uac1c\ub9cc \ubc18\ud658\ud55c\ub2e4. <\/span><span style=\"color: #333333;\">\uc989 offset = 90 &rarr; 120\uac1c \uc2a4\uce94, offset = 1,455,570 &rarr; 1,455,600\uac1c \uc2a4\uce94 \uadf8\ub9ac\uace0 \uc5ec\uae30\uc11c \uc911\uc694\ud55c \uac1c\ub150\uc774 \uc544\ub798 \ub4f1\uc7a5\ud55c\ub2e4.<\/span><\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">Clustered Index\uc640 Secondary Index \uac1c\ub150<\/span><\/h3>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic'; color: #333333; text-align: start;\">Clustered Index<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">primary key \uae30\ubc18\uc73c\ub85c \uc0dd\uc131\ub418\ub294 \uc778\ub371\uc2a4\uc774\ub2e4.&nbsp;\uad6c\uc870\uc801\uc73c\ub85c \uc778\ub371\uc2a4\uc758 \uac00\uc7a5 \ub9d0\ub2e8 \ub178\ub4dc\uc778 leaf node\uc5d0 \uc2e4\uc81c \ud589 \ub370\uc774\ud130 \uc804\uccb4\uac00 \uc800\uc7a5\ub41c\ub2e4. \uc989 PK\ub97c \uc774\uc6a9\ud574 \ub370\uc774\ud130\ub97c \uc870\ud68c\ud558\ub294 \uac83\uc740 \uc778\ub371\uc2a4 \uacbd\ub85c\ub97c \ub530\ub77c \ucd5c\uc885\uc801\uc73c\ub85c \ub370\uc774\ud130 \ud30c\uc77c \uc790\uccb4\ub97c \uc9c1\uc811 \uc77d\ub294 \uac83\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\"><span style=\"color: #333333; text-align: start;\">Secondary Index(<\/span>\ubcf4\uc870 \uc778\ub371\uc2a4)<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">PK\uac00 \uc544\ub2cc \ub2e4\ub978 \uceec\ub7fc\uc5d0 \ub300\ud574 \uc0ac\uc6a9\uc790\uac00 \ubcc4\ub3c4\ub85c \uc0dd\uc131\ud55c \uc778\ub371\uc2a4\uc774\ub2e4. \ubcf4\uc870 \uc778\ub371\uc2a4\uc758 \ub9ac\ud504 \ub178\ub4dc\uc5d0\ub294 \ub2e4\uc74c \uc138 \uac00\uc9c0 \uc815\ubcf4\ub9cc \uc800\uc7a5\ud55c\ub2e4. \uc778\ub371\uc2a4\ub97c \uad6c\uc131\ud558\ub294 \uceec\ub7fc \uac12 \uc5ec\uae30\uc120 <span style=\"color: #333333; text-align: start;\">board_id, article_id, \ud574\ub2f9 \ud589\uc758 primary key(PK) \uac12 \uc5ec\uae30\uc11c\ub294 article_id\uc744 \ub9d0\ud55c\ub2e4. <\/span>where \uc870\uac74\uc5d0 \ub9de\ub294 \ud589\uc744 \ucc3e\uae30 \uc704\ud574 \ubcf4\uc870 \uc778\ub371\uc2a4 \ud2b8\ub9ac\ub97c \ud0d0\uc0c9\ud55c\ub2e4. \ubcf4\uc870 \uc778\ub371\uc2a4 \ub9ac\ud504 \ub178\ub4dc\uc5d0\uc11c \ud574\ub2f9&nbsp; \ud589\uc758 PK\ucd94\ucd9c\ud55c\ub2e4. \ucd94\ucd9c\ud55c PK \uac12\uc744 \uc774\uc6a9\ud558\uc5ec \ud074\ub7ec\uc2a4\ud130\ub4dc \uc778\ub371\uc2a4 \ud2b8\ub9ac\ub97c \ub2e4\uc2dc \ud55c\ubc88 \ud0d0\uc0c9\ud558\uace0 \ucd5c\uc885\uc801\uc744 \uc2e4\uc81c \ud589 \ub370\uc774\ud130 \uc804\uccb4\ub97c \uac00\uc838\uc635\ub2c8\ub2e4.<\/span><\/p>\n<table style=\"border-collapse: collapse; width: 100%; height: 94px;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr style=\"height: 18px;\">\n<td style=\"height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\uac1c\ub150<\/span><\/td>\n<td style=\"height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">Secondary Index<\/span><\/td>\n<td style=\"height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">Covering Index<\/span><\/td>\n<\/tr>\n<tr style=\"height: 19px;\">\n<td style=\"height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc758\ubbf8<\/span><\/td>\n<td style=\"height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">PK \uc678 \uceec\ub7fc\uc5d0 \ucd94\uac00\ud55c \uc778\ub371\uc2a4<\/span><\/td>\n<td style=\"height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\ucffc\ub9ac\uc5d0 \ud544\uc694\ud55c \ubaa8\ub4e0 \uceec\ub7fc\uc774 \ub4e4\uc5b4 \uc788\ub294 \uc778\ub371\uc2a4<\/span><\/td>\n<\/tr>\n<tr style=\"height: 19px;\">\n<td style=\"height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\ubaa9\uc801<\/span><\/td>\n<td style=\"height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\ube60\ub974\uac8c PK\ub97c \ucc3e\uae30 \uc704\ud55c \ubcf4\uc870 \uc778\ub371\uc2a4<\/span><\/td>\n<td style=\"height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">PK \uc7ac\uc870\ud68c \uc5c6\uc774 \uc778\ub371\uc2a4\ub9cc\uc73c\ub85c \ucffc\ub9ac \ud574\uacb0<\/span><\/td>\n<\/tr>\n<tr style=\"height: 19px;\">\n<td style=\"height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\ub370\uc774\ud130 \uc870\ud68c<\/span><\/td>\n<td style=\"height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\ubc18\ub4dc\uc2dc PK\ub97c \ub530\ub77c\uac00\uc57c \ud568<\/span><\/td>\n<td style=\"height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">PK \ucc3e\uc544\uac08 \ud544\uc694 \uc5c6\uc74c(\ub354 \ube60\ub984)<\/span><\/td>\n<\/tr>\n<tr style=\"height: 19px;\">\n<td style=\"height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">leaf node<\/span><\/td>\n<td style=\"height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc778\ub371\uc2a4 \uceec\ub7fc + PK\ub9cc \ud3ec\ud568<\/span><\/td>\n<td style=\"height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc778\ub371\uc2a4 \uceec\ub7fc + (\ud544\uc694\ud55c \ubaa8\ub4e0 \uceec\ub7fc)<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">Secondary Index\ub294 \uc778\ub371\uc2a4 '\uc885\ub958'\uc774\uace0, Covering Index\ub294 \uc778\ub371\uc2a4 \uc0ac\uc6a9 '\ud328\ud134' \ub610\ub294 '\uc0c1\ud0dc'\uc774\ub2e4. \ucee4\ubc84\ub9c1 \uc778\ub371\uc2a4\ub294 \ubcf4\uc870 \uc778\ub371\uc2a4\ub97c \uc5b4\ub5bb\uac8c \ud65c\uc6a9\ud558\uc5ec \uc131\ub2a5\uc744 \uadf9\ub300\ud654\ud588\ub294\uc9c0\uc5d0 \ub300\ud55c \uc815\uc758\uc774\ub2e4.<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">\ucee4\ubc84\ub9c1 \uc778\ub371\uc2a4 \ud65c\uc6a9\uc73c\ub85c \uc131\ub2a5 \uac1c\uc120<\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc778\ub371\uc2a4\uc758 \ub370\uc774\ud130\ub9cc\uc73c\ub85c \uc870\ud68c\ud558\uba74 secondary index\ub9cc \ubcf4\uace0 \uacb0\uacfc\ub97c \ub9cc\ub4e4 \uc218 \uc788\ub2e4.<\/span><\/p>\n<pre id=\"code_1763025917556\" class=\"sql\" data-ke-language=\"sql\" data-ke-type=\"codeblock\"><code>select board_id, article_id \nfrom article\nwhere board_id = 1\norder by article_id desc\nlimit 30 offset 1455570;\n\n\uc870\ud68c \uc18d\ub3c4: 292ms\nExtra = Using index (\ucee4\ubc84\ub9c1 \uc778\ub371\uc2a4)<\/code><\/pre>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">secondary index\uc5d0 \uc774\ubbf8 board_id, article_id\uac00 \uc788\uc73c\ubbc0\ub85c clustered index\ub97c \uc77d\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4.&nbsp;<\/span><\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">\uc11c\ube0c\ucffc\ub9ac + \uc870\uc778<\/span><\/h4>\n<pre id=\"code_1763026178806\" class=\"sql\" data-ke-language=\"sql\" data-ke-type=\"codeblock\"><code>select *\nfrom (\n        select board_id, article_id\n        from article\n        where board_id = 1\n        order by article_id desc\n        limit 30 offset 1455570\n     ) t\nleft join article a on t.article_id = a.article_id;\n\n\uc870\ud68c \uc18d\ub3c4: \uc57d 278ms<\/code><\/pre>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc11c\ube0c\ucffc\ub9ac\uac00 \ucee4\ubc84\ub9c1 \uc778\ub371\uc2a4\ub85c \ube60\ub974\uac8c article_id 30\uac1c\ub9cc \ucd94\ucd9c\ud558\uace0&nbsp;\uadf8 30\uac1c\uc5d0 \ub300\ud574\uc11c\ub9cc PK \uae30\ubc18\uc73c\ub85c \ud14c\uc774\ube14\uc744 \uc77d\ub294\ub2e4.<\/span><br \/><span style=\"font-family: 'Nanum Gothic';\">(\ubd81\ub9c8\ud06c \ub8e9\uc5c5 1,455,600\ubc88 &rarr; 30\ubc88\uc73c\ub85c \uac10\uc18c) \ub530\ub77c\uc11c select * \uc774\uc9c0\ub9cc \ub9e4\uc6b0 \ube60\ub974\uac8c \ub3d9\uc791\ud55c\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">OFFSET \uc740 \uadfc\ubcf8\uc801\uc73c\ub85c \ub290\ub824\uc9c4\ub2e4.<\/span><\/p>\n<pre id=\"code_1763026261553\" class=\"sql\" data-ke-language=\"sql\" data-ke-type=\"codeblock\"><code>offset = 1455570  &rarr; 278ms\noffset = 6455570  &rarr; 886ms<\/code><\/pre>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ucee4\ubc84\ub9c1 \uc778\ub371\uc2a4\ub97c \uc0ac\uc6a9\ud574\ub3c4 \uc2a4\uce94 \uac1c\uc218\uc5d0 \ube44\ub840\ud558\uc5ec \ub290\ub824\uc9c0\ub294 \uad6c\uc870\ub294 \ubcc0\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.&nbsp;<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size14\"><span style=\"font-family: 'Nanum Gothic';\">\ubd81\ub9c8\ud06c \ub8e9\uc5c5\uc774\ub780, \ubcf4\uc870 \uc778\ub371\uc2a4\ub97c \ud1b5\ud574 \uc6d0\ud558\ub294 \ub808\ucf54\ub4dc\uc758 \uc704\uce58\ub97c \ucc3e\uc740 \ud6c4 \uc2e4\uc81c \ud589 \ub370\uc774\ud130\ub97c \uac00\uc838\uc624\uae30 \uc704\ud574 \ud074\ub7ec\uc2a4\ud130\ub4dc \uc778\ub371\uc2a4(Primary Key)\ub97c \ub2e4\uc2dc \ud55c\ubc88 \ucc3e\uc544\uac00\ub294 \uacfc\uc815\uc744 \ub9d0\ud55c\ub2e4.<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">\ub300\uaddc\ubaa8 \uc11c\ube44\uc2a4\uc5d0\uc11c\uc758 \uc2e4\ubb34\uc801 \ud574\uacb0\ucc45<\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ud14c\uc774\ube14 \ubd84\ub9ac \ub610\ub294 \"\uc815\uc0c1\uc801\uc778 \uc0ac\uc6a9\uc790\ub294 300,000\ud398\uc774\uc9c0\ub97c \uc870\ud68c\ud558\uc9c0 \uc54a\ub294\ub2e4\" \uc815\ucc45\uc73c\ub85c \ucd5c\ub300 10,000\ud398\uc774\uc9c0\uae4c\uc9c0\ub9cc \ud5c8\uc6a9\ud574 \uc5b4\ubdf0\uc800 \ud2b8\ub798\ud53d \ubc29\uc9c0\ud558\ub294 \ub4f1 \uc5ec\ub7ec \ubc29\ubc95\uc73c\ub85c \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uac83 \uac19\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc778\ud504\ub7f0 \uac15\uc758<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\"><a title=\"\uc778\ud504\ub7f0 \uac15\uc758\" href=\"https:\/\/www.inflearn.com\/course\/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8%EB%A1%9C-%EB%8C%80%EA%B7%9C%EB%AA%A8-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%84%A4%EA%B3%84-%EA%B2%8C%EC%8B%9C%ED%8C%90\/dashboard\" target=\"_blank\" rel=\"noopener\">https:\/\/www.inflearn.com\/course\/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8%EB%A1%9C-%EB%8C%80%EA%B7%9C%EB%AA%A8-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%84%A4%EA%B3%84-%EA%B2%8C%EC%8B%9C%ED%8C%90\/dashboard<\/a><\/span><\/p>","category":"Backend","author":"seungwonlee","guid":"https:\/\/seungwontech.tistory.com\/125","comments":"https:\/\/seungwontech.tistory.com\/125#entry125comment","pubDate":"Thu, 13 Nov 2025 18:26:51 +0900"},{"title":"AWS NAT \uc778\uc2a4\ud134\uc2a4\uc640 NAT \uac8c\uc774\ud2b8\uc6e8\uc774 \uc5b4\ub5a4 \uac78 \uc368\uc57c \ud560\uae4c?","link":"https:\/\/seungwontech.tistory.com\/124","description":"<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">NAT \uc778\uc2a4\ud134\uc2a4<\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ud37c\ube14\ub9ad \uc11c\ube0c\ub137\uc5d0 \ubc30\uce58\ub41c EC2 \uc778\uc2a4\ud134\uc2a4\uac00 \ud504\ub77c\uc774\ube57 \uc11c\ube0c\ub137\uc758 \uc778\ud130\ub137 \uc694\uccad\uc744 \ub300\uc2e0 \uc804\ub2ec(SNAT) \ud558\ub294 \uad6c\uc870\ub85c&nbsp;<\/span><span style=\"font-family: 'Nanum Gothic';\">\uc989 \uc778\ud130\ub137\uc73c\ub85c \ub098\uac00\ub294 \ud504\ub85d\uc2dc \uc11c\ubc84 \uc5ed\ud560\uc744 \ud558\ub294 EC2<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">\ud2b9\uc9d5<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc9c1\uc811 \uad00\ub9ac, EC2 \ud06c\uae30\uc640 \uc124\uc815\uc5d0 \ub530\ub77c \uc131\ub2a5\uc774 \ub2ec\ub77c\uc9c4\ub2e4. \ube44\uc6a9\uc774 \ub9e4\uc6b0 \uc800\ub834\ud558\uc9c0\ub9cc \uc6b4\uc601 \ubd80\ub2f4 \uc874\uc7ac\ud55c\ub2e4. t3.micro \uae30\uc900 \uc2dc\uac04\ub2f9 0.013\ub2ec\ub7ec\uc758 \ube44\uc6a9\uc774 \ubc1c\uc0dd\ud55c\ub2e4. \ub354 \uc800\ub834\ud55c t4g.nano\uc740 0.0052\ub2ec\ub7ec\uc774\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">NAT \uac8c\uc774\ud2b8\uc6e8\uc774<\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">AWS\uc5d0\uc11c \uc644\uc804 \uad00\ub9ac\ud615\uc73c\ub85c \uc81c\uacf5\ud558\ub294 NAT \uc11c\ube44\uc2a4\ub85c \ud37c\ube14\ub9ad \uc11c\ube0c\ub137\uc5d0 \uc0dd\uc131 \ud6c4 Elastic ip\ub97c \uc5f0\uacb0\ud558\uba74 \ud504\ub77c\uc774\ube57 \uc11c\ube0c\ub137 \uc778\uc2a4\ud134\uc2a4\ub4e4\uc774 \uc678\ubd80\ub85c \ub098\uac08 \uc218 \uc788\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">\ud2b9\uc9d5<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uad00\ub9ac \ubd88\ud544\uc694\ud558\uace0 \ube44\uc6a9\uc740 \ube44\uc2f8\uc9c0\ub9cc \uc548\uc815\uc801\uc774\uace0 \uc720\uc9c0\ubcf4\uc218 \ubd80\ub2f4\uc774 \uc801\ub2e4. \uc11c\uc6b8 \uae30\uc900 NAT \uac8c\uc774\ud2b8\uc6e8\uc774 \uc694\uae08 0.059 \ub2ec\ub7ec\uc758 \ube44\uc6a9\uc774 \ubc1c\uc0dd\ud55c\ub2e4. 24\uc2dc\uac04\uc774\uba74 \ud070 \ube44\uc6a9\uc774 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4.<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">\uc694\uc57d \ubc0f \uc0dd\uac01<\/span><\/h3>\n<p data-ke-size=\"size16\">NAT \uc778\uc2a4\ud134\uc2a4\ub294 \uc9c1\uc811 \uad00\ub9ac\ud574\uc57c\ud558\uace0 \uc7a5\uc560 \uc2dc \ubcf5\uad6c\ub3c4 \uc218\ub3d9\uc73c\ub85c \ud574\uc57c \ud558\uc9c0\ub9cc \ube44\uc6a9\uc774 10\ubc30 \uc800\ub834\ud558\ub2e4\ub294 \uc810\uc5d0\uc11c \ud1a0\uc774 \ud504\ub85c\uc81d\ud2b8\ub098 \uac1c\ubc1c\uc6a9 \ud658\uacbd\uc5d0\uc11c \ub9e4\uc6b0 \uc801\ud569\ud558\ub2e4\uace0 \uc0dd\uac01\ub429\ub2c8\ub2e4. NAT \uac8c\uc774\ud2b8\uc6e8\uc774\ub294 \uc790\ub3d9 \ubcf5\uad6c\uc640 \ub192\uc740 \uc131\ub2a5\uc744 \uc81c\uacf5\ud574 \uc548\uc815\uc131\uc744 \ubcf4\uc7a5\ud558\uc9c0\ub9cc 24\uc2dc\uac04 \uac00\ub3d9 \uc2dc \uc0c1\ub2f9\ud55c \ube44\uc6a9\uc774 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4.&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>","category":"Backend","author":"seungwonlee","guid":"https:\/\/seungwontech.tistory.com\/124","comments":"https:\/\/seungwontech.tistory.com\/124#entry124comment","pubDate":"Wed, 5 Nov 2025 13:45:54 +0900"},{"title":"\uc544\uc9c1\ub3c4 DB\uc5d0 JWT \uc800\uc7a5\ud558\uc138\uc694?","link":"https:\/\/seungwontech.tistory.com\/122","description":"<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">JWT\ub780?<\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">JWT(json web token)\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84 \uac04 \uc778\uc99d \uc815\ubcf4\ub97c \ud1a0\ud070 \ud615\ud0dc\ub97c \uc548\uc804\ud558\uac8c \uc804\ub2ec\ud558\uae30 \uc704\ud55c \ud45c\uc900\uc774\ub2e4. \uae30\uc874 \uc138\uc120\/\ucfe0\ud0a4 \ubc29\uc2dd\uacfc \ub2ec\ub9ac \uc11c\ubc84\ub294 \uc0c1\ud0dc\ub97c \uc800\uc7a5\ud558\uc9c0 \uc54a\uace0 \ud1a0\ud070 \uc790\uccb4\ub9cc\uc73c\ub85c \uc815\ubcf4\uc758 \uc720\ud6a8\uc131\uc744 \uac80\uc99d\ud560 \uc218 \uc788\uc5b4 \uc11c\ubc84 \uc790\uc6d0 \uc18c\ubaa8\ub97c \uc904\uc77c \uc218 \uc788\ub2e4. \uc989 \uc11c\ubc84\uac00 \uc138\uc158\uc744 \ub4e4\uace0 \uc788\uc9c0 \uc54a\uc544\ub3c4 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 JWT\ub9cc \uac00\uc9c0\uace0 \uc788\ub2e4\uba74 \uc778\uc99d\uc774 \uac00\ub2a5\ud558\ub2e4. \uadf8\ub798\uc11c Stateless \uc778\uc99d \ubc29\uc2dd\uc774\ub77c\uace0 \ubd80\ub978\ub2e4.<\/span><\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">3\uac00\uc9c0 \uad6c\uc131 \uc694\uc18c<\/span><\/h4>\n<table style=\"border-collapse: collapse; width: 100%; height: 80px;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr style=\"height: 20px;\">\n<td style=\"width: 23.2558%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">\uad6c\ubd84<\/span><\/td>\n<td style=\"width: 76.7442%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc124\uba85<\/span><\/td>\n<\/tr>\n<tr style=\"height: 20px;\">\n<td style=\"width: 23.2558%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">Header(\ud5e4\ub354)<\/span><\/td>\n<td style=\"width: 76.7442%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud1a0\ud070\uc758 \ud0c0\uc785\uacfc \ud574\uc2f1 \uc54c\uace0\ub9ac\uc998(HS256, HS512) \uc815\ubcf4\uac00 \ub2f4\uae40<\/span><\/td>\n<\/tr>\n<tr style=\"height: 20px;\">\n<td style=\"width: 23.2558%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">Payload(\uc815\ubcf4)<\/span><\/td>\n<td style=\"width: 76.7442%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc720\uc800 \uc815\ubcf4, \uad8c\ud55c, \ub9cc\ub8cc\uc2dc\uac04 \ub4f1\uc774 \ud3ec\ud568<\/span><\/td>\n<\/tr>\n<tr style=\"height: 20px;\">\n<td style=\"width: 23.2558%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">Signature(\uc11c\uba85)<\/span><\/td>\n<td style=\"width: 76.7442%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc704 \ub450 \uc815\ubcf4\ub97c \uc11c\ubc84\uc758 \ube44\ubc00\ud0a4\ub85c \uc11c\uba85\ud558\uc5ec \uc0dd\uc131, \uc11c\ubc84\ub294 \uc774 \uc11c\uba85\uc744 \ud1b5\ud574 \ud1a0\ud070\uc758 \uc704\ubcc0\uc870 \uc5ec\ubd80\ub97c \ud655\uc778<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">JWT\ub97c \uad00\ub9ac\ud558\ub294 \ub300\ud45c\uc801\uc778 \ubc29\ubc95 \ub450 \uac00\uc9c0<\/span><\/h4>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr>\n<td style=\"width: 23.2558%;\"><span style=\"font-family: 'Nanum Gothic';\">\ubc29\uc2dd<\/span><\/td>\n<td style=\"width: 76.7442%;\"><span style=\"font-family: 'Nanum Gothic';\">\uc124\uba85<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 23.2558%;\"><span style=\"font-family: 'Nanum Gothic';\">DB \uc800\uc7a5<\/span><\/td>\n<td style=\"width: 76.7442%;\"><span style=\"font-family: 'Nanum Gothic';\">AccessToken\/ RefreshToken\uc744 RDB\uc5d0 \uc800\uc7a5\ud558\uace0 \uc0c1\ud0dc\ub97c \uad00\ub9ac<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 23.2558%;\"><span style=\"font-family: 'Nanum Gothic';\">Redis \uc800\uc7a5<\/span><\/td>\n<td style=\"width: 76.7442%;\"><span style=\"font-family: 'Nanum Gothic';\">\uc778\uba54\ubaa8\ub9ac \uce90\uc2dc(Redis)\ub85c \ud1a0\ud070, TTL, \ube14\ub799\ub9ac\uc2a4\ud2b8\ub97c \uad00\ub9ac<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">DB\ub85c \uad00\ub9ac\ud558\ub294 \uacbd\uc6b0<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ub370\uc774\ud130\uac00 \uc601\uad6c\uc801\uc73c\ub85c \uc800\uc7a5\ub418\uc5b4 \uc11c\ubc84\uac00 \uc7ac\uc2dc\uc791\ud574\ub3c4 \ud1a0\ud070 \uc815\ubcf4\uac00 \uc720\uc9c0\ub41c\ub2e4\ub294 \uc7a5\uc810\uc774 \uc788\uc9c0\ub9cc \ub2e8\uc810\uc73c\ub85c\ub294 \ud1a0\ud070 \uac80\uc99d \ubc0f \uad00\ub9ac\ub97c \uc704\ud574 \ub9e4\ubc88 \ub514\uc2a4\ud06c I\/O \ubc1c\uc0dd\ud558\ub294 DB\uc5d0 \uc811\uadfc\ud574\uc57c \ud558\uace0 TTL \ucc98\ub9ac\uc5d0 \ubcc4\ub3c4 \ubc30\uce58\ub098 \ucffc\ub9ac\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/span><\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">Redis\ub85c \uad00\ub9ac\ud558\ub294 \uacbd\uc6b0<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc778\uba54\ubaa8\ub9ac \uae30\ubc18\uc774\ub77c \uc77d\uae30\/\uc4f0\uae30\uac00 \ub9e4\uc6b0 \ube60\ub974\ub2e4, \ud1a0\ud070 \uac80\uc99d \uc2dc \ubd80\ud558\uac00 \uc801\uc5b4 \ub300\uaddc\ubaa8 \ud2b8\ub798\ud53d\uc5d0 \uc720\ub9ac\ud558\ub2e4, TTL \uae30\ub2a5\uc744 \ud65c\uc6a9\ud558\uc5ec \ud1a0\ud070 \ub9cc\ub8cc\ub97c \uc790\ub3d9\uc73c\ub85c \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4\ub294 \uc7a5\uc810\uc774 \uc788\uc9c0\ub9cc \ub2e8\uc810\uc73c\ub85c\ub294 \uba54\ubaa8\ub9ac\uc5d0 \ub370\uc774\ud130\uac00 \uc800\uc7a5\ub418\ubbc0\ub85c \ub808\ub514\uc2a4 \uc11c\ubc84\uac00 \ub2e4\uc6b4\ub418\uac70\ub098 \uc7ac\uc2dc\uc791\ub418\uba74 \ubaa8\ub4e0 \ud1a0\ud070 \uc815\ubcf4\uac00 \uc0ad\uc81c\ub429\ub2c8\ub2e4.<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">\ube14\ub799\ub9ac\uc2a4\ud2b8<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc720\ud6a8 \uae30\uac04\uc774 \ub0a8\uc558\uc74c\uc5d0\ub3c4 \uac15\uc81c\ub85c \ubb34\ud6a8\ud654\ud574\uc57c \ud558\ub294 \ud1a0\ud070 \ubaa9\ub85d\uc744 \uc758\ubbf8\ud558\uba70, \uc0ac\uc6a9\uc790\uac00 \ub85c\uadf8\uc544\uc6c3\ud558\uba74 \uc561\uc138\uc2a4 \ud1a0\ud070\uacfc \ub9ac\ud504\ub808\uc2dc \ud1a0\ud070 \ubaa8\ub450 \uc989\uc2dc \ubb34\ud6a8\ud654\ub418\uc5b4\uc57c \ud55c\ub2e4. \ubcf4\uc548\uc0c1\uc758 \uc774\uc720\ub85c \ube44\ubc00\ubc88\ud638 \ubcc0\uacbd \uc2dc \uae30\uc874\uc758 \ubaa8\ub4e0 \ud1a0\ud070\uc744 \ubb34\ud6a8\ud654\ud560 \ub54c, \uc11c\ubc84\uc5d0\uc11c \ud2b9\uc815 \ud1a0\ud070\uc774 \ud574\ud0b9\ub418\uc5c8\ub2e4\uace0 \ud310\ub2e8\ud558\uc5ec \uac15\uc81c\ub85c \ub9cc\ub8cc\uc2dc\ucf1c\uc57c \ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4.<\/span><\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">JTI(JWT ID)\uc758 \uc5ed\ud560<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ube14\ub799\ub9ac\uc2a4\ud2b8\ub97c \uad00\ub9ac\ud560 \ub54c \ud1a0\ud070 \ubb38\uc790\uc5f4 \uc804\uccb4 \ub300\uc2e0 JTI\ub77c\ub294 \ud074\ub808\uc784\uc744 \uc0ac\uc6a9\ud55c\ub2e4. JTI\ub294 \ud1a0\ud070\uc5d0 \ubd80\uc5ec\ud558\ub294 \uace0\uc720 \uc2dd\ubcc4\uc790\ub85c \uc11c\ubc84\ub294 \ud1a0\ud070 \uc804\uccb4\ub97c \uc800\uc7a5\ud558\ub294 \ub300\uc2e0 \ub85c\uadf8\uc544\uc6c3\ub41c \ud1a0\ud070\uc758 JTI\ub9cc Redis\uc5d0 \uc800\uc7a5\ud55c\ub2e4. \uc774\ud6c4 \uc5b4\ub5a4 \uc694\uccad\uc774 \ub4e4\uc5b4\uc624\ub4e0 \ud1a0\ud070\uc758 JTI\ub97c \ucd94\ucd9c\ud574 Redis\uc5d0\uc11c \ud574\ub2f9 JTI\uac00 \uc874\uc7ac\ud558\ub294\uc9c0 \ud655\uc778\ud558\uace0 \uc874\uc7ac\ud558\uba74 \uc720\ud6a8 \uae30\uac04\uacfc \uc0c1\uad00\uc5c6\uc774 \ubb34\ud6a8 \ud1a0\ud070\uc73c\ub85c \ucc98\ub9ac\ud55c\ub2e4. \uc7a5\uc810\uc73c\ub85c\ub294 \ub370\uc774\ud130 \uc800\uc7a5 \uacf5\uac04\uc744 \uc808\uc57d\ud55c\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc561\uc138\uc2a4 \ud1a0\ud070\uc744 \uc0dd\uc131\ud560 \ub54c \ud398\uc774\ub85c\ub4dc\uc5d0 jti \ud074\ub808\uc784\uc744 \ucd94\uac00\ud55c\ub2e4.<\/span><\/p>\n<pre id=\"code_1761713483265\" class=\"java\" data-ke-language=\"java\" data-ke-type=\"codeblock\"><code>redisTemplate.opsForValue().set(\n    \"bl:access:\" + jti,\n    \"logout\",\n    remainingTime,\n    TimeUnit.SECONDS\n);\n\/\/ \ud0a4 \uad6c\uc870 bl:access:{jti} = \"logout\"<\/code><\/pre>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">Redis\uc758 \uc9c4\uc9dc \uac15\uc810\uc740 TTL<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ud1a0\ud070\ub9c8\ub2e4 \ub9cc\ub8cc \uc2dc\uac04\uc744 \uc124\uc815\ud574 \ub450\uba74 \ub9cc\ub8cc \uc2dc\uc810\uc774 \uc9c0\ub098\uba74 Redis\uac00 \uc790\ub3d9\uc73c\ub85c \ud0a4\ub97c \uc0ad\uc81c\ud55c\ub2e4. \uc774\uc81c \ubc30\uce58\ub098 \uc2a4\ucf00\uc904\ub7ec \uc5c6\uc774\ub3c4 TTL\uc774 \uc9c0\ub098\uba74 \uc790\ub3d9\uc73c\ub85c \ub370\uc774\ud130\uac00 \uc815\ub9ac\ub429\ub2c8\ub2e4. \uba54\ubaa8\ub9ac \ub204\uc218\ub098 \"\uace0\uc544 \ud1a0\ud070\" \uac71\uc815\uc774 \uc5c6\uc5b4\uc9c4\ub2e4. <\/span><\/p>\n<pre id=\"code_1761713888565\" class=\"java\" data-ke-language=\"java\" data-ke-type=\"codeblock\"><code>@RedisHash(\"token\")\npublic class Token {\n    @Id\n    private String userId;\n\n    private String token;\n\n    @TimeToLive(unit = TimeUnit.SECONDS)\n    private Long expiration;\n}<\/code><\/pre>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">@EnableRedisRepositories(enableKeyspaceEvents = ON_STARTUP)<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">Spring Data Redis\uc5d0\uc11c @RedisHash\ub97c \uc0ac\uc6a9\ud574 \uc5d4\ud2f0\ud2f0\ub97c \uc800\uc7a5\ud560 \ub54c Redis \ub0b4\ubd80\uc5d0\ub294 <b>\ub450 \uac00\uc9c0 \ud0a4<\/b>\uac00 \ud568\uaed8 \uc0dd\uc131\ub429\ub2c8\ub2e4.<\/span><\/p>\n<table style=\"border-collapse: collapse; width: 100%; height: 70px;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr style=\"height: 20px;\">\n<td style=\"width: 23.0233%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud0a4 \uc774\ub984<\/span><\/td>\n<td style=\"width: 36.9767%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc124\uba85<\/span><\/td>\n<td style=\"width: 39.8837%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">TTL \uc5ec\ubd80<\/span><\/td>\n<\/tr>\n<tr style=\"height: 25px;\">\n<td style=\"width: 23.0233%; height: 25px;\"><span style=\"font-family: 'Nanum Gothic';\">token:{userId}<\/span><\/td>\n<td style=\"width: 36.9767%; height: 25px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc2e4\uc81c \ud1a0\ud070 \ub370\uc774\ud130 (\uc5d4\ud2f0\ud2f0 \ubcf8\ubb38)<\/span><\/td>\n<td style=\"width: 39.8837%; height: 25px;\"><span style=\"font-family: 'Nanum Gothic';\">\u2705 TTL \uc801\uc6a9<\/span><\/td>\n<\/tr>\n<tr style=\"height: 25px;\">\n<td style=\"width: 23.0233%; height: 25px;\"><span style=\"font-family: 'Nanum Gothic';\">token<\/span><\/td>\n<td style=\"width: 36.9767%; height: 25px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc5d4\ud2f0\ud2f0\uc758 ID \ubaa9\ub85d\uc744 \ub2f4\uc740 \uc778\ub371\uc2a4(Set \ud615\ud0dc)<\/span><\/td>\n<td style=\"width: 39.8837%; height: 25px;\"><span style=\"font-family: 'Nanum Gothic';\">\u274c TTL \ubbf8\uc801\uc6a9<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">\ubb38\uc81c \uc0c1\ud669<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">TTL\uc774 \uc124\uc815\ub41c \ud0a4\ub294 \uc2dc\uac04\uc774 \uc9c0\ub098\uba74 \ub808\ub514\uc2a4\uac00 \uc790\ub3d9\uc73c\ub85c \uc0ad\uc81c\ud55c\ub2e4. \ud558\uc9c0\ub9cc \uc778\ub371\uc2a4\uc6a9 Set\uc740 TTL\uc774 \uc5c6\uae30 \ub54c\ubb38\uc5d0 \uc0ad\uc81c\ub41c ID\uac00 \uadf8\ub300\ub85c \ub0a8\uac8c \ub418\uc5b4 phantom key \ud604\uc0c1\uc774 \ubc1c\uc0dd\ud55c\ub2e4. \uc989 \uc2e4\uc81c \ub370\uc774\ud130\ub294 \uc0ac\ub77c\uc84c\uc9c0\ub9cc \uc778\ub371\uc2a4\uc5d0\ub294 \uc5ec\uc804\ud788 \uc874\uc7ac\ud558\ub294 \ubd88\uc77c\uce58 \uc0c1\ud0dc\uac00 \uc0dd\uae34\ub2e4.&nbsp;<\/span><\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">\ud574\uacb0 \ubc29\ubc95<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">Spring Data Redis\ub294 \uc774 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574 \uc124\uc815\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774 \uc124\uc815\uc740 \ub808\ub514\uc2a4\uc5d0\uc11c TTL\uc774 \ub9cc\ub8cc\ub418\uac70\ub098 \ud0a4\uac00 \uc0ad\uc81c\ub420 \ub54c \ubc1c\uc0dd\ud558\ub294 \uc774\ubca4\ud2b8\ub97c \uac10\uc9c0\ud558\uace0 Spring\uc774 \ud574\ub2f9 \uc774\ubca4\ud2b8\ub97c \ubc1b\uc544 \ub0b4\ubd80 \uc778\ub371\uc2a4\ub97c \uc790\ub3d9 \uc815\ub9ac\ud574 \uc900\ub2e4.&nbsp;<\/span><br \/><span style=\"font-family: 'Nanum Gothic';\">@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP)<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc124\uc815\ud558\uc9c0 \uc54a\uc744 \uacbd\uc6b0<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-filename=\"\u1109\u1173\u110f\u1173\u1105\u1175\u11ab\u1109\u1163\u11ba 2025-10-28 \u110b\u1169\u1112\u116e 4.38.25.png\" data-origin-width=\"1456\" data-origin-height=\"304\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/nOLWf\/dJMcadAjoV1\/FPL77vj9o0LqM0Hxy4rMFK\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/nOLWf\/dJMcadAjoV1\/FPL77vj9o0LqM0Hxy4rMFK\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/nOLWf\/dJMcadAjoV1\/FPL77vj9o0LqM0Hxy4rMFK\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnOLWf%2FdJMcadAjoV1%2FFPL77vj9o0LqM0Hxy4rMFK%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1456\" height=\"304\" data-filename=\"\u1109\u1173\u110f\u1173\u1105\u1175\u11ab\u1109\u1163\u11ba 2025-10-28 \u110b\u1169\u1112\u116e 4.38.25.png\" data-origin-width=\"1456\" data-origin-height=\"304\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc124\uc815\ud588\uc744 \uacbd\uc6b0 \uc790\ub3d9\uc73c\ub85c phantom key \uc0dd\uc131<\/span><\/p>\n<p><figure class=\"imageblock widthContent\" data-ke-mobileStyle=\"widthOrigin\" data-filename=\"\u1109\u1173\u110f\u1173\u1105\u1175\u11ab\u1109\u1163\u11ba 2025-10-29 \u110b\u1169\u1112\u116e 3.42.28.png\" data-origin-width=\"743\" data-origin-height=\"275\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/ywBLN\/dJMcacg6jOH\/ptP8Bgrv495YKoCv4y1fGK\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/ywBLN\/dJMcacg6jOH\/ptP8Bgrv495YKoCv4y1fGK\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/ywBLN\/dJMcacg6jOH\/ptP8Bgrv495YKoCv4y1fGK\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FywBLN%2FdJMcacg6jOH%2FptP8Bgrv495YKoCv4y1fGK%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"743\" height=\"275\" data-filename=\"\u1109\u1173\u110f\u1173\u1105\u1175\u11ab\u1109\u1163\u11ba 2025-10-29 \u110b\u1169\u1112\u116e 3.42.28.png\" data-origin-width=\"743\" data-origin-height=\"275\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uacb0\uacfc\uc801\uc73c\ub85c TTL \ub9cc\ub8cc\uc640 \ud568\uaed8 \uc778\ub371\uc2a4\uae4c\uc9c0 \uc790\ub3d9 \uc815\ub9ac\ub418\ubbc0\ub85c \"\uace0\uc544 \uc778\ub371\uc2a4 \uc5c6\uc774\" \ud56d\uc0c1 \uc815\ud569\uc131 \uc788\ub294 Redis Repository \uc0c1\ud0dc\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4.<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">RedisTemplate vs RedisRepository<\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">Redis\uc5d0 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\uace0 \uc811\uadfc\ud558\ub294 Spring Data Redis\uc758 \ub450 \uac00\uc9c0 \uc8fc\uc694 \ubc29\ubc95\uc740 RedisTemplate\uacfc RedisRepository\uc785\ub2c8\ub2e4.&nbsp;<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">RedisTemplate<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\"> Redis \uba85\ub839\uc5b4\ub97c \uc2e4\ud589\ud558\uae30 \uc704\ud574 \uc81c\uacf5\ud558\ub294 \ud575\uc2ec \ud074\ub798\uc2a4\uc785\ub2c8\ub2e4. Redis\uc640\uc758 \ud1b5\uc2e0\uc744 \ud558\uc5ec \uac1c\ubc1c\uc790\uac00 \ub370\uc774\ud130 \ud0c0\uc785\ubcc4 \uc5f0\uc0b0\uc744 \uc27d\uac8c \uc218\ud589\ud560 \uc218 \uc788\ub3c4\ub85d \ud55c\ub2e4. \uc0ac\uc6a9\ubc95\uc740 opsForValue().set(), opsForHash().put()) \ucf54\ub4dc\ub97c \uc9c1\uc811 \uc791\uc131\ud558\uc5ec \ub370\uc774\ud130\ub97c \uc870\uc791\ud569\ub2c8\ub2e4. \ubaa8\ub4e0 \ub370\uc774\ud130 \uc870\uc791\uc744 \uc218\ub3d9\uc73c\ub85c \ucc98\ub9ac\ud574\uc57c \ud55c\ub2e4.&nbsp;<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">RedisRepository<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\"> Spring Data\uc758 Repository \ucd94\uc0c1\ud654\ub97c Redis\uc5d0 \uc801\uc6a9\ud55c \ubc29\uc2dd\uc774\ub2e4. JPA\ucc98\ub7fc \uba54\uc11c\ub4dc \uc774\ub984 \uaddc\uce59\uc744 \ub530\ub974\uba74 Spring\uc774 \uc790\ub3d9\uc73c\ub85c CRUD \uad6c\ud604\uccb4\ub97c \uc0dd\uc131\ud574 \uc900\ub2e4. TokenRepository extends CrudRepository&lt;Token, String&gt;\uc640 \uac19\uc774 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc120\uc5b8\ud558\uace0 tokenRepository.findById \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\uc5ec \uc0ac\uc6a9\ud55c\ub2e4. \uac1c\ubc1c \ud3b8\uc758\uc131\uacfc \uc0dd\uc0b0\uc131\uc774 \ub9e4\uc6b0 \ub192\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">RedisTemplate \ud0c0\uc785 \uad8c\uc7a5 \uc0ac\ud56d &lt;String, Object&gt; vs. &lt;String, String&gt;<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">String, Object \ubcf4\ub2e4 String, String\uc774 \uad8c\uc7a5\ub418\ub294 \uc774\uc720\ub294 \uc9c1\ub82c\ud654 \ubb38\uc81c\uc640 \ub370\uc774\ud130 \ud638\ud658\uc131 \ub54c\ubb38\uc774\ub2e4. <\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">\uc9c1\ub82c\ud654 \ubb38\uc81c \ubc0f \ub370\uc774\ud130 \ube44\ud6a8\uc728\uc131&nbsp;<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">Object \uc0ac\uc6a9 \uc2dc Spring\uc740 \uae30\ubcf8\uc801\uc73c\ub85c JDK \uc9c1\ub82c\ud654\ub97c \uc0ac\uc6a9\ud55c\ub2e4. JDK \uc9c1\ub82c\ud654\ub294 Java \uac1d\uccb4\uc758 \ud074\ub798\uc2a4 \uc815\ubcf4\uae4c\uc9c0 \ubc14\uc774\ud2b8\ub85c \uc800\uc7a5\ud55c\ub2e4. \ub808\ub514\uc2a4\uc5d0 \uc800\uc7a5\ub418\ub294 \ub370\uc774\ud130 \ud06c\uae30\uac00 \ubd88\ud544\uc694\ud558\uac8c \ucee4\uc9c0\uace0(\ube44\ud6a8\uc728\uc801) \uba54\ubaa8\ub9ac\ub97c \ub0ad\ube44\ud55c\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">String \uc0ac\uc6a9 \uc2dc Java\uac1d\uccb4\ub97c \ub808\ub514\uc2a4\uc5d0 \uc800\uc7a5\ud558\uae30 \uc804\uc5d0 json \ubb38\uc790\uc5f4\ub85c \uba85\uc2dc\uc801\uc73c\ub85c \ubcc0\ud658\ud558\uc5ec \uc800\uc7a5\ud558\uac8c \ub429\ub2c8\ub2e4. \ub808\ub514\uc2a4\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \ubb38\uc790\uc5f4 \uae30\ubc18 \uc800\uc7a5\uc18c\uc785\ub2c8\ub2e4. \uc800\uc7a5\ub41c \ub370\uc774\ud130\uac00 json\uc774\ub77c\ub294 \ud45c\uc900 \ud3ec\ub9f7\uc774 \ub418\ubbc0\ub85c \uc790\ubc14 \uc678\uc758 \ub2e4\ub978 \uc5b8\uc5b4\ub85c \uad6c\uc131\ud55c MSA \ud658\uacbd\uc5d0\uc11c \ub370\uc774\ud130\ub97c \uc27d\uac8c \uc77d\uace0 \ucc98\ub9ac\ud560 \uc218 \uc788\uc5b4 \ud638\ud658\uc131\uc744 \uadf9\ub300\ud654\ud55c\ub2e4.&nbsp;<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uacb0\ub860\uc801\uc73c\ub85c JWT \uad00\ub9ac\ub294 DB\ubcf4\ub2e4 Redis\uac00 \ube60\ub974\uace0 TTL \uae30\ubc18 \uc790\ub3d9 \ub9cc\ub8cc\ub85c \uc720\uc9c0\ubcf4\uc218\uac00 \uc27d\ub2e4\uace0 \uc0dd\uac01\ub429\ub2c8\ub2e4. \uc11c\ube44\uc2a4 \uaddc\ubaa8\ub098 \ube44\uc6a9 \ub4f1\uc744 \uace0\ub824\ud558\uba74 DB\ub85c \uad00\ub9ac\ud558\ub294 \ubc29\uc2dd \ub610\ud55c \uc5ec\ub7ec \uc815\ucc45\uc744 \uac00\uc9c0\uace0 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uad73\uc774 \ube44\uc6a9\uc744 \ub4e4\uc5ec\uc11c \uc0ac\uc6a9\ud560 \ud544\uc694\uac00 \uc5c6\uc744 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ub429\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>","category":"Backend","author":"seungwonlee","guid":"https:\/\/seungwontech.tistory.com\/122","comments":"https:\/\/seungwontech.tistory.com\/122#entry122comment","pubDate":"Wed, 29 Oct 2025 15:20:22 +0900"},{"title":"\ud074\ub9ad \ub300\uc2e0 \ud14c\ub77c\ud3fc\uc73c\ub85c \uc778\ud504\ub77c \uad00\ub9ac\ud558\uae30","link":"https:\/\/seungwontech.tistory.com\/121","description":"<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">\ud14c\ub77c\ud3fc(Terraform)<\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ud558\uc2dc\ucf54\ud504\uc5d0\uc11c \uac1c\ubc1c\ud55c \uc624\ud508\uc18c\uc2a4 \ucf54\ub4dc\ud615 \uc778\ud504\ub77c(IaC) \ub3c4\uad6c\uc785\ub2c8\ub2e4. \ucf54\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc778\ud504\ub77c\ub97c \uc120\uc5b8\uc801\uc73c\ub85c \uc815\uc758\ud558\uace0 \ud504\ub85c\ube44\uc800\ub2dd(\uad6c\ucd95 \ubc0f \uad00\ub9ac)\ud560 \uc218 \uc788\uac8c \ud574 \uc900\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ud14c\ub77c\ud3fc\uc740 \uc0ac\uc6a9\uc790\uac00 \uc6d0\ud558\ub294 \uc778\ud504\ub77c\uc758 \ucd5c\uc885 \uc0c1\ud0dc\ub97c HCL\uc774\ub77c\ub294 \uc804\uc6a9 \uc124\uc815 \uc5b8\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ud30c\uc77c(.tf)\ub85c \uc791\uc131\ud55c\ub2e4. \uc774 \ucf54\ub4dc\ub294 \ub2e8\uc21c\ud788 \uba85\ub839\uc744 \uc21c\ucc28\uc801\uc73c\ub85c \ub098\uc5f4\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \uc5b4\ub5a4 \ub9ac\uc18c\uc2a4\uac00 \ud544\uc694\ud558\ub2e4 \uace0 \uc120\uc5b8\ud558\ub294 \ubc29\uc2dd\uc774\ub2e4.<\/span><\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">\ud575\uc2ec \ud2b9\uc9d5<\/span><\/h4>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr>\n<td style=\"width: 23.8372%;\"><span style=\"font-family: 'Nanum Gothic';\">\uc774\ub984<\/span><\/td>\n<td style=\"width: 76.1628%;\"><span style=\"font-family: 'Nanum Gothic';\">\uc124\uba85<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 23.8372%;\"><span style=\"font-family: 'Nanum Gothic';\"><b><span style=\"color: #333333; text-align: start;\">IaC(Infrastructure as Code)<\/span><\/b><\/span><\/td>\n<td style=\"width: 76.1628%;\"><span style=\"font-family: 'Nanum Gothic'; color: #333333; text-align: start;\">\uc778\ud504\ub77c\ub97c \uc218\ub3d9\uc73c\ub85c \uc124\uc815\ud558\ub294 \ub300\uc2e0 \ucf54\ub4dc\ub85c \uc815\uc758\ud558\uace0 \uad00\ub9ac\ud558\ub294 \uc790\ub3d9\ud654, \uc77c\uad00\uc131, \ubc18\ubcf5 \uac00\ub2a5\uc131\uc744 \ud655\ubcf4\ud55c\ub2e4.<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 23.8372%;\"><span style=\"font-family: 'Nanum Gothic';\"><b><span style=\"color: #333333; text-align: start;\">\uc120\uc5b8\uc801<\/span><\/b><\/span><\/td>\n<td style=\"width: 76.1628%;\"><span style=\"font-family: 'Nanum Gothic'; color: #333333; text-align: start;\">\uc0ac\uc6a9\uc790\ub294 \ubb34\uc5c7\uc744 \uc6d0\ud558\ub294\uc9c0\ub97c \ucf54\ub4dc\ub85c \uc120\uc5b8\ud558\uba74 \ud14c\ub77c\ud3fc\uc774 \uc5b4\ub5bb\uac8c \ud574\ub2f9 \uc0c1\ud0dc\uc5d0 \ub3c4\ub2ec\ud560\uc9c0(\uc0dd\uc131, \uc218\uc815, \uc0ad\uc81c)\ub97c \uacb0\uc815\ud558\uace0 \uc2e4\ud589\ud55c\ub2e4.<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 23.8372%;\"><span style=\"font-family: 'Nanum Gothic';\"><b><span style=\"color: #333333; text-align: start;\">\uba40\ud2f0 \ud074\ub77c\uc6b0\ub4dc \uc9c0\uc6d0<\/span><\/b><\/span><\/td>\n<td style=\"width: 76.1628%;\"><span style=\"font-family: 'Nanum Gothic'; color: #333333; text-align: start;\">AWS, GCP \uac19\uc740 \uc8fc\uc694 \ud074\ub77c\uc6b0\ub4dc \uc11c\ube44\uc2a4\ubfd0\ub9cc \uc544\ub2c8\ub77c \ucfe0\ubc84\ub124\ud2f0\uc2a4, \ub3c4\ucee4 \uae30\ud0c0 \ub4f1 \ub2e4\uc591\ud55c \uc778\ud504\ub77c \ud658\uacbd\uc744 Provider \uac1c\ub150\uc744 \ud1b5\ud574 \ub2e8\uc77c \ub3c4\uad6c\ub85c \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">\ud14c\ub77c\ud3fc\uc744 \uc0ac\uc6a9\ud558\ub294 \uc774\uc720<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc778\ud504\ub77c \uad00\ub9ac\uc758 \ud6a8\uc728\uc131, \uc548\uc815\uc131, \uc790\ub3d9\ud654\ub97c \uadf9\ub300\ud654\ud558\uae30 \uc704\ud574\uc11c\uc785\ub2c8\ub2e4. \uc218\ub3d9\uc73c\ub85c \ucf58\uc194\uc744 \ud074\ub9ad \ud544\uc694 \uc5c6\uc774 \ucf54\ub4dc\ub85c \uc2e4\ud589\ud558\ub294 \uac83\ub9cc\uc73c\ub85c \ubcf5\uc7a1\ud55c \uc778\ud504\ub77c\ub97c \uc790\ub3d9\uc73c\ub85c \uad6c\ucd95\ud558\uace0 \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4. \uc0c8\ub85c\uc6b4 \ud658\uacbd\uc744 \uad6c\ucd95\ud558\uac70\ub098 \uc778\ud504\ub77c \ubcc0\uacbd\uc774 \ud544\uc694\ud560 \ub54c \ubbf8\ub9ac \uc791\uc131\ub41c \ucf54\ub4dc\ub97c \uc7ac\uc0ac\uc6a9\ud558\uc5ec \ube60\ub974\uac8c \ubc18\ubcf5\uc801\uc73c\ub85c \ubc30\ud3ec\ub3c4 \uac00\ub2a5\ud558\ub2e4. \uc778\ud504\ub77c \uc815\uc758\uac00 \ucf54\ub4dc\ub85c \uc874\uc7ac\ud558\uae30 \ub54c\ubb38\uc5d0 Git\uacfc \uac19\uc740 \ubc84\uc804 \uad00\ub9ac \uc2dc\uc2a4\ud15c\uc5d0 \uc800\uc7a5\ud558\uc5ec \ubcc0\uacbd \uc774\ub825\uc744 \ucd94\uc801\ud558\uace0 \ud300\uc6d0\uacfc \uc548\uc804\ud558\uac8c \ud611\uc5c5\ud560 \uc218 \uc788\ub2e4. \uc774\uac83\ub9cc\uc73c\ub85c\ub3c4 \ucda9\ubd84\ud788 \ud070 \uc7a5\uc810\uc774\ub2e4.<\/span><\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">\ud14c\ub77c\ud3fc\uc758 \uae30\ubcf8 \ub3d9\uc791 \ubc29\uc2dd<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">HCL \uc5b8\uc5b4\ub85c \uc6d0\ud558\ub294 \uc778\ud504\ub77c \ub9ac\uc18c\uc2a4\ub97c \uc815\uc758\ud55c \uad6c\uc131 \ud30c\uc77c\uc744 \uc791\uc131\ud558\uace0 \uacc4\ud68d(plan) \uba85\ub839\uc744 \uc2e4\ud589\ud558\uc5ec \uc791\uc131\ub41c \ucf54\ub4dc\uc640 \ud604\uc7ac \uc778\ud504\ub77c \uc0c1\ud0dc\ub97c \ube44\uad50\ud558\uace0 \ucd5c\uc885 \uc0c1\ud0dc\uc5d0\ub3c4 \ub3c4\ub2ec\ud558\uae30 \uc704\ud574 \ud544\uc694\ud55c \ubcc0\uacbd \uc0ac\ud56d\uc744 \ubbf8\ub9ac \ud655\uc778\ud55c\ub2e4. \uc801\uc6a9(apply) \uba85\ub839\uc744 \uc2e4\ud589\ud558\uc5ec \uacc4\ud68d\ub41c \ubcc0\uacbd \uc0ac\ud56d\uc744 \uc2e4\uc81c \ud074\ub77c\uc6b0\ub4dc \uc778\ud504\ub77c\uc5d0 \uc801\uc6a9\ud55c\ub2e4. \uc0c1\ud0dc \ud30c\uc77c(.tfstate)\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc2e4\uc81c \uc778\ud504\ub77c\uc758 \ud604\ud669\uacfc \ucf54\ub4dc\uc5d0 \uc815\uc758\ub41c \uc6d0\ud558\ub294 \uc0c1\ud0dc\ub97c \ub9e4\ud551\ud558\uace0 \ucd94\uc801\ud55c\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc704 \ub0b4\uc6a9\ucc98\ub7fc \uc778\ud504\ub77c \uad00\ub9ac\uc5d0\uc120 \ud14c\ub77c\ud3fc\uc740 \ud544\uc218\uc801\uc778 \uc694\uc18c\uc774\ub2e4. \ud14c\ub77c\ud3fc \uae30\ubcf8 \uac1c\ub150\uacfc \uac04\ub2e8\ud55c \uc2e4\uc2b5\uc744 \ud1b5\ud574 \uacf5\ubd80\ud55c\ub2e4.<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">\ud14c\ub77c\ud3fc \uae30\ubcf8 \uac1c\ub150<\/span><\/h3>\n<table style=\"border-collapse: collapse; width: 100%; height: 148px;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr style=\"height: 20px;\">\n<td style=\"width: 23.7209%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc774\ub984<\/span><\/td>\n<td style=\"width: 76.2791%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc124\uba85<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 23.7209%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\"><b>resource<\/b><\/span><\/td>\n<td style=\"width: 76.2791%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc2e4\uc81c\ub85c \uc0dd\uc131\ud560 \uc778\ud504\ub77c \uc790\uc6d0\uc744 \uc758\ubbf8\ud55c\ub2e4 EC2, VPC, RDS \ub4f1 \ub9ac\uc18c\uc2a4\ub97c \ube14\ub85d\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud30c\uc77c\uc5d0 \uc815\uc758\ud55c\ub2e4.<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 23.7209%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\"><b>provider<\/b><\/span><\/td>\n<td style=\"width: 76.2791%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud14c\ub77c\ud3fc\uacfc \ud2b9\uc815 \uc778\ud504\ub77c \uc11c\ube44\uc2a4( AWS Azure \ub4f1)\ub97c API\uc640 \uc0c1\ud638\uc791\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \uc5f0\uacb0\ud574\uc8fc\ub294 \ud50c\ub7ec\uadf8\uc778\uc774\ub2e4.<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 23.7209%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\"><b>output<\/b><\/span><\/td>\n<td style=\"width: 76.2791%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\ubc30\ud3ec \uc644\ub8cc \ud6c4 \uc678\ubd80\uc5d0 \ub178\ucd9c\ud558\uace0 \uc2f6\uc740 \ud2b9\uc815 \uc815\ubcf4\ub97c \uc815\uc758\ud55c\ub2e4. \uc0dd\uc131\ub41c EC2\uc758 \ud37c\ud50c\ub9ad IP\uc8fc\uc18c \ub4f1\uc744 \ub2e4\ub978 \uc2dc\uc2a4\ud15c\uc774\ub098 \uc0ac\uc6a9\uc790\uc5d0\uac8c \ubcf4\uc5ec\uc8fc\uae30 \uc704\ud574 \uc0ac\uc6a9\ud55c\ub2e4.<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 23.7209%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\"><b>backend<\/b><\/span><\/td>\n<td style=\"width: 76.2791%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud14c\ub77c\ud3fc\uc774 \uc778\ud504\ub77c\uc758 \ud604\uc7ac \uc0c1\ud0dc\ub97c \uae30\ub85d\ud558\ub294 \uc0c1\ud0dc \ud30c\uc77c(.tfstate)\uc744 \uc800\uc7a5\ud560 \uc704\uce58\ub97c \uc124\uc815\ud55c\ub2e4. S3\uc640 \uac19\uc740 \uc6d0\uaca9 \uc800\uc7a5\uc18c\uc5d0 \uc800\uc7a5\ud558\uc5ec \ud300\uc6d0\uac04\uc758 \ud611\uc5c5 \ubc0f \uc548\uc804\uc131\uc744 \ud655\ubcf4\ud558\ub294\ub370 \uc0ac\uc6a9\ud55c\ub2e4.<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 23.7209%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\"><b>module<\/b><\/span><\/td>\n<td style=\"width: 76.2791%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc7ac\uc0ac\uc6a9 \uac00\ub2a5\ud558\ub3c4\ub85d \uc5ec\ub7ec \uac1c\uc758 \ub9ac\uc18c\uc2a4\ub97c \ubb36\uc5b4 \ub193\uc740 \ub17c\ub9ac\uc801 \uadf8\ub8f9\uc774\uc790 \ucea1\uc290\ud654 \ub2e8\uc704\uc774\ub2e4. \ubcf5\uc7a1\ud55c \uc778\ud504\ub77c\ub97c \uad6c\uc870\ud654\ud558\uace0 \ub3d9\uc77c\ud55c \uad6c\uc131\uc744 \uc5ec\ub7ec \ud658\uacbd\uc5d0 \ubc18\ubcf5\uc801\uc73c\ub85c \ubc30\ud3ec\ud560 \ub54c \uc720\uc6a9\ud558\ub2e4.<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 23.7209%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\"><b>state file(tfstate)<\/b><\/span><\/td>\n<td style=\"width: 76.2791%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud14c\ub77c\ud3fc\uc774 \ud604\uc7ac\uae4c\uc9c0 \uad00\ub9ac\ud558\uace0 \ubc30\ud3ec\ud55c \uc778\ud504\ub77c \uc790\uc6d0\uc758 \uc2e4\uc81c \uc0c1\ud0dc\ub97c \uae30\ub85d\ud558\ub294 \ud30c\uc77c\uc774\ub2e4.<\/span><\/td>\n<\/tr>\n<tr style=\"height: 20px;\">\n<td style=\"width: 23.7209%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\"><b>remote state<\/b><\/span><\/td>\n<td style=\"width: 76.2791%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud14c\ub77c\ud3fc\uc5d0\uc11c tfstate\ub97c \ub85c\uceec\uc774 \uc544\ub2cc \uc6d0\uaca9 \uc800\uc7a5\uc18c\uc5d0 \ubcf4\uad00\ud558\uace0 \uad00\ub9ac\ud558\ub294 \ubc29\uc2dd\uc744 \uc758\ubbf8\ud55c\ub2e4.<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">remote state\uc758 \ud544\uc694\uc131 \ubc0f \uc5ed\ud560<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc5ec\ub7ec \ud300\uc6d0\uc774 \ud558\ub098\uc758 \uc778\ud504\ub77c\ub97c \ub3d9\uc2dc\uc5d0 \uad00\ub9ac\ud560 \ub54c \uac01\uc790\uc758 \ub85c\uceec \uc0c1\ud0dc \ud30c\uc77c\uc774 \uc544\ub2cc \uacf5\uc720\ub41c \uc911\uc559 \uc0c1\ud0dc \ud30c\uc77c\uc744 \uc0ac\uc6a9\ud574\uc57c \uc77c\uad00\uc131\uc744 \uc720\uc9c0\ud558\uace0 \ucda9\ub3cc\uc744 \ubc29\uc9c0\ud560 \uc218 \uc788\ub2e4. tfstate\ud30c\uc77c\uc5d0\ub294 \uc778\ud504\ub77c\uc5d0 \ub300\ud55c \uc911\uc694\ud55c \uc815\ubcf4(\ubbfc\uac10\uc815\ubcf4)\uac00 \ud3ec\ud568\ub418\uc5b4 \uc788\ub2e4. \uc774\ub97c \uc548\uc804\ud55c \ud074\ub77c\uc6b0\ub4dc \uc2a4\ud1a0\ub9ac\uc9c0(S3)\uc5d0 \uc800\uc7a5\ud558\uc5ec \ub85c\uceec \uc720\ucd9c \uc704\ud5d8\uc744 \uc904\uc774\uace0 \ubc31\uc5c5 \ubc0f \ubcf5\uad6c\ub97c \uc6a9\uc774\ud558\uac8c \ud55c\ub2e4. \uc5ec\ub7ec \uc0ac\uc6a9\uc790\uac00 \ub3d9\uc2dc\uc5d0 apply\ub97c \uc2e4\ud589\ud558\ub294 \uac83\uc744 \ubc29\uc9c0\ud558\uae30 \uc704\ud574 \uc6d0\uaca9 \ubc31\uc5d4\ub4dc\ub294 \uc7a0\uae08 \uae30\ub2a5\uc744 \uc9c0\uc6d0\ud55c\ub2e4. \uc77c\uad00\uc131\uc744 \uc783\ub294 \uac83\uc744 \ub9c9\uc544 \uc900\ub2e4.<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">\ud14c\ub77c\ud3fc \uba85\ub839\uc5b4<\/span><\/h3>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">terraform init(\ucd08\uae30\ud654)<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ud14c\ub77c\ud3fc \uc791\uc5c5 \ub514\ub809\ud130\ub9ac\ub97c \ucd08\uae30\ud654\ud558\uace0 \uad6c\uc131 \ud30c\uc77c\uc5d0 \uc815\uc758\ub41c \ub300\ub85c \uc791\uc5c5\uc744 \uc218\ud589\ud560 \uc900\ube44\ub97c \ub9c8\uce58\ub294 \uba85\ub839\uc5b4\ub85c \uad6c\uc131 \ud30c\uc77c\uc5d0 \uba85\uc2dc\ub41c Provider \ud50c\ub7ec\uadf8\uc778\uacfc \uadf8 \ubc84\uc804\uc744 \uac80\uc0c9\ud558\uace0 \ub85c\uceec\uc5d0 \ub2e4\uc6b4\ub85c\ub4dc\ud55c\ub2e4. \ubc31\uc5d4\ub4dc \uc124\uc815\uc744 \ud655\uc778\ud558\uace0 \uc0c1\ud0dc \ud30c\uc77c\uc744 \uc800\uc7a5\ud560 \uc6d0\uaca9 \uc800\uc7a5\uc18c\ub97c \uc124\uc815\ud55c\ub2e4. \uc18c\uc2a4 \ucf54\ub4dc\ub97c \ucc38\uc870\ud558\ub294 module\uc744 \uc900\ube44\ud55c\ub2e4 \uc774 \uba85\ub839\uc5b4\ub294 \ud14c\ub77c\ud3fc \ucf54\ub4dc\ub97c \ucc98\uc74c \uc791\uc131\ud558\uac70\ub098 \uc0c8\ub85c\uc6b4 Provider \ub610\ub294 \ubc31\uc5d4\ub4dc \uc124\uc815 \ucd94\uac00 \ubcc0\uacbd\ud588\uc744 \ub54c \ubc18\ub4dc\uc2dc \uba3c\uc800 \uc218\ud589\ud55c\ub2e4.<\/span><\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">terraform plan(\uacc4\ud68d \uc218\ub9bd)<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ud604\uc7ac \uc791\uc131\ub41c \ud14c\ub77c\ud3fc \ucf54\ub4dc\uc640 \uc2e4\uc81c \uc778\ud504\ub77c \uc0c1\ud0dc(tfstate) \ud30c\uc77c \ubc0f \ud074\ub77c\uc6b0\ub4dc \uc11c\ube44\uc2a4\ub97c \ube44\uad50\ud558\uc5ec \uc55e\uc73c\ub85c \uc5b4\ub5a4 \ubcc0\uacbd\uc774 \ubc1c\uc0dd\ud560\uc9c0 \uc2e4\ud589 \uacc4\ud68d\uc744 \ubcf4\uc5ec\uc900\ub2e4. \uc2e4\uc81c \uc778\ud504\ub77c\uc5d0 \ubcc0\uacbd\uc744 \uac00\ud558\uae30 \uc804\uc5d0 \uc624\ub958\uac00 \uc5c6\ub294\uc9c0 \ubbf8\ub9ac \uac80\ud1a0\ud560 \uc218 \uc788\ub294 \uc548\uc804\ud55c \uae30\ud68c\ub97c \uc81c\uacf5\ud55c\ub2e4. apply \uc2e4\ud589 \uc804\uc5d0 plan\uc744 \uc2e4\ud589\ud558\uc5ec \ubcc0\uacbd \uc0ac\ud56d\uc744 \ud655\uc778\ud558\ub294 \uac83\uc740 \uc778\ud504\ub77c \uc6b4\uc601\uc758 \ud544\uc218 \uc801\uc774\ub2e4.<\/span><\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">terraform apply(\uc801\uc6a9)<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">plan\uba85\ub839\uc73c\ub85c \ud655\uc778\ud588\ub358 \uc2e4\ud589 \uacc4\ud68d\uc744 \uc2e4\uc81c\ub85c \uc778\ud504\ub77c\uc5d0 \uc801\uc6a9\ud558\uc5ec \ub9ac\uc18c\uc2a4\ub97c \uc0dd\uc131 \uc218\uc815 \ub610\ub294 \uc0ad\uc81c\ud55c\ub2e4. yes\uc744 \uc785\ub825\ud558\uc5ec \uc801\uc6a9\uc744 \uc2b9\uc778\ud558\ub3c4\ub85d \uc694\uccad\ud569\ub2c8\ub2e4. \ubcc0\uacbd \uc0ac\ud56d\uc774 \uc131\uacf5\uc801\uc73c\ub85c \uc801\uc6a9\ub418\uba74 state file(tfstate)\uc744 \uc5c5\ub370\uc774\ud2b8\ud558\uc5ec \uc778\ud504\ub77c\uc758 \ucd5c\uc885\uc0c1\ud0dc\ub97c \uae30\ub85d\ud55c\ub2e4.<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">VPC\ub97c \ud14c\ub77c\ud3fc\uc744 \uc774\uc6a9\ud574 \ucf54\ub4dc\ub85c \uad6c\ucd95 \uc608\uc81c<\/span><\/h3>\n<table style=\"border-collapse: collapse; width: 100%; height: 123px;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr style=\"height: 18px;\">\n<td style=\"width: 23.6047%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc774\ub984<\/span><\/td>\n<td style=\"width: 76.3953%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc124\uba85<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 23.6047%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\"><b>VPC<\/b><\/span><\/td>\n<td style=\"width: 76.3953%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic'; color: #333333; text-align: start;\">AWS \ud074\ub77c\uc6b0\ub4dc\uc5d0\uc11c \ub17c\ub9ac\uc801\uc73c\ub85c \ubd84\ub9ac\ub41c \ub098\ub9cc\uc758 \uac00\uc0c1 \ub124\ud2b8\uc6cc\ud06c \uacf5\uac04\uc785\ub2c8\ub2e4. IP \uc8fc\uc18c \ub300\uc5ed\uc73c \uc9c0\uc815\ud558\uc5ec \uc0dd\uc131\ud558\uba70 \ubaa8\ub4e0 AWS \ub9ac\uc18c\uc2a4\ub294 \uc774 VPC\ub0b4\ubd80\uc5d0 \uc874\uc7ac\ud569\ub2c8\ub2e4.<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 23.6047%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\"><b>\uc11c\ube0c\ub137<\/b><\/span><\/td>\n<td style=\"width: 76.3953%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic'; color: #333333; text-align: start;\">VPC\uc758 IP \uc8fc\uc18c \ub300\uc5ed\uc744 \ub354 \uc791\uac8c \ub098\ub208 \ub124\ud2b8\uc6cc\ud06c \uc601\uc5ed\uc774\ub2e4. \uac01 \uc11c\ube0c\ub137\uc740 \ud558\ub098\uc758 \uac00\uc6a9 \uc601\uc5ed\uc5d0 \uc18d\ud558\uba70 \uc6a9\ub3c4\uc5d0 \ub530\ub77c \ud37c\ud50c\ub9ad\uacfc \ud504\ub77c\uc774\ube57\uc73c\ub85c \ub098\ub208\ub2e4.<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 23.6047%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\"><b>\ub77c\uc6b0\ud305 \ud14c\uc774\ube14<\/b><\/span><\/td>\n<td style=\"width: 76.3953%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic'; color: #333333; text-align: start;\">\uc11c\ube0c\ub137 \ub0b4\ubd80\uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \ub124\ud2b8\uc6cc\ud06c \ud2b8\ub798\ud53d\uc774 \uc5b4\ub514\ub85c \ud5a5\ud574\uc57c \ud558\ub294\uc9c0 \uaddc\uce59\uc744 \uc815\uc758\ud558\ub294 \ud14c\uc774\ube14\uc774\ub2e4. \uac01 \uc11c\ube0c\ub137\uc740 \ubc18\ub4dc\uc2dc \ud558\ub098\uc758 \ub77c\uc6b0\ud305 \ud14c\uc774\ube14\uacfc \uc5f0\uacb0\ub418\uc5b4\uc57c\ud55c\ub2e4.<\/span><\/td>\n<\/tr>\n<tr style=\"height: 15px;\">\n<td style=\"width: 23.6047%; height: 15px;\"><span style=\"font-family: 'Nanum Gothic';\"><b>\uc778\ud130\ub137 \uac8c\uc774\ud2b8\uc6e8\uc774 IGW<\/b><\/span><\/td>\n<td style=\"width: 76.3953%; height: 15px;\"><span style=\"font-family: 'Nanum Gothic'; color: #333333; text-align: start;\">VPC\uc640 \uc678\ubd80 \uc778\ud130\ub137 \uac04\uc758 \ud1b5\uc2e0\uc744 \uac00\ub2a5\ud558\uac8c \ud558\ub294 \uac8c\uc774\ud2b8\uc6e8\uc774\uc774\ub2e4. \ud37c\ube14\ub9ad \uc11c\ube0c\ub137\uc740 IGW\ub97c \ud1b5\ud574 \uc9c1\uc811 \uc778\ud130\ub137\uacfc \ud1b5\uc2e0\ud560 \uc218 \uc788\ub2e4.<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 23.6047%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\"><b>NAT Gateway NGW<\/b><\/span><\/td>\n<td style=\"width: 76.3953%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic'; color: #333333; text-align: start;\">\ud504\ub77c\uc774\ube57 \uc11c\ube0c\ub137\uc5d0 \uc788\ub294 \ub9ac\uc18c\uc2a4\uac00 \uc678\ubd80 \uc778\ud130\ub137\uc73c\ub85c\uc758 \uc544\uc6c3\ubc14\uc6b4\ub4dc \ud1b5\uc2e0\uc740 \uac00\ub2a5\ud558\uc9c0\ub9cc \uc678\ubd80\uc5d0\uc11c \ud574\ub2f9 \ub9ac\uc18c\uc2a4\ub85c \uc778\ubc14\uc6b4\ub4dc \uc811\uadfc\uc740 \ubd88\uac00\ub2a5\ud558\ub3c4\ub85d \ud574\uc8fc\ub294 \uc11c\ube44\uc2a4\uc774\ub2e4. \ud37c\ube14\ub9ad \uc11c\ube0c\ub137\uc5d0 \uc704\uce58\ud558\uba70 \uc678\ubd80 \ud1b5\uc2e0\uc744 \uc704\ud574 EIP\uc640 \uc5f0\uacbd\ub41c\ub2e4.<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 23.6047%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\"><b>EIP<\/b><\/span><\/td>\n<td style=\"width: 76.3953%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic'; color: #333333; text-align: start;\">AWS\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uace0\uc815\ub41c \uacf5\uc778 IP \uc8fc\uc18c\ub85c NAT GW\uc5d0 \ud560\ub2f9\ub418\uc5b4 \uc678\ubd80 \ud1b5\uc2e0\uc758 \uace0\uc815 IP\uc5ed\ud560\uc744 \ud55c\ub2e4.<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">main.tf<\/span><\/h4>\n<pre id=\"code_1760925621649\" class=\"java\" data-ke-language=\"java\" data-ke-type=\"codeblock\"><code>resource \"aws_vpc\" \"test_vpc\" {\n  cidr_block = \"10.0.0.0\/16\"\n\n  tags = {\n    Name = \"test-101\"\n  }\n}\n\nresource \"aws_subnet\" \"public_subnet\" {\n  vpc_id     = aws_vpc.test_vpc.id\n  cidr_block = \"10.0.1.0\/24\"\n\n  availability_zone = \"ap-northeast-2a\"\n\n  tags = {\n    Name = \"terraform-101-public-subnet\"\n  }\n}\n\nresource \"aws_subnet\" \"private_subnet\" {\n  vpc_id     = aws_vpc.test_vpc.id\n  cidr_block = \"10.0.10.0\/24\"\n\n  tags = {\n    Name = \"terraform-101-private-subnet\"\n  }\n}\n\nresource \"aws_internet_gateway\" \"igw\" {\n  vpc_id = aws_vpc.test_vpc.id\n\n  tags = {\n    Name = \"terraform-101-igw\"\n  }\n}\n\nresource \"aws_eip\" \"nat\" {\n  lifecycle {\n    create_before_destroy = true\n  }\n}\n\nresource \"aws_nat_gateway\" \"ngw\" {\n  allocation_id = aws_eip.nat.id\n\n  subnet_id = aws_subnet.public_subnet.id\n\n  tags = {\n    Name = \"terraform-101-ngw\"\n  }\n}\n\nresource \"aws_route_table\" \"public\" {\n  vpc_id = aws_vpc.test_vpc.id\n\n  tags = {\n    Name = \"terraform-101-rt-public\"\n  }\n}\n\nresource \"aws_route_table_association\" \"route_table_association_public\" {\n  subnet_id = aws_subnet.public_subnet.id\n  route_table_id = aws_route_table.public.id\n}\n\nresource \"aws_route\" \"public_nat\" {\n  route_table_id = aws_route_table.public.id\n  destination_cidr_block = \"0.0.0.0\/0\"\n  gateway_id = aws_internet_gateway.igw.id\n}\n\nresource \"aws_route_table\" \"private\" {\n  vpc_id = aws_vpc.test_vpc.id\n\n  tags = {\n    Name = \"terraform-101-rt-private\"\n  }\n}\n\nresource \"aws_route_table_association\" \"route_table_association_private\" {\n  subnet_id = aws_subnet.private_subnet.id\n  route_table_id = aws_route_table.private.id\n}\n\nresource \"aws_route\" \"private_nat\" {\n  route_table_id = aws_route_table.private.id\n  destination_cidr_block = \"0.0.0.0\/0\"\n  nat_gateway_id = aws_nat_gateway.ngw.id\n}<\/code><\/pre>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ub124\ud2b8\uc6cc\ud06c\uc758 \uae30\ubcf8 \ud2c0<\/span><\/p>\n<table style=\"border-collapse: collapse; width: 100%; height: 91px;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr style=\"height: 19px;\">\n<td style=\"width: 25.0775%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\ucf54\ub4dc \ub9ac\uc18c\uc2a4<\/span><\/td>\n<td style=\"width: 25.0775%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc5ed\ud560<\/span><\/td>\n<td style=\"width: 49.8449%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc0c1\uc138 \uc124\uba85<\/span><\/td>\n<\/tr>\n<tr style=\"height: 38px;\">\n<td style=\"width: 25.0775%; height: 38px;\"><span style=\"font-family: 'Nanum Gothic';\">aws_vpc<\/span><\/td>\n<td style=\"width: 25.0775%; height: 38px;\"><span style=\"font-family: 'Nanum Gothic';\">\uac00\uc0c1 \ub124\ud2b8\uc6cc\ud06c \uc804\uccb4(VPC)<\/span><\/td>\n<td style=\"width: 49.8449%; height: 38px;\"><span style=\"font-family: 'Nanum Gothic';\">\ubaa8\ub4e0 AWS \ub9ac\uc18c\uc2a4\uac00 \uc704\uce58\ud560 \ub098\ub9cc\uc758 \uaca9\ub9ac\ub41c \uc0ac\uc124 \ub124\uc774\ud2b8\uc6cc\ud06c \uacf5\uac04 10.0.0.0\/16<\/span><\/td>\n<\/tr>\n<tr style=\"height: 17px;\">\n<td style=\"width: 25.0775%; height: 17px;\"><span style=\"font-family: 'Nanum Gothic';\">aws_subnet.public_subnet<\/span><\/td>\n<td style=\"width: 25.0775%; height: 17px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud37c\ube14\ub9ad \uad6c\uc5ed<\/span><\/td>\n<td style=\"width: 49.8449%; height: 17px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc678\ubd80 \uc778\ud130\ub137\uacfc \uc9c1\uc811 \ud1b5\uc2e0\uc774 \uac00\ub2a5\ud55c \uc601\uc5ed\uc73c\ub85c \uc6f9 \uc11c\ubc84\uc758 \ub85c\ub4dc \ubc38\ub7f0\uc11c \ub4f1\uc774 \uc704\uce58 10.0.1.0\/24<\/span><\/td>\n<\/tr>\n<tr style=\"height: 17px;\">\n<td style=\"width: 25.0775%; height: 17px;\"><span style=\"font-family: 'Nanum Gothic';\">aws_subnet.private_subnet<\/span><\/td>\n<td style=\"width: 25.0775%; height: 17px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud504\ub77c\uc774\ube57 \uad6c\uc5ed<\/span><\/td>\n<td style=\"width: 49.8449%; height: 17px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc678\ubd80\uc5d0\uc11c \uc9c1\uc811 \uc811\uadfc\ud560 \uc218 \uc5c6\ub3c4\ub85d \ubcf4\ud638\ub418\ub294 \uc601\uc5ed\uc73c\ub85c DB \uc11c\ubc84\ub4f1 \uc911\uc694\ud55c \ub9ac\uc18c\uc2a4\uac00 \uc704\uce58 10.0.10.0\/24<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ud37c\ube14\ub9ad \uc11c\ube0c\ub137\uc744 \uc704\ud55c \uc778\ud130\ub137 \uac8c\uc774\ud2b8\uc6e8\uc774<\/span><\/p>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr>\n<td style=\"width: 25.1938%;\"><span style=\"font-family: 'Nanum Gothic';\">\ucf54\ub4dc \ub9ac\uc18c\uc2a4<\/span><\/td>\n<td style=\"width: 25.31%;\"><span style=\"font-family: 'Nanum Gothic';\">\uc5ed\ud560<\/span><\/td>\n<td style=\"width: 49.4961%;\"><span style=\"font-family: 'Nanum Gothic';\">\uc0c1\uc138 \uc124\uba85<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 25.1938%;\"><span style=\"font-family: 'Nanum Gothic';\">aws_internet_gateway<\/span><\/td>\n<td style=\"width: 25.31%;\"><span style=\"font-family: 'Nanum Gothic';\">\uc778\ud130\ub137 \uc815\ubb38<\/span><\/td>\n<td style=\"width: 49.4961%;\"><span style=\"font-family: 'Nanum Gothic';\">VPC\uc640 AWS\uc678\ubd80 \uc778\ud130\ub137\uc744 \uc5f0\uacbd\ud574\uc8fc\ub294 \ud1b5\ub85c<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 25.1938%;\"><span style=\"font-family: 'Nanum Gothic';\">aws_route(public_nat)<\/span><\/td>\n<td style=\"width: 25.31%;\"><span style=\"font-family: 'Nanum Gothic';\">\ud37c\ube14\ub9ad \uacbd\ub85c<\/span><\/td>\n<td style=\"width: 49.4961%;\"><span style=\"font-family: 'Nanum Gothic';\">\ud37c\ube14\ub9ad \uc11c\ube0c\ub137\uc758 \ubaa8\ub4e0 \uc678\ubd80 \ud2b8\ub798\ud53d(0.0.0.0\/0)\uc774 IGW\ub97c \ud1b5\ud574 \uc778\ud130\ub137\uc73c\ub85c \ub098\uac00\ub3c4\ub85d \uaddc\uce59\uc744 \ub9cc\ub4ec<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ud504\ub77c\uc774\ube57 \uc11c\ube0c\ub137\uc744 \uc704\ud55c NAT \uac8c\uc774\ud2b8\uc6e8\uc774<\/span><\/p>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr>\n<td style=\"width: 25.0774%;\"><span style=\"font-family: 'Nanum Gothic';\">\ucf54\ub4dc \ub9ac\uc18c\uc2a4<\/span><\/td>\n<td style=\"width: 25.3101%;\"><span style=\"font-family: 'Nanum Gothic';\">\uc5ed\ud560<\/span><\/td>\n<td style=\"width: 49.6124%;\"><span style=\"font-family: 'Nanum Gothic';\">\uc0c1\uc138 \uc124\uba85<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 25.0774%;\"><span style=\"font-family: 'Nanum Gothic';\">aws_eip<\/span><\/td>\n<td style=\"width: 25.3101%;\"><span style=\"font-family: 'Nanum Gothic';\">\uace0\uc815 \uacf5\uc778 IP<\/span><\/td>\n<td style=\"width: 49.6124%;\"><span style=\"font-family: 'Nanum Gothic';\">NAT GW\uc5d0 \ud560\ub2f9\ud560 \uace0\uc815 IP \uc8fc\uc18c<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 25.0774%;\"><span style=\"font-family: 'Nanum Gothic';\">aws_nat_gatway<\/span><\/td>\n<td style=\"width: 25.3101%;\"><span style=\"font-family: 'Nanum Gothic';\">\ud504\ub77c\uc774\ube57\uc758 \ucd9c\uad6c<\/span><\/td>\n<td style=\"width: 49.6124%;\"><span style=\"font-family: 'Nanum Gothic';\">private_subnet\uc758 \uc11c\ubc84\ub4e4\uc774 \ubcf4\uc548\uc740 \uc720\uc9c0\ud55c \ucc44 \uc678\ubd80 \uc778\ud130\ub137\uc73c\ub85c \ub098\uac08\uc218 \uc788\ub3c4\ub85d \ub3d5\ub294 \uc7a5\uce58<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 25.0774%;\"><span style=\"font-family: 'Nanum Gothic';\">aws_route(private_nat)<\/span><\/td>\n<td style=\"width: 25.3101%;\"><span style=\"font-family: 'Nanum Gothic';\">\ud504\ub77c\uc774\ube57 \uacbd\ub85c<\/span><\/td>\n<td style=\"width: 49.6124%;\"><span style=\"font-family: 'Nanum Gothic';\">\ud504\ub77c\uc774\ube57 \uc11c\ube0c\ub137\uc758 \ubaa8\ub4e0 \uc678\ubd80 \ud2b8\ub798\ud53d\uc774 NAT GW\ub97c \ud1b5\ud574\uc11c\ub9cc \ub098\uac00\ub3c4\ub85d \uaddc\uce59\uc744 \ub9cc\ub4e0\ub2e4. \uc678\ubd80\uc5d0\uc11c\ub294 \ub0b4\ubd80\ub85c\uc758 \uc9c1\uc811 \uc811\uadfc\uc740 \ubd88\uac00\ub2a5<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">aws_route_table\ub294 \ud2b8\ub798\ud53d \uacbd\ub85c \uaddc\uce59\uc744 \ub2f4\ub294 \uadf8\ub987(\ucee8\ud14c\uc774\ub108)\uc774\uba70 route\ub294 \uadf8 \ucee8\ud14c\uc774\ub108 \uc548\uc5d0 \ub4e4\uc5b4\uac00\ub294 \ud2b9\uc815 \ud2b8\ub798\ud53d\uc744 \uc804\uc1a1 \ubc29\ud5a5\uc744 \uc815\uc758\ud558\ub294 \uac1c\ubcc4 \uaddc\uce59\uc774\ub2e4.<\/span><\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">variables.tf\uc640 providers.tf\uc740 AWS \ud658\uacbd\uc5d0 \ub9ac\uc18c\uc2a4\ub97c \ubc30\ud3ec\ud558\ub294 \ub370 \ud544\uc694\ud55c \uae30\ubcf8 \ud658\uacbd<\/span><\/h3>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">provider.tf\ub294 <span style=\"color: #333333; text-align: start;\">hashicorp\/aws \ud504\ub85c\ubc14\uc774\ub354\ub97c \uc0ac\uc6a9\ud558\uc5ec AWS \ub9ac\uc18c\uc2a4\ub97c \uad00\ub9ac\ud558\uba70, \ub9ac\uc804\uc740 \uc815\uc758\ub41c \ubcc0\uc218(var.region)\ub97c \ub530\ub978\ub2e4.<\/span><\/span><\/p>\n<div style=\"background-color: #1e1f22; color: #bcbec4;\">\n<pre class=\"java\" data-ke-language=\"java\"><code>terraform {\n  required_version = \"&gt;= 1.6.0\"\n  required_providers {\n    aws = {\n      source  = \"hashicorp\/aws\"\n      version = \"~&gt; 5.55\"\n    }\n  }\n}\n\nprovider \"aws\" {\n  region = var.region\n}<\/code><\/pre>\n<\/div>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">variables.tf\ub294 AWS \ub9ac\uc804 \ubcc0\uc218\ub97c \uc815\uc758\ud558\uace0, ap-northeast-2\ub97c \uae30\ubcf8\uac12\uc73c\ub85c \uc124\uc815\ud558\uc5ec \ud55c\uad6d \ub9ac\uc804\uc5d0 \uc778\ud504\ub77c\uac00 \uad6c\ucd95\ub418\ub3c4\ub85d \ud55c\ub2e4.<\/span><\/p>\n<div style=\"background-color: #1e1f22; color: #bcbec4;\">\n<pre class=\"java\" data-ke-language=\"java\"><code>variable \"region\" {\n  description = \"AWS \ub9ac\uc804\"\n  type        = string\n  default     = \"ap-northeast-2\"\n}<\/code><\/pre>\n<\/div>","category":"Backend","author":"seungwonlee","guid":"https:\/\/seungwontech.tistory.com\/121","comments":"https:\/\/seungwontech.tistory.com\/121#entry121comment","pubDate":"Fri, 17 Oct 2025 18:06:15 +0900"},{"title":"JPA\uc5d0\uc11c JDBC\ub85c \uc804\ud658\ud588\ub354\ub2c8 \uc131\ub2a5\uc774 10\ubc30 \ube68\ub77c\uc84c\ub2e4","link":"https:\/\/seungwontech.tistory.com\/120","description":"<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">Spring Batch\ub85c \ubc30\uce58 \uc801\uc7ac \uae30\ub2a5\uc744 \uac1c\ubc1c\ud558\uba74\uc11c Writer\ub97c JPA\ub85c \uad6c\ud604\ud560\uc9c0, JDBC\ub85c \ud560\uc9c0\ub97c \uace0\ubbfc\ud558\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \ub370\uc774\ud130 \uc870\ud68c\ub294 \uc774\ubbf8 JPA\ub97c \uae30\ubc18\uc73c\ub85c \ud558\uace0 \uc788\uc5c8\uace0 Spring Batch\uc5d0\uc11c\ub3c4 JpaItemWriter\ub97c \uae30\ubcf8\uc801\uc73c\ub85c \uc81c\uacf5\ud558\ubbc0\ub85c \ucc98\uc74c\uc5d0\ub294 \uc790\uc5f0\uc2a4\ub7fd\uac8c JPA\ub97c \uc120\ud0dd\ud588\uc2b5\ub2c8\ub2e4. \uc2e4\uc81c\ub85c \ucf54\ub4dc\ub3c4 \uac04\uacb0\ud588\uace0 \ub370\uc774\ud130\ub7c9\ub3c4 \uc801\ub2e4 \ubcf4\ub2c8 \uc131\ub2a5\ub3c4 \ucda9\ubd84\ud558\ub2e4\uace0 \ud310\ub2e8\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-end=\"872\" data-start=\"761\" data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ud558\uc9c0\ub9cc Writer\ub97c JDBC \uae30\ubc18\uc73c\ub85c \ubcc0\uacbd\ud558\uba74 \uc5b4\ub5a4 \ucc28\uc774\uac00 \uc788\uc744\uc9c0 \uad81\uae08\ud574\uc838 JdbcBatchItemWriter\ub85c \ub3d9\uc77c\ud55c \uc791\uc5c5\uc744 \uc218\ud589\ud574 \ubd24\uace0 \uacb0\uacfc\uc801\uc73c\ub85c \uc608\uc0c1 \uc774\uc0c1\uc758 \uc131\ub2a5 \ud5a5\uc0c1\uc744 \ud655\uc778\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ub450 Writer\uc758 \uc131\ub2a5\uc744 \ube44\uad50\ud558\uae30 \uc704\ud574 \uccad\ud06c \ub2e8\uc704\uc758 \uc2e4\ud589 \uc2dc\uac04\uc744 \uce21\uc815\ud558\ub294 WriterTimingListener\ub97c \ucd94\uac00\ub85c \uad6c\ud604\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<pre id=\"code_1760419361770\" class=\"java\" data-ke-language=\"java\" data-ke-type=\"codeblock\"><code>@Slf4j\npublic class WriterTimingListener implements ItemWriteListener&lt;Weather&gt; {\n\n    private Instant startTime;\n\n    @Override\n    public void beforeWrite(Chunk&lt;? extends Weather&gt; items) {\n        startTime = Instant.now();\n        log.info(\"&gt;&gt;&gt;&gt; Writer - \uccad\ud06c \uc4f0\uae30 \uc2dc\uc791. \uc544\uc774\ud15c \uc218: {}\", items.size());\n    }\n\n    @Override\n    public void afterWrite(Chunk&lt;? extends Weather&gt; items) {\n        if (startTime == null) {\n            log.warn(\"Writer - \uc2dc\uc791 \uc2dc\uac04\uc774 \uae30\ub85d\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. afterWrite\uac00 \uba3c\uc800 \ud638\ucd9c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\");\n            return;\n        }\n        var endTime = Instant.now();\n        var duration = Duration.between(startTime, endTime);\n        var itemCount = items.size();\n\n        log.info(\"&lt;&lt;&lt;&lt; Writer - \uccad\ud06c \uc4f0\uae30 \uc644\ub8cc. \uc18c\uc694 \uc2dc\uac04: {} ms, \uc544\uc774\ud15c \uc218: {}\",\n                duration.toMillis(), itemCount);\n\n        if (itemCount &gt; 0) {\n            double avgTime = (double) duration.toMillis() \/ itemCount;\n            log.info(\"---- Writer - \uc544\uc774\ud15c\ub2f9 \ud3c9\uade0 \ucc98\ub9ac \uc2dc\uac04: {} ms\", String.format(\"%.3f\", avgTime));\n        }\n    }\n\n    @Override\n    public void onWriteError(Exception exception, Chunk&lt;? extends Weather&gt; items) {\n        log.error(\"!!!! Writer - \uccad\ud06c \uc4f0\uae30 \uc624\ub958 \ubc1c\uc0dd. \uc544\uc774\ud15c \uc218: {}, \uc624\ub958: {}\",\n                items.size(), exception.getMessage());\n    }\n}<\/code><\/pre>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uba3c\uc800 API \ud638\ucd9c \ud6c4 \uac00\uacf5\ud55c \ub4a4 insert\ub97c \ud569\ub2c8\ub2e4. \ub370\uc774\ud130\ub294 290\uac1c \uc911 97\uac1c\ub9cc \uc801\uc7ac\ud569\ub2c8\ub2e4. <\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">3\ubc88 \ubc18\ubcf5 \ud14c\uc2a4\ud2b8\ub97c \ud1b5\ud574 \ud3c9\uade0\uc744 \uad6c\ud574\ubd24\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">JpaItemWriter \ucf54\ub4dc\uc785\ub2c8\ub2e4. \ube44\uad50\uc801 \uae54\ub054\ud558\ub2e4\uace0 \uc0dd\uac01\ud569\ub2c8\ub2e4.<\/span><\/p>\n<pre id=\"code_1760408808969\" class=\"java\" data-ke-language=\"java\" data-ke-type=\"codeblock\"><code>@Bean\npublic Step weatherStep(WeatherItemReader reader, WeatherItemProcessor processor, JpaItemWriter&lt;Weather&gt; weatherJpaWriter, WriterTimingListener writerTimingListener) {\n    return new StepBuilder(JOB_NAME + \"weatherStep\", jobRepository)\n            .&lt;WeatherItem, Weather&gt;chunk(300, transactionManager)\n            .reader(reader)\n            .processor(processor)\n            .writer(weatherJpaWriter)\n            .listener(writerTimingListener)\n            .faultTolerant()\n            .retryLimit(3)\n            .retry(CoreException.class)\n            .build();\n\n}\n\n@Bean\npublic JpaItemWriter&lt;Weather&gt; weatherJpaWriter(EntityManagerFactory emf) {\n    JpaItemWriter&lt;Weather&gt; w = new JpaItemWriter&lt;&gt;();\n    w.setEntityManagerFactory(emf);\n    w.setUsePersist(false);\n    return w;\n}<\/code><\/pre>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\"><b>\ud3c9\uade0 \uc18c\uc694 \uc2dc\uac04\uc740 121.67ms\uc785\ub2c8\ub2e4. \uc544\uc774\ud15c\ub2f9 \ud3c9\uade0 \ucc98\ub9ac \uc2dc\uac04\uc740 \uc57d 1.254ms<\/b><\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc18c\uc694 \uc2dc\uac04: 122ms, \uc544\uc774\ud15c \uc218: 97<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc544\uc774\ud15c\ub2f9 \ud3c9\uade0 \ucc98\ub9ac \uc2dc\uac04: 1.258ms<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc18c\uc694 \uc2dc\uac04: 124ms, \uc544\uc774\ud15c \uc218: 97<\/span><br \/><span style=\"font-family: 'Nanum Gothic';\">\uc544\uc774\ud15c\ub2f9 \ud3c9\uade0 \ucc98\ub9ac \uc2dc\uac04: 1.278ms<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc18c\uc694 \uc2dc\uac04: 119ms, \uc544\uc774\ud15c \uc218: 97<\/span><br \/><span style=\"font-family: 'Nanum Gothic';\">\uc544\uc774\ud15c\ub2f9 \ud3c9\uade0 \ucc98\ub9ac \uc2dc\uac04: 1.227ms<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">JdbcBatchItemWriter \ucf54\ub4dc\uc785\ub2c8\ub2e4. SQL\uc744 \uc9c1\uc811 \uc791\uc131\ud569\ub2c8\ub2e4.<\/span><\/p>\n<pre id=\"code_1760415466462\" class=\"java\" data-ke-language=\"java\" data-ke-type=\"codeblock\"><code>@Bean\npublic Step weatherStep(WeatherItemReader reader, WeatherItemProcessor processor, JdbcBatchItemWriter&lt;Weather&gt; weatherJdbcWriter, WriterTimingListener writerTimingListener) {\n    return new StepBuilder(JOB_NAME + \"weatherStep\", jobRepository)\n            .&lt;WeatherItem, Weather&gt;chunk(300, transactionManager)\n            .reader(reader)\n            .processor(processor)\n            .writer(weatherJdbcWriter)\n            .listener(writerTimingListener)\n            .faultTolerant()\n            .retryLimit(3)\n            .retry(CoreException.class)\n            .build();\n}\n\n@Bean\npublic JdbcBatchItemWriter&lt;Weather&gt; weatherJdbcWriter() {\n    String sql = \"INSERT INTO OUTDOOR_WEATHER (COLLECT_DT, NX, NY, OUTDOOR_TYPE, VALUE, CREATE_DT) \" +\n                 \"VALUES (:collectDt, :nx, :ny, :outdoorType, :value, NOW())\";\n\n    return new JdbcBatchItemWriterBuilder&lt;Weather&gt;()\n            .dataSource(dataSource)\n            .sql(sql)\n            .itemSqlParameterSourceProvider(item -&gt; new MapSqlParameterSource()\n                    .addValue(\"collectDt\", item.getCollectDt())\n                    .addValue(\"nx\", item.getNx())\n                    .addValue(\"ny\", item.getNy())\n                    .addValue(\"outdoorType\", item.getOutdoorType().name())\n                    .addValue(\"value\", item.getValue()))\n            .build();\n}<\/code><\/pre>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\"><b>\ud3c9\uade0 \uc18c\uc694 \uc2dc\uac04\uc740 11.33ms\uc785\ub2c8\ub2e4. \uc544\uc774\ud15c\ub2f9 \ud3c9\uade0 \ucc98\ub9ac \uc2dc\uac04\uc740 \uc57d 0.117ms<\/b><\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc18c\uc694 \uc2dc\uac04: 13ms, \uc544\uc774\ud15c \uc218: 97<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc544\uc774\ud15c\ub2f9 \ud3c9\uade0 \ucc98\ub9ac \uc2dc\uac04: 0.134ms<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc18c\uc694 \uc2dc\uac04: 12ms, \uc544\uc774\ud15c \uc218: 97<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc544\uc774\ud15c\ub2f9 \ud3c9\uade0 \ucc98\ub9ac \uc2dc\uac04: 0.124ms<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc18c\uc694 \uc2dc\uac04: 9ms, \uc544\uc774\ud15c \uc218: 97<\/span><br \/><span style=\"font-family: 'Nanum Gothic';\">\uc544\uc774\ud15c\ub2f9 \ud3c9\uade0 \ucc98\ub9ac \uc2dc\uac04: 0.093ms<\/span><\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">JdbcBatchItemWriter \uc0ac\uc6a9 \uc2dc, JpaItemWriter \ub300\ube44 <b>\uc804\uccb4 \ucc98\ub9ac \uc2dc\uac04\uc774 \uc57d 90% \uac10\uc18c<\/b>\ud588\uace0 <b>\uc131\ub2a5\uc774 \uc57d 10\ubc30 \uc774\uc0c1 \ud5a5\uc0c1<\/b>\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc131\ub2a5 \ucc28\uc774\uac00 \ubc1c\uc0dd\ud55c \uc774\uc720\ub294 JPA\uac00 \uc5d4\ud2f0\ud2f0 \uc0c1\ud0dc \uad00\ub9ac, \uc601\uc18d\uc131 \ucee8\ud14d\uc2a4\ud2b8 \ub4f1 \ubd80\uac00 \uc791\uc5c5\uc744 \ub3d9\ubc18\ud558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. <\/span><span style=\"font-family: 'Nanum Gothic';\">\ubc18\uba74 JDBC\ub294 ORM \uad00\ub828 \ube44\uc6a9\uc774 \uc804\ud600 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uc544 \uc21c\uc218\ud558\uac8c \ub370\uc774\ud130\ub97c \uc801\uc7ac\ud558\ub294 \uc791\uc5c5\uc5d0\ub9cc \uc9d1\uc911\ud558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. Batch Writer\uc5d0\uc11c\ub294 JDBC \ubc29\uc2dd\uc774 \ub9e4\uc6b0 \ud6a8\uc728\uc801\uc77c \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc774\ubc88 \ud14c\uc2a4\ud2b8\ub97c \ud1b5\ud574 \ud655\uc778\ud588\uc2b5\ub2c8\ub2e4. JPA\uc640 JDBC\ub97c \uc801\uc808\ud788 \uc120\ud0dd\ud558\ub294 \uc804\ub7b5\uc774 \ud544\uc694\ud558\ub2e4\ub294 \uac78 \ub2e4\uc2dc \ud55c\ubc88 \ub290\ub07c\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p data-end=\"193\" data-start=\"161\" data-ke-size=\"size16\">&nbsp;<\/p>","category":"Backend","author":"seungwonlee","guid":"https:\/\/seungwontech.tistory.com\/120","comments":"https:\/\/seungwontech.tistory.com\/120#entry120comment","pubDate":"Tue, 14 Oct 2025 10:44:56 +0900"},{"title":"\uac00\uba74\uc0ac\ubc30 11\uc7a5 \ub274\uc2a4 \ud53c\ub4dc \uc2dc\uc2a4\ud15c \uc124\uacc4","link":"https:\/\/seungwontech.tistory.com\/119","description":"<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">\ub274\uc2a4 \ud53c\ub4dc \uc2dc\uc2a4\ud15c<\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc0ac\uc6a9\uc790\uac00 \ud314\ub85c\uc6b0\ud558\uac70\ub098 \uce5c\uad6c\ub85c \ub4f1\ub85d\ud55c \uc0ac\ub78c\ub4e4\uc758 \ucd5c\uc2e0 \ud65c\ub3d9\uc744 \uc2dc\uac04\uc21c \ub610\ub294 \ucd94\ucc9c \ubc29\uc2dd\uc73c\ub85c \ubcf4\uc5ec\uc8fc\ub294 \uae30\ub2a5\uc73c\ub85c \ub300\ud45c\uc801\uc778 \uc11c\ube44\uc2a4\ub85c\ub294 \ud398\uc774\uc2a4\ubd81, \uc778\uc2a4\ud0c0 \ub4f1\uc774 \uc788\uc2b5\ub2c8\ub2e4. 11\uc7a5\uc740 \uc774 \ub274\uc2a4 \ud53c\ub4dc \uc2dc\uc2a4\ud15c\uc758 \uc124\uacc4 \ubc29\ubc95\uc744 \ub2e4\ub8f9\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">\ub274\uc2a4 \ud53c\ub4dc \uc2dc\uc2a4\ud15c\uc758 \uc8fc\uc694 \uae30\ub2a5\uacfc \uc694\uad6c\uc0ac\ud56d \uc815\ub9ac<\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">1. \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uc9c0\uc6d0<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">2. \ud53c\ub4dc \ubc1c\ud589<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">3. \ud53c\ub4dc \uc77d\uae30<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">4. \ucd5c\uc2e0\uc21c\uc73c\ub85c \ud45c\uc2dc<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">5. \ud55c \uba85\uc758 \uc0ac\uc6a9\uc790\ub294 \ucd5c\ub300 5000\uba85\uc758 \uce5c\uad6c\ub97c \uac00\uc9c8 \uc218 \uc788\uace0 \ub9e4\uc77c \ucc9c\ub9cc \uba85\uc774 \ubc29\ubb38<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">6. \uc774\ubbf8\uc9c0, \ube44\ub514\uc624 \ub4f1\uc758 \ubbf8\ub514\uc5b4 \ud30c\uc77c\ub3c4 \ud3ec\ud568<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">\ub450 \uac00\uc9c0 \ud575\uc2ec \ubd80\ubd84<\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">1. <b>\ud53c\ub4dc \ubc1c\ud589<\/b>\uc740 \uc0ac\uc6a9\uc790\uac00 \uc2a4\ud1a0\ub9ac\ub97c \ud3ec\uc2a4\ud305\ud558\uba74 \ub370\uc774\ud130\ub97c \uce90\uc2dc\uc640 DB\uc5d0 \uae30\ub85d\ud558\uace0 \uc0c8 \ud3ec\uc2a4\ud305\uc740 \uce5c\uad6c\uc758 \ub274\uc2a4 \ud53c\ub4dc\uc5d0\ub3c4 \uc804\uc1a1\ud55c\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">2. <b>\ub274\uc2a4 \ud53c\ub4dc \uc0dd\uc131<\/b>\uc740 \uc0ac\uc6a9\uc790\uac00 \ub274\uc2a4 \ud53c\ub4dc \ud654\uba74\uc744 \uc694\uccad\ud588\uc744 \ub54c \uc0ac\uc6a9\uc790\uac00 \ucd5c\uc2e0 \ud3ec\uc2a4\ud305 \ubaa9\ub85d\uc744 \ubcf4\uc5ec\uc8fc\ub294 \uc791\uc5c5\uc744 \ucc98\ub9ac\ud55c\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">\ud3ec\uc2a4\ud305 \uc804\uc1a1(\ud32c \uc544\uc6c3) \uc11c\ube44\uc2a4<\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc0ac\uc6a9\uc790\uc758 \uc0c8 \ud3ec\uc2a4\ud305\uc744 \uce5c\uad6c \uad00\uacc4\uc5d0 \uc788\ub294 \ubaa8\ub4e0 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc804\ub2ec\ud558\ub294 \uacfc\uc815\uc73c\ub85c \ud32c \uc544\uc6c3\uc5d0\ub294 2\uac00\uc9c0 \ubaa8\ub378\uc774 \uc788\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc4f0\uae30 \uc2dc\uc810\uc5d0 \ud32c\uc544\uc6c3\uacfc \uc77d\uae30 \uc2dc\uc810\uc5d0 \ud32c\uc544\uc6c3\uc774\ub2e4.&nbsp;<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">\uc4f0\uae30 \uc2dc \ud32c\uc544\uc6c3 (\ud478\uc2dc \ubaa8\ub378)<\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\"> \uc0c8\ub85c\uc6b4 \ud3ec\uc2a4\ud305\uc744 \ubc1c\ud589\ud560 \ub54c \uce5c\uad6c\ub4e4\uc758 \ub274\uc2a4 \ud53c\ub4dc \uce90\uc2dc\uc5d0 \ubbf8\ub9ac \uc800\uc7a5\ud55c\ub2e4. \uce5c\uad6c\ub4e4\uc774 \ub274\uc2a4 \ud53c\ub4dc\ub97c \uac00\uc838\uc624\ub294 \uc751\ub2f5\uc2dc\uac04\uc774 \uc9e7\uc544\uc9c4\ub2e4. \ud558\uc9c0\ub9cc \uce5c\uad6c\uac00 \ub9ce\uc740 \uc0ac\uc6a9\uc790\uc778 \uacbd\uc6b0 \uc0ac\uc6a9\uc790 \ubaa8\ub450\uc758 \ub274\uc2a4 \ud53c\ub4dc\ub97c \uac31\uc2e0\ud558\ub294\ub370 \ub9ce\uc740 \uc2dc\uac04\uc774 \uc18c\uc694\ub420 \uc218 \uc788\uc5b4 \ud2b9\uc815 \uc11c\ubc84\uc5d0 \ubd80\ud558\uac00 \uc9d1\uc911\ub420 \uc218 \uc788\ub2e4(\ud56b\ud0a4 \ubb38\uc81c). \uadf8\ub9ac\uace0 \uc11c\ube44\uc2a4\ub97c \uc790\uc8fc \uc774\uc6a9\ud558\uc9c0 \uc54a\uc740 \uc0ac\uc6a9\uc790\uc758 \ud53c\ub4dc\uae4c\uc9c0 \uac31\uc2e0\ud558\uae30\uc5d0 \uc790\uc6d0\uc774 \ub0ad\ube44\ub41c\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">\uc77d\uae30 \uc2dc \ud32c\uc544\uc6c3 (\ud480 \ubaa8\ub378)<\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc0ac\uc6a9\uc790\uac00 \ub274\uc2a4 \ud53c\ub4dc\ub97c \uc694\uccad\ud560 \ub54c \uce5c\uad6c\ub4e4\uc758 \ud3ec\uc2a4\ud305\uc744 DB\ub098 \uce90\uc2dc\uc5d0\uc11c \uc2e4\uc2dc\uac04\uc73c\ub85c \uac00\uc838\uc640 \ucde8\ud569\ud55c\ub2e4. \ub370\uc774\ud130\ub97c \ubbf8\ub9ac \uce5c\uad6c\uc5d0 \ud478\uc2dc\ud558\ub294 \uc791\uc5c5\uc774 \ud544\uc694 \uc5c6\uc5b4 \ud56b\ud0a4 \ubb38\uc81c\ub3c4 \uc0dd\uae30\uc9c0 \uc54a\uace0 \ube44\ud65c\uc131\ud55c \uc0ac\uc6a9\uc790\uc5d0\ub294 \ubbf8\ub9ac \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud560 \ud544\uc694\uac00 \uc5c6\ub2e4.(\uc800\uc7a5 \uacf5\uac04\ub3c4 \uc808\uc57d) \ud558\uc9c0\ub9cc \uc694\uccad \uc2dc\ub9c8\ub2e4 \ubcf5\uc7a1\ud55c \uc870\ud68c \ubc0f \uc815\ub82c \uc791\uc5c5\uc73c\ub85c \uc778\ud574 \uc751\ub2f5 \uc2dc\uac04\uc774 \uae38\uc5b4\uc9c8 \uc218 \uc788\ub2e4.&nbsp;<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">\uc808\ucda9\uc548<\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ucc45\uc5d0\uc11c\ub294 \ub450 \uac00\uc9c0 \ubc29\ubc95\uc744 \uacb0\ud569\ud558\uc5ec \uc7a5\uc810\uc740 \ucde8\ud558\uace0 \ub2e8\uc810\uc740 \ubc84\ub9ac\ub294 \uc804\ub7b5\uc73c\ub85c \uad6c\uc131\ud55c\ub2e4. \uba3c\uc800 \ub300\ubd80\ubd84\uc758 \uc77c\ubc18 \uc0ac\uc6a9\uc790\uc5d0 \ub300\ud574\uc11c\ub294 \ud478\uc2dc \ubaa8\ub378\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \ud314\ub85c\uc6cc \uc218\uac00 \ub9e4\uc6b0 \ub9ce\uc740 \uc0ac\uc6a9\uc790\uc758 \uacbd\uc6b0\uc5d0\ub294 \ud480 \ubaa8\ub378\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc2dc\uc2a4\ud15c \uacfc\ubd80\ud558\ub97c \ubc29\uc9c0\ud55c\ub2e4. \uadf8\ub9ac\uace0 \uc548\uc815 \ud574\uc2dc\ub97c \ud1b5\ud574 \uc694\uccad\uacfc \ub370\uc774\ud130\ub97c \ubcf4\ub2e4 \uace0\ub974\uac8c \ubd84\uc0b0\ud558\uc5ec \ud56b\ud0a4 \ubb38\uc81c\ub97c \uc904\uc5ec\uc900\ub2e4.<\/span><\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1744\" data-origin-height=\"1684\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/b02UFe\/dJMb8WZJVq2\/YUCXnuwHDMPJLfzhkKYFwk\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/b02UFe\/dJMb8WZJVq2\/YUCXnuwHDMPJLfzhkKYFwk\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/b02UFe\/dJMb8WZJVq2\/YUCXnuwHDMPJLfzhkKYFwk\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb02UFe%2FdJMb8WZJVq2%2FYUCXnuwHDMPJLfzhkKYFwk%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1744\" height=\"1684\" data-origin-width=\"1744\" data-origin-height=\"1684\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size14\"><span style=\"font-family: 'Nanum Gothic';\">- Dispatcher:\uae00\uc744 \ub204\uac00 \uc37c\ub294\uc9c0 \ubcf4\uace0&nbsp;\ud478\uc2dc \ubc29\uc2dd\uc73c\ub85c \ubfcc\ub9b4\uc9c0, \uadf8\ub0e5 \uc800\uc7a5\ub9cc \ud560\uc9c0 \uacb0\uc815\ud558\ub294 \uc5ed\ud560<\/span><\/p>\n<p style=\"color: #333333; text-align: start;\" data-ke-size=\"size14\"><span style=\"font-family: 'Nanum Gothic';\">-&nbsp;Aggregator:&nbsp;\uce90\uc2dc\uc5d0 \uc5c6\uc73c\uba74 DB\/\uc0e4\ub4dc\uc5d0\uc11c \uae00\uc744 \uac00\uc838\uc640\uc11c&nbsp;\uc815\ub82c\ud574\uc11c \ubcf4\uc5ec\uc8fc\ub294 \uc5ed\ud560<\/span><\/p>\n<p style=\"color: #333333; text-align: start;\" data-ke-size=\"size14\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ube44\uc720 \uc124\uba85) \uc778\uc2a4\ud0c0 \uc0ac\uc6a9\uc790 \uc720\ud615 Dispatcher \ud310\ub2e8 \ucc98\ub9ac \ubc29\uc2dd<\/span><\/p>\n<table style=\"border-collapse: collapse; width: 100%; height: 60px;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr style=\"height: 20px;\">\n<td style=\"width: 33.3333%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc0ac\uc6a9\uc790 \uc720\ud615<\/span><\/td>\n<td style=\"width: 33.3333%; height: 20px;\"><span style=\"background-color: #2780d4; color: #ffffff; text-align: left; font-family: 'Nanum Gothic';\">Dispatcher \ud310\ub2e8<\/span><\/td>\n<td style=\"width: 33.3333%; height: 20px;\"><span style=\"background-color: #2780d4; color: #ffffff; text-align: left; font-family: 'Nanum Gothic';\">\ucc98\ub9ac \ubc29\uc2dd<\/span><\/td>\n<\/tr>\n<tr style=\"height: 20px;\">\n<td style=\"width: 33.3333%; height: 20px;\"><span style=\"background-color: #efefef; color: #333333; text-align: left; font-family: 'Nanum Gothic';\">\uc77c\ubc18 \uc0ac\uc6a9\uc790 (100\uba85 \ud314\ub85c\uc6cc)<\/span><\/td>\n<td style=\"width: 33.3333%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">\"\ubc14\ub85c \ud32c\ub4e4\uc5d0\uac8c \uc800\uc7a5\ud558\uc790\"<\/span><\/td>\n<td style=\"width: 33.3333%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud478\uc2dc \ubaa8\ub378<\/span><\/td>\n<\/tr>\n<tr style=\"height: 20px;\">\n<td style=\"width: 33.3333%; height: 20px;\"><span style=\"background-color: #efefef; color: #333333; text-align: left; font-family: 'Nanum Gothic';\">\uc5f0\uc608\uc778 (300\ub9cc \ud314\ub85c\uc6cc)<\/span><\/td>\n<td style=\"width: 33.3333%; height: 20px;\"><span style=\"background-color: #f9f9f9; color: #333333; text-align: left; font-family: 'Nanum Gothic';\">\"\ubbf8\ub9ac \uc800\uc7a5\ud558\uc9c0 \ub9d0\uace0 \uc694\uccad \ub54c \ubcf4\uc5ec\uc8fc\uc790\"<\/span><\/td>\n<td style=\"width: 33.3333%; height: 20px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud480 \ubaa8\ub378<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style6\" \/>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\">\ud56b\ud0a4\uc640 \uc548\uc815\ud574\uc2dc \ub300\ud55c \ubcf4\ucda9 \uc774\ud574<\/span><\/h3>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">\ud56b\ud0a4 \ubb38\uc81c<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ud2b9\uc815 \ub370\uc774\ud130\ub098 \uc11c\ubc84\uc5d0 \ud2b8\ub798\ud53d\uc774 \ube44\uc815\uc0c1\uc801\uc73c\ub85c \uc9d1\uc911\ub418\uc5b4 \ud574\ub2f9 \uc11c\ubc84\uac00 \uacfc\ubd80\ud558\ub85c \ub290\ub824\uc9c0\uac70\ub098 \ub2e4\uc6b4\ub418\ub294 \ud604\uc0c1\uc744 \ub9d0\ud55c\ub2e4. \uc608\uc2dc\ub85c \ud314\ub85c\uc6cc\uac00 \uc218\ubc31\ub9cc \uba85\uc778 \uc720\uba85\uc778\uc774 \ud3ec\uc2a4\ud305\uc744 \uc62c\ub838\uace0 \uc774 \ud3ec\uc2a4\ud305 \ub370\uc774\ud130\ub97c \uc11c\ubc84 1\uc5d0 \uc800\uc7a5, \uc218\ubc31\ub9cc \uba85\uc758 \ud314\ub85c\uc6cc\ub4e4\uc774 \ub3d9\uc2dc\uc5d0 \uc774 \ud3ec\uc2a4\ud305\uc744 \ubcf4\ub824\uace0 \uc11c\ubc84 1\uc5d0 \uc694\uccad\uc744 \ubcf4\ub0b4\uba70 \ub2e4\ub978 \uc11c\ubc84\ub4e4\uc740 \ud55c\uac00\ud55c\ub370 \uc11c\ubc84 1\ub9cc \uac11\uc790\uae30 \uc5c4\uccad\ub09c \ubd80\ud558\ub97c \ubc1b\uc544 \uc2dc\uc2a4\ud15c \uc804\uccb4\uc758 \ubcd1\ubaa9 \ud604\uc0c1\uc774 \ubc1c\uc0dd\ud55c\ub2e4. \uc774\ub54c \uc720\uba85\uc778\uc758 \ub370\uc774\ud130\uac00 \ud56b\ud0a4\uac00 \ub41c\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">\uc548\uc815\ud574\uc2dc<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc548\uc815 \ud574\uc2dc\ub294 \uc694\uccad\uc774\ub098 \ub370\uc774\ud130\ub97c \uc11c\ubc84\uc5d0 \ud560\ub2f9\ud560 \ub54c \uc11c\ubc84\uac00 \ucd94\uac00\ub418\uac70\ub098 \uc81c\uac70\ub418\ub354\ub77c\ub3c4 \ub370\uc774\ud130\uc758 \uc7ac\ubd84\ubc30\ub97c \ucd5c\uc18c\ud654\ud558\uba74\uc11c \ubd80\ud558\ub97c \ube44\uad50\uc801 \uace0\ub974\uac8c \ubd84\uc0b0\uc2dc\ud0a4\ub294 \uae30\uc220\uc774\ub2e4<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">\uc548\uc815 \ud574\uc2dc\uc758 \uae30\ubcf8 \uac1c\ub150<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ub370\uc774\ud130\ub97c \uc11c\ubc84\uc5d0 \uc800\uc7a5\ud558\uac70\ub098 \uc694\uccad\uc744 \uc11c\ubc84\ub85c \ubcf4\ub0bc \ub54c \ubcf4\ud1b5 \ud574\uc2dc \ud568\uc218\ub97c \uc0ac\uc6a9\ud55c\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">1. \uc77c\ubc18\uc801\uc778 \ud574\uc2dc \ubc29\uc2dd\uc758 \ubb38\uc81c<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc0ac\uc6a9\uc790 ID\ub97c \ud574\uc2dc\ud558\uc5ec \uc11c\ubc84 N\ub300\uc5d0 \ubd84\uc0b0\ud55c\ub2e4\uace0 \uac00\uc815\ud55c\ub2e4. \ub9cc\uc57d \uc11c\ubc84 N \uc911 \ud558\ub098\uac00 \uace0\uc7a5\ub098\uc11c N-1\ub300\uac00 \ub418\uba74 N-1\ub300\uc758 \uc11c\ubc84\uc5d0 \uc788\ub294 \uac70\uc758 \ubaa8\ub4e0 \ub370\uc774\ud130\ub97c \uc7ac\ubc30\uce58\ud574\uc57c \ud55c\ub2e4. \uc5c4\uccad\ub09c \uc2dc\uac04\uacfc \uc790\uc6d0\uc774 \ub0ad\ube44\ub41c\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h4 data-ke-size=\"size20\"><span style=\"font-family: 'Nanum Gothic';\">2. \uc548\uc815 \ud574\uc2dc\uc758 \ud574\uacb0\ucc45<\/span><\/h4>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc548\uc815 \ud574\uc2dc\ub294 \uc11c\ubc84\uc640 \ub370\uc774\ud130\ub97c \uac00\uc0c1\uc758 \uc6d0 \uc704\uc5d0 \ub9e4\ud551\ud55c\ub2e4. \ub370\uc774\ud130 K\ub294 \uc6d0 \uc704\uc5d0\uc11c K\uc758 \uc704\uce58\ub85c\ubd80\ud130 \uc2dc\uacc4 \ubc29\ud5a5\uc73c\ub85c \uac00\uc7a5 \uac00\uae4c\uc6b4 \uc11c\ubc84\uc5d0 \ud560\ub2f9\ud55c\ub2e4. \uc11c\ubc84\uac00 \ucd94\uac00\ub418\uac70\ub098 \uc81c\uac70\ub418\ub354\ub77c\ub3c4 \uc8fc\ubcc0\uc758 \uc11c\ubc84\uc5d0 \uc788\ub294 \ub370\uc774\ud130\ub9cc \uc7ac\ubd84\ubc30\ud558\uba74 \ub418\uace0 \uc804\uccb4 \ub370\uc774\ud130\uc758 \uc7ac\ubd84\ubc30\ub294 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4. \uc989 100\uac1c\uc758 \ub370\uc774\ud130\uac00 N1 ~ N5 \ub178\ub4dc\uc5d0 20\uac1c\uc529 \ubd84\uc0b0\ub418\uc5b4 \uc800\uc7a5\ub418\uc5b4 \uc788\ub2e4\uace0 \uac00\uc815\ud55c\ub2e4\uba74 1\ubc88 \ub178\ub4dc\uac00 \uc8fd\uc73c\uba74 \uac00\uae4c\uc6b4 2\ubc88 \ub178\ub4dc\uc5d0 \ub2e4\uc2dc \ub9e4\ud551\ud558\uba74 2\ubc88 \ub178\ub4dc\ub294 40\uac1c\uc758 \ub370\uc774\ud130\ub97c \ub2f4\uace0 \uc788\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>","category":"\uac1c\ubc1c\uc11c\uc801","author":"seungwonlee","guid":"https:\/\/seungwontech.tistory.com\/119","comments":"https:\/\/seungwontech.tistory.com\/119#entry119comment","pubDate":"Thu, 9 Oct 2025 22:19:00 +0900"},{"title":"\ub2e4\uc774\uc5b4\uadf8\ub7a8\uc73c\ub85c \ubcf4\ub294 AWS VPC \ud1b5\uc2e0 \uc815\ub9ac","link":"https:\/\/seungwontech.tistory.com\/118","description":"<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>AWS VPC<\/b><\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">VPC\ub294 AWS\ub77c\ub294 \uac70\ub300\ud55c \ub300\uc9c0 \uc704\uc5d0 \uc138\uc6b0\ub294 \ub098\ub9cc\uc758 \uac1c\uc778 \ub2e8\uc9c0\uc785\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\"> \ub204\uad6c\ub098 \ub4e4\uc5b4\uc62c \uc218 \uc788\ub294 \uad11\uc7a5\uc774 \uc544\ub2c8\ub77c, \ub0b4\uac00 \ud5c8\ub77d\ud55c \uc0ac\ub78c\ub9cc, \ub0b4\uac00 \ub9cc\ub4e0 \uaddc\uce59\ub300\ub85c\ub9cc \uc6c0\uc9c1\uc77c \uc218 \uc788\ub294 \uac00\uc0c1 \ub124\ud2b8\uc6cc\ud06c \uacf5\uac04\uc785\ub2c8\ub2e4. <\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc5ec\uae30\uc5d0 EC2, RDS \ub4f1\uc744 \uc62c\ub824 \ubcf4\uc548\uc801\uc73c\ub85c \ud1b5\uc81c\ub41c \ud658\uacbd\uc744 \ub9cc\ub4ed\ub2c8\ub2e4.<\/span><\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>\ud37c\ube14\ub9ad\/\ud504\ub77c\uc774\ube57 \uc11c\ube0c\ub137 \uad6c\ubd84<\/b><\/span><\/h3>\n<table style=\"border-collapse: collapse; width: 100%; height: 55px;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr style=\"height: 19px;\">\n<td style=\"width: 25%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\uad6c\ubd84<\/span><\/td>\n<td style=\"width: 25%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc778\ud130\ub137 \uc811\uc18d<\/span><\/td>\n<td style=\"width: 25%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc608\uc2dc \uc6a9\ub3c4&nbsp;<\/span><\/td>\n<td style=\"width: 25%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud544\uc694 \uad6c\uc131\uc694\uc18c<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 25%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud37c\ube14\ub9ad \uc11c\ube0c\ub137<\/span><\/td>\n<td style=\"width: 25%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc678\ubd80\uc5d0\uc11c \uc9c1\uc811 \uc811\uc18d \uac00\ub2a5<\/span><\/td>\n<td style=\"width: 25%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc6f9 \uc11c\ubc84\/\ub85c\ub4dc\ubc38\ub7f0\uc11c<\/span><\/td>\n<td style=\"width: 25%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc778\ud130\ub137 \uac8c\uc774\ud2b8\uc6e8\uc774 + \ud37c\ube14\ub9adIP<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 25%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud504\ub77c\uc774\ube57 \uc11c\ube0c\ub137<\/span><\/td>\n<td style=\"width: 25%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc678\ubd80\uc5d0\uc11c \uc9c1\uc811 \uc811\uc18d \ubd88\uac00<\/span><\/td>\n<td style=\"width: 25%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">DB\/\ub0b4\ubd80 API\/ \ubc31\uc5d4\ub4dc \uc791\uc5c5 \uc11c\ubc84<\/span><\/td>\n<td style=\"width: 25%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">NAT \uac8c\uc774\ud2b8\uc6e8\uc774(\ub098\uac08\ub54c\ub9cc)<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>\uc778\ud130\ub137 \uac8c\uc774\ud2b8\uc6e8\uc774, NAT, \ub77c\uc6b0\ud305 \uc815\ub9ac<\/b><\/span><\/h3>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr>\n<td style=\"width: 25.3488%;\"><span style=\"font-family: 'Nanum Gothic';\">\uad6c\ubd84<\/span><\/td>\n<td style=\"width: 74.6512%;\"><span style=\"font-family: 'Nanum Gothic';\">\uc124\uba85<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 25.3488%;\"><span style=\"font-family: 'Nanum Gothic'; color: #333333; text-align: start;\">Internet Gateway(IGW)<\/span><\/td>\n<td style=\"width: 74.6512%;\"><span style=\"font-family: 'Nanum Gothic'; color: #333333; text-align: start;\">\uc591\ubc29\ud5a5\uc73c\ub85c \ud37c\ube14\ub9ad \uc11c\ube0c\ub137\uc774 \uc778\ud130\ub137\uacfc \uc5f0\uacb0\ub418\uac8c \ud574 \uc90d\ub2c8\ub2e4.<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 25.3488%;\"><span style=\"font-family: 'Nanum Gothic'; color: #333333; text-align: start;\">NAT Gateway<\/span><\/td>\n<td style=\"width: 74.6512%;\"><span style=\"font-family: 'Nanum Gothic'; color: #333333; text-align: start;\">\ub2e8\ubc29\ud5a5\uc73c\ub85c \ub0b4\ubd80\uc5d0\uc11c \uc678\ubd80\ub85c \ud504\ub77c\uc774\ube57 \uc11c\ube0c\ub137\uc774 \ub098\uac08 \uc218 \uc788\uac8c \ud574 \uc90d\ub2c8\ub2e4.<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 25.3488%;\"><span style=\"font-family: 'Nanum Gothic'; color: #333333; text-align: start;\"><span style=\"color: #333333; text-align: start;\">Route Table<\/span><\/span><\/td>\n<td style=\"width: 74.6512%;\"><span style=\"font-family: 'Nanum Gothic'; color: #333333; text-align: start;\">\uc5b4\ub5a4 \ud2b8\ub798\ud53d\uc744 \uc5b4\ub514\ub85c \ubcf4\ub0bc\uc9c0 \uacbd\ub85c\ub97c \uc124\uc815\uc785\ub2c8\ub2e4,<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>\ud37c\ube14\ub9ad, \ud504\ub77c\uc774\ube57\uc5d0 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc11c\ubc84 \uad6c\uc131<\/b><\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">AWS \uad8c\uc7a5\uc740 ALB\ub294 \ud37c\ube14\ub9ad, \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc11c\ubc84\ub294 \ud504\ub77c\uc774\ube57\uc785\ub2c8\ub2e4. <\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ud558\uc9c0\ub9cc \uc18c\uaddc\ubaa8\ub294 \ud37c\ube14\ub9ad \uc11c\ube0c\ub137\uc5d0 \ub123\uc5b4\uc11c \ud574\ub3c4 \ub41c\ub2e4. NAT GW\uac00 \ube44\uc6a9\uc774\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4,<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>\uc11c\ubc84 \ud750\ub984\ub3c4<\/b><\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc0ac\uc6a9\uc790 &rarr; IGW &rarr; ALB(\ud37c\ube14\ub9ad) &rarr; \uc11c\ubc84(\ud504\ub77c\uc774\ube57) &rarr; RDS(\ud504\ub77c\uc774\ube57) &rarr; \uc751\ub2f5 \ubc18\ud658(\uac19\uc740 \uacbd\ub85c \ubc18\ub300\ub85c)<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc5ec\uae30\uc11c NAT GW\ub294 ALB\uac00 \ud504\ub85d\uc2dc \uc5ed\ud560\uc744 \ud574\uc11c \ud1b5\uc2e0\uc744 \uc911\uac1c\ud574 \uc8fc\uae30 \ub54c\ubb38\uc5d0 NAT \ud544\uc694 \uc5c6\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">IGW\ub294 \uc624\uc9c1 \ud37c\ube14\ub9ad IP\uac00 \uc788\ub294 \ub9ac\uc18c\uc2a4\ub9cc \uc778\ud130\ub137\uacfc \ud1b5\uc2e0\ud558\uac8c \ud574 \uc90d\ub2c8\ub2e4. <\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ud504\ub77c\uc774\ube57 \uc11c\ubc84\ub294 IGW\ub97c \uc9c1\uc811 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uace0 \uc678\ubd80\ub85c \ub098\uac00\uc57c \ud560 \uacbd\uc6b0 \ubc18\ub4dc\uc2dc NAT GW\ub97c \uac70\uccd0\uc57c \ud569\ub2c8\ub2e4.<\/span><\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1188\" data-origin-height=\"613\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/bctLSs\/btsQ3hKqo4g\/WDoyIwFfkrrGFwcpHkKh70\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/bctLSs\/btsQ3hKqo4g\/WDoyIwFfkrrGFwcpHkKh70\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/bctLSs\/btsQ3hKqo4g\/WDoyIwFfkrrGFwcpHkKh70\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbctLSs%2FbtsQ3hKqo4g%2FWDoyIwFfkrrGFwcpHkKh70%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1188\" height=\"613\" data-origin-width=\"1188\" data-origin-height=\"613\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>NAT GW \uc0ac\uc6a9<\/b><\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc11c\ubc84\uc5d0\uc11c \uc678\ubd80 API \ud638\ucd9c\ud560 \ub54c \ud544\uc694\ud569\ub2c8\ub2e4. <\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc608\ub97c \ub4e4\uba74 \uc2a4\ucf00\uc904\ub7ec(Cron)\ub85c \uc2e4\ud589\ub41c \ubc30\uce58\uac00 \uc678\ubd80 API \ud638\ucd9c\ud560 \ub54c \ud544\uc694\ud569\ub2c8\ub2e4. <\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc989 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uc9c1\uc811 \uc678\ubd80\ub85c \ub098\uac00\uc57c \ud558\uae30 \ub54c\ubb38\uc774\ub2e4. <\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">SNAT\uc740 NAT GW\uac00 \ud504\ub77c\uc774\ube57 \uc11c\ubc84\uc758 \uc0ac\uc124 IP\ub97c \uc790\uc2e0\uc758 \uacf5\uc778 IP\ub85c \ubc14\uafd4\uc11c \uc778\ud130\ub137\uc73c\ub85c \ub300\uc2e0 \ubcf4\ub0b4\uc90d\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ud504\ub77c\uc774\ube57 &rarr; NAT &rarr; IGW &rarr; \uc778\ud130\ub137<\/span><\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1085\" data-origin-height=\"507\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/bnp3Vl\/btsQ4VTUHHh\/KY8lbknKGVZ0JnVB6WwUZk\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/bnp3Vl\/btsQ4VTUHHh\/KY8lbknKGVZ0JnVB6WwUZk\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/bnp3Vl\/btsQ4VTUHHh\/KY8lbknKGVZ0JnVB6WwUZk\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbnp3Vl%2FbtsQ4VTUHHh%2FKY8lbknKGVZ0JnVB6WwUZk%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1085\" height=\"507\" data-origin-width=\"1085\" data-origin-height=\"507\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>Route \ud14c\uc774\ube14<\/b><\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc5b4\ub5a4 IP \ub300\uc5ed\uc73c\ub85c \uac00\ub294 \ud2b8\ub798\ud53d\uc744 \uc5b4\ub514\ub85c \ubcf4\ub0bc\uc9c0 \uacb0\uc815\ud558\ub294 \ub124\ud2b8\uc6cc\ud06c\uc758 \uae38\uc548\ub0b4 \uc9c0\ub3c4\uc774\uba70 \ud37c\ube14\ub9ad\/ \ud504\ub77c\uc774\ube57 \uc11c\ube0c\ub137\uc740 CIDR \ub300\uc5ed\uc73c\ub85c \uad6c\ubd84\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub77c, \ub77c\uc6b0\ud130 \ud14c\uc774\ube14\uc5d0\uc11c 0.0.0.0\/0\uc774 \uc5b4\ub514\ub85c \ud5a5\ud558\ub290\ub0d0 IGW, NAT\uc5d0 \ub530\ub77c \uad6c\ubd84\ub429\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>\ub77c\uc6b0\ud130 \ud14c\uc774\ube14\uc774 \ud558\ub294 \uc77c<\/b><\/span><\/h3>\n<table style=\"border-collapse: collapse; width: 100%; height: 75px;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr style=\"height: 19px;\">\n<td style=\"width: 32.9845%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc0c1\ud669<\/span><\/td>\n<td style=\"width: 33.6821%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\ub77c\uc6b0\ud130 \ud14c\uc774\ube14 \uc5ed\ud560<\/span><\/td>\n<td style=\"width: 33.3333%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\ube44\uc720<\/span><\/td>\n<\/tr>\n<tr style=\"height: 19px;\">\n<td style=\"width: 32.9845%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud37c\ube14\ub9ad \uc11c\ube0c\ub137\uc5d0\uc11c \uc778\ud130\ub137\uc73c\ub85c \ub098\uac00\uc57c \ud560 \ub54c<\/span><\/td>\n<td style=\"width: 33.6821%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">0.0.0.0\/0\uc744 IGW\ub85c \ubcf4\ub0c4<\/span><\/td>\n<td style=\"width: 33.3333%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\ubaa8\ub974\ub294 \uc8fc\uc18c\ub294 \ub2e4 \uc815\ubb38\uc73c\ub85c<\/span><\/td>\n<\/tr>\n<tr style=\"height: 19px;\">\n<td style=\"width: 32.9845%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud504\ub77c\uc774\ube57 \uc11c\ube0c\ub137\uc5d0\uc11c \uc678\ubd80 API \uc694\uccad<\/span><\/td>\n<td style=\"width: 33.6821%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">0.0.0.0\/0\uc5d0\uc11c NAT GW\ub85c \ubcf4\ub0c4<\/span><\/td>\n<td style=\"width: 33.3333%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\ubc16\uc73c\ub85c \ub098\uac08 \uac74 \uc8fc\ubc29 \ub4b7\ubb38\uc73c\ub85c&nbsp;<\/span><\/td>\n<\/tr>\n<tr style=\"height: 18px;\">\n<td style=\"width: 32.9845%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\ub0b4\ubd80 \ud1b5\uc2e0( \uac19\uc740 VPC\uc548 EC2<\/span><\/td>\n<td style=\"width: 33.6821%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">VPC CIDR\uc5d0\uc11c Local\ub85c \uc720\uc9c0<\/span><\/td>\n<td style=\"width: 33.3333%; height: 18px;\"><span style=\"font-family: 'Nanum Gothic';\">\uac19\uc740 \uc544\ud30c\ud2b8 \ub2e8\uc9c0 \uc548\uc774\uba74 \uadf8\ub0e5 \ubc14\ub85c \uc774\ub3d9<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>\ub9cc\uc57d \ud504\ub77c\uc774\ube57 \uc11c\ubc84\uc5d0 \ud37c\ube14\ub9ad IP\ub97c \ud560\ub2f9\ud55c\ub2e4\uba74?<\/b><\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\ube44\uc6a9\uc73c\ub85c \uc778\ud574 NAT GW\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uae30 \uc704\ud574 \ud504\ub77c\uc774\ube57 \uc11c\ubc84\uc5d0 \ud37c\ube14\ub9ad IP\ub97c \ucd94\uac00\ub85c \ud560\ub2f9\ud574 NAT GW\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub2e4\uba74 \ud504\ub77c\uc774\ube57 \uc11c\ubc84\uac00 \uc544\ub2cc \ud37c\ube14\ub9ad \uc11c\ubc84\uc785\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>\ud504\ub77c\uc774\ube57 \uc11c\ubc84\ub97c \uc0ac\uc6a9\ud558\ub294 \uc774\uc720<\/b><\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">\uc778\ud130\ub137 \uc5b4\ub514\uc11c\ub4e0 \uc811\uc18d \uc2dc\ub3c4\uac00 \uac00\ub2a5\ud574\uc9d1\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\"> \ubcf4\uc548 \uadf8\ub8f9\uc73c\ub85c \ub9c9\uc544\ub3c4 \ud3ec\ud2b8 \uc2a4\uce90\ub2dd \uacf5\uaca9\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\"> \uc124\uacc4\uc0c1 \ud504\ub77c\uc774\ube57 \uc11c\ube0c\ub137\uc740 \uc678\ubd80\uc5d0\uc11c \uc808\ub300 \uc811\uadfc \ubd88\uac00\ub2a5\ud574\uc57c \ud558\ub294\ub370 \ud37c\ube14\ub9ad IP\ub97c \ubd99\uc774\uba74 \ucee8\uc149 \uc790\uccb4\uac00 \ubd95\uad34\ub429\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\"> \ubaa8\ub4e0 \uc678\ubd80 \uc694\uccad\uc774 \uc9c1\uc811 \ud574\ub2f9 \uc11c\ubc84\ub85c \ub4e4\uc5b4\uc624\ub2c8 \ub85c\ub4dc\ubc38\ub7f0\uc2f1\uc774\ub098 \ubc29\ud654\ubcbd \ud1b5\uc81c\uac00 \ubd88\uac00\ub2a5\ud569\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>CIDR \ub300\uc5ed\ub780<\/b><\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">IP \uc8fc\uc18c\ub97c \ubc94\uc704\ub85c \ud45c\ud604\ud558\ub294 \ubc29\uc2dd<\/span><\/p>\n<table style=\"border-collapse: collapse; width: 100%; height: 57px;\" border=\"1\" data-ke-align=\"alignLeft\" data-ke-style=\"style15\">\n<tbody>\n<tr style=\"height: 19px;\">\n<td style=\"width: 27.9845%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\ud45c\ud604<\/span><\/td>\n<td style=\"width: 38.6821%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc758\ubbf8<\/span><\/td>\n<td style=\"width: 33.3333%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\ubc94\uc704<\/span><\/td>\n<\/tr>\n<tr style=\"height: 19px;\">\n<td style=\"width: 27.9845%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">10.0.0.0\/16<\/span><\/td>\n<td style=\"width: 38.6821%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc55e\uc758 16\ube44\ud2b8(10.0) \uace0\uc815,\ub098\uba38\uc9c0\ub294 \ubcc0\uacbd\uac00\ub2a5<\/span><\/td>\n<td style=\"width: 33.3333%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">10.0.0.0 ~ 10.0.255.255(\uc57d 65,536\uac1c IP)<\/span><\/td>\n<\/tr>\n<tr style=\"height: 19px;\">\n<td style=\"width: 27.9845%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">10.0.1.0\/24<\/span><\/td>\n<td style=\"width: 38.6821%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">\uc55e\uc758 24\ube44\ud2b8(10.0.1) \uace0\uc815, \ub9c8\uc9c0\ub9c9\ub9cc \ubcc0\uacbd \uac00\ub2a5<\/span><\/td>\n<td style=\"width: 33.3333%; height: 19px;\"><span style=\"font-family: 'Nanum Gothic';\">10.0.1.0 ~ 10.0.1.255(256\uac1c IP)<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\"><span style=\"font-family: 'Nanum Gothic';\"><b>VPC\uc640 \uc11c\ube0c\ub137\uc758 \uad00\uacc4(CIDR)<\/b><\/span><\/h3>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\">VPC\ub294 \uc0ac\uc124 \ub124\ud2b8\uc6cc\ud06c \uacf5\uac04 \uc804\uccb4 \uc11c\ube0c\ub137\uc740 \uadf8 \uacf5\uac04\uc744 \ubd84\ud560\ud55c \ub354 \uc791\uc740 \ub124\ud2b8\uc6cc\ud06c\uc785\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\"> VPC CIDR\uc744 10.0.0.0\/16\uc73c\ub85c \uc9c0\uc815\ud558\uba74 \uc774 VPC\uc5d0\uc11c\ub294 10.0.0.0 ~ 10.0.255.255 \ubc94\uc704\uc758 IP\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\"><span style=\"font-family: 'Nanum Gothic';\"> \uc11c\ube0c\ub137\uc740 \uc774 \ubc94\uc704\uc548\uc5d0\uc11c \/24, \/20\ub4f1\uc73c\ub85c \ub354 \uc798\uac8c \ucabc\uac1c\uc5b4 \ub9cc\ub4ed\ub2c8\ub2e4.<\/span><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>","category":"Backend","author":"seungwonlee","guid":"https:\/\/seungwontech.tistory.com\/118","comments":"https:\/\/seungwontech.tistory.com\/118#entry118comment","pubDate":"Wed, 8 Oct 2025 02:38:25 +0900"}]}}