{"id":1687,"date":"2026-05-08T16:34:49","date_gmt":"2026-05-08T16:34:49","guid":{"rendered":"https:\/\/wayhope.kro.kr\/?p=1687"},"modified":"2026-08-31T07:32:42","modified_gmt":"2026-08-31T07:32:42","slug":"postgresql-%ed%95%b5%ec%8b%ac-%ec%a0%95%eb%a6%ac","status":"publish","type":"post","link":"https:\/\/wayhope.kro.kr\/?p=1687","title":{"rendered":"PostgreSQL \ud575\uc2ec \uc815\ub9ac"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">PostgreSQL\uc740 \uc624\ud508\uc18c\uc2a4 \uac1d\uccb4-\uad00\uacc4\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uad00\ub9ac \uc2dc\uc2a4\ud15c(ORDBMS)\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SQL\uc744 \uae30\ubc18\uc73c\ub85c \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\uace0 \uc870\ud68c\ud558\ub294 \uc804\ud1b5\uc801\uc778 \uad00\uacc4\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\uba74\uc11c, JSON, \ubc30\uc5f4, \uc0ac\uc6a9\uc790 \uc815\uc758 \ud0c0\uc785, \ud568\uc218, \ud655\uc7a5 \uae30\ub2a5 \ub4f1 \ub2e4\uc591\ud55c \ub370\uc774\ud130 \ubaa8\ub378\ub9c1 \uae30\ub2a5\ub3c4 \uc9c0\uc6d0\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MySQL\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c Table, Row, Column, Index, Transaction \ub4f1\uc744 \uae30\ubc18\uc73c\ub85c \ub370\uc774\ud130\ub97c \uad00\ub9ac\ud558\uc9c0\ub9cc PostgreSQL\uc740 \ud2b9\ud788 \ubcf5\uc7a1\ud55c Query \ucc98\ub9ac, \ub370\uc774\ud130 \ud0c0\uc785, \ud655\uc7a5\uc131, SQL \uae30\ub2a5 \uce21\uba74\uc5d0\uc11c \uac15\ud55c \ubaa8\uc2b5\uc744 \ubcf4\uc778\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c PostgreSQL\uc744 \uc0ac\uc6a9\ud558\ub294 \uae30\ubcf8 \uad6c\uc870\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; Application Server -&gt; PostgreSQL\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc740 PostgreSQL\uc5d0 SQL\uc744 \uc804\ub2ec\ud558\uace0 PostgreSQL\uc740 \ub370\uc774\ud130\ub97c \uc870\ud68c\ud558\uac70\ub098 \ubcc0\uacbd\ud55c \uacb0\uacfc\ub97c \ubc18\ud658\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc744 \uc81c\ub300\ub85c \uc774\ud574\ud558\ub824\uba74 SQL \ubb38\ubc95\ub9cc \uc678\uc6b0\uae30\ubcf4\ub2e4 <strong>\ub370\uc774\ud130\ub97c \uc5b4\ub5bb\uac8c \uad6c\uc870\ud654\ud558\uace0, \ubb34\uacb0\uc131\uc744 \uc5b4\ub5bb\uac8c \ubcf4\uc7a5\ud558\uba70, Query\ub97c \uc5b4\ub5bb\uac8c \ube60\ub974\uac8c \ucc98\ub9ac\ud558\ub294\uc9c0<\/strong>\ub97c \uc774\ud574\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">PostgreSQL\uc758 \uae30\ubcf8 \uad6c\uc870<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc5d0\uc11c \ub370\uc774\ud130\ub97c \uad00\ub9ac\ud558\ub294 \uae30\ubcf8 \uad6c\uc870\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PostgreSQL Server -&gt; Database -&gt; Schema -&gt; Table -&gt; Row \/ Column\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Database\ub294 \ub370\uc774\ud130\ub97c \ub17c\ub9ac\uc801\uc73c\ub85c \uad6c\ubd84\ud558\ub294 \ub2e8\uc704\uc774\uace0 Schema\ub294 \ud558\ub098\uc758 Database \uc548\uc5d0\uc11c \uac1d\uccb4\ub97c \ub17c\ub9ac\uc801\uc73c\ub85c \ubd84\ub9ac\ud558\ub294 Namespace\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Table\uc740 \uc2e4\uc81c \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\ub294 \uae30\ubcf8 \ub2e8\uc704\uc774\uba70 Row\ub294 \ud558\ub098\uc758 \ub370\uc774\ud130\ub97c, Column\uc740 \ub370\uc774\ud130\uc758 \uc18d\uc131\uc744 \ub098\ud0c0\ub0b8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uc0ac\uc6a9\uc790 \uc815\ubcf4\ub97c \uc800\uc7a5\ud558\ub294 Table\uc740 \ub2e4\uc74c\ucc98\ub7fc \ub9cc\ub4e4 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE users (\n    id BIGSERIAL PRIMARY KEY,\n    name VARCHAR(100) NOT NULL,\n    email VARCHAR(255) UNIQUE NOT NULL,\n    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub370\uc774\ud130\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \ud615\ud0dc\ub85c \uc800\uc7a5\ub41c\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"211\" height=\"184\" src=\"https:\/\/wayhope.kro.kr\/wp-content\/uploads\/2026\/08\/image-152.png\" alt=\"\" class=\"wp-image-2060\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uad00\uacc4\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \uae30\ubcf8 \uad6c\uc870 \uc790\uccb4\ub294 MySQL\uacfc \ud06c\uac8c \ub2e4\ub974\uc9c0 \uc54a\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Schema<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc5d0\ub294 Database \ub0b4\ubd80\uc5d0 Schema\ub77c\ub294 \ub17c\ub9ac\uc801\uc778 Namespace\uac00 \uc874\uc7ac\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uae30\ubcf8\uc801\uc73c\ub85c <code>public<\/code> Schema\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Schema\ub97c \uc774\uc6a9\ud558\uba74 \ud558\ub098\uc758 Database \uc548\uc5d0\uc11c\ub3c4 Table\uc774\ub098 Function \uac19\uc740 \uac1d\uccb4\ub97c \ub17c\ub9ac\uc801\uc73c\ub85c \uad6c\ubd84\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Database -&gt; public -&gt; users \/ orders\nDatabase -&gt; game -&gt; characters \/ items\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud2b9\uc815 Schema\uc5d0 \uc18d\ud55c Table\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc811\uadfc\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT *\nFROM game.characters;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ube44\uc2a4 \uaddc\ubaa8\uac00 \ucee4\uc9c0\uba74 \uae30\ub2a5\uc774\ub098 \ub3c4\uba54\uc778 \ub2e8\uc704\ub85c Schema\ub97c \ub098\ub204\ub294 \ubc29\uc2dd\ub3c4 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ub370\uc774\ud130 \ud0c0\uc785<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc740 \ub2e4\uc591\ud55c \ub370\uc774\ud130 \ud0c0\uc785\uc744 \uc81c\uacf5\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub300\ud45c\uc801\uc778 \ud0c0\uc785\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INTEGER\nBIGINT\nNUMERIC\nVARCHAR\nTEXT\nBOOLEAN\nDATE\nTIMESTAMP\nUUID\nJSON\nJSONB\nARRAY\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ub2e4\uc74c\uacfc \uac19\uc774 Table\uc744 \ub9cc\ub4e4 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE users (\n    id UUID PRIMARY KEY,\n    name TEXT NOT NULL,\n    age INTEGER,\n    is_active BOOLEAN DEFAULT TRUE,\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc5d0\uc11c\ub294 <code>TEXT<\/code>\uc640 <code>VARCHAR<\/code>\ub97c \ubaa8\ub450 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud2b9\ubcc4\ud55c \ubb38\uc790\uc5f4 \uae38\uc774 \uc81c\ud55c\uc774 \ud544\uc694\ud558\uc9c0 \uc54a\ub2e4\uba74 <code>TEXT<\/code>\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub3c4 \ub9ce\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc22b\uc790 \ud0c0\uc785\ub3c4 \uc800\uc7a5\ud558\ub824\ub294 \ub370\uc774\ud130\uc5d0 \ub530\ub77c \uc120\ud0dd\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\uc77c\ubc18\uc801\uc778 \uc815\uc218 -&gt; INTEGER\n\ud070 \uc815\uc218 -&gt; BIGINT\n\uc815\ud655\ud55c \uc22b\uc790 \uacc4\uc0b0 -&gt; NUMERIC\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud2b9\ud788 \uae08\uc561\ucc98\ub7fc \ubd80\ub3d9\uc18c\uc218\uc810 \uc624\ucc28\uac00 \ubb38\uc81c\uac00 \ub418\ub294 \uac12\uc740 <code>NUMERIC<\/code> \uac19\uc740 \uc815\ud655\ud55c \uc22b\uc790 \ud0c0\uc785\uc744 \uace0\ub824\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Primary Key<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Primary Key\ub294 Table\uc5d0\uc11c \uac01 Row\ub97c \uace0\uc720\ud558\uac8c \uc2dd\ubcc4\ud558\ub294 Key\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE users (\n    id BIGINT PRIMARY KEY,\n    name TEXT NOT NULL\n);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>id<\/code>\uac00 Primary Key\ub77c\uba74 \ub3d9\uc77c\ud55c \uac12\uc744 \uac00\uc9c4 Row\ub97c \uc5ec\ub7ec \uac1c \uc800\uc7a5\ud560 \uc218 \uc5c6\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub610\ud55c Primary Key\ub294 <code>NULL<\/code>\uc744 \ud5c8\uc6a9\ud558\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc5d0\uc11c\ub294 \uc790\ub3d9 \uc99d\uac00 \uac12\uc744 \uc0dd\uc131\ud558\uae30 \uc704\ud574 Identity Column\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE users (\n    id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,\n    name TEXT NOT NULL\n);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\uc804 PostgreSQL\uc5d0\uc11c\ub294 <code>SERIAL<\/code>\ub3c4 \ub9ce\uc774 \uc0ac\uc6a9\ud588\uc9c0\ub9cc \ucd5c\uadfc\uc5d0\ub294 SQL \ud45c\uc900\uc5d0 \uac00\uae4c\uc6b4 Identity Column\uc744 \uc0ac\uc6a9\ud558\ub294 \ubc29\uc2dd\ub3c4 \ub9ce\uc774 \ubcfc \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uc11c\ube44\uc2a4\uc5d0\uc11c\ub294 \uc22b\uc790\ud615 ID\ub098 UUID \ub4f1\uc744 Primary Key\ub85c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Foreign Key<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Foreign Key\ub294 Table \uc0ac\uc774\uc758 \uad00\uacc4\ub97c \ud45c\ud604\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uc0ac\uc6a9\uc790\uc640 \uc8fc\ubb38\uc774 \uc788\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad00\uacc4\ub97c \ub9cc\ub4e4 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>users.id -&gt; orders.user_id\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">SQL\uc5d0\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc815\uc758\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE orders (\n    id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,\n    user_id BIGINT NOT NULL,\n    amount NUMERIC(12, 2),\n\n    FOREIGN KEY (user_id)\n        REFERENCES users(id)\n);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub807\uac8c \ud558\uba74 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294 \uc0ac\uc6a9\uc790\ub97c \ucc38\uc870\ud558\ub294 \uc8fc\ubb38\uc744 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc218\uc900\uc5d0\uc11c \ubc29\uc9c0\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub7f0 \ubc29\uc2dd\uc73c\ub85c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc9c1\uc811 \ub370\uc774\ud130 \uad00\uacc4\ub97c \uac80\uc99d\ud558\ub3c4\ub85d \ub9cc\ub4dc\ub294 \uac83\uc774 \uad00\uacc4\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \uc911\uc694\ud55c \ud2b9\uc9d5\uc774\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Constraint<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Constraint\ub294 \ub370\uc774\ud130\uac00 \ud2b9\uc815 \uc870\uac74\uc744 \ub9cc\uc871\ud558\ub3c4\ub85d \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uaddc\uce59\uc744 \uc124\uc815\ud558\ub294 \uae30\ub2a5\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub300\ud45c\uc801\uc778 Constraint\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PRIMARY KEY\nFOREIGN KEY\nUNIQUE\nNOT NULL\nCHECK\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ub098\uc774\uac00 \uc74c\uc218\uac00 \ub420 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE users (\n    id BIGINT PRIMARY KEY,\n    age INTEGER CHECK (age &gt;= 0)\n);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub807\uac8c \ud558\uba74 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc2e4\uc218\ud558\ub354\ub77c\ub3c4 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc798\ubabb\ub41c \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\ub294 \uac83\uc744 \ub9c9\uc744 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \ub370\uc774\ud130 \ubb34\uacb0\uc131\uc774 \uc911\uc694\ud55c \uaddc\uce59\uc740 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ucf54\ub4dc\ubfd0\ub9cc \uc544\ub2c8\ub77c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 Constraint\ub97c \uc774\uc6a9\ud574 \ubc29\uc5b4\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">CRUD<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ub2e4\ub8e8\ub294 \uae30\ubcf8\uc801\uc778 SQL\uc740 CRUD\ub85c \uc815\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub370\uc774\ud130 \uc870\ud68c\ub294 <code>SELECT<\/code>\ub97c \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT id, name\nFROM users\nWHERE age &gt;= 20;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub370\uc774\ud130 \ucd94\uac00\ub294 <code>INSERT<\/code>\ub97c \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT INTO users (name, age)\nVALUES ('Kim', 25);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub370\uc774\ud130 \uc218\uc815\uc740 <code>UPDATE<\/code>\ub97c \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>UPDATE users\nSET age = 26\nWHERE id = 1;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub370\uc774\ud130 \uc0ad\uc81c\ub294 <code>DELETE<\/code>\ub97c \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DELETE FROM users\nWHERE id = 1;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uc11c\ube44\uc2a4\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ub97c \ubb3c\ub9ac\uc801\uc73c\ub85c \uc0ad\uc81c\ud558\uc9c0 \uc54a\uace0 \uc0ad\uc81c \uc0c1\ud0dc\ub9cc \uae30\ub85d\ud558\ub294 Soft Delete\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"255\" height=\"191\" src=\"https:\/\/wayhope.kro.kr\/wp-content\/uploads\/2026\/08\/image-151.png\" alt=\"\" class=\"wp-image-2058\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uacbd\uc6b0 \uc2e4\uc81c Row\ub294 \ub0a8\uaca8\ub450\uace0 <code>deleted_at<\/code> \uac19\uc740 Column\uc744 \uc774\uc6a9\ud574 \uc0ad\uc81c \uc5ec\ubd80\ub97c \uad00\ub9ac\ud55c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">JOIN<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uad00\uacc4\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uc911\uc694\ud55c \uae30\ub2a5 \uc911 \ud558\ub098\uac00 JOIN\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc0ac\uc6a9\uc790\uc640 \uc8fc\ubb38\uc774 \uc11c\ub85c \ub2e4\ub978 Table\uc5d0 \uc800\uc7a5\ub418\uc5b4 \uc788\ub2e4\uace0 \ud558\uc790.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>users.id -&gt; orders.user_id\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc0ac\uc6a9\uc790 \uc774\ub984\uacfc \uc8fc\ubb38 \uae08\uc561\uc744 \ud568\uaed8 \uc870\ud68c\ud558\ub824\uba74 JOIN\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT\n    users.name,\n    orders.amount\nFROM users\nJOIN orders\n    ON users.id = orders.user_id;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">JOIN\uc744 \uc774\uc6a9\ud558\uba74 \uc5ec\ub7ec Table\uc5d0 \ubd84\ub9ac\ub418\uc5b4 \uc788\ub294 \ub370\uc774\ud130\ub97c \ud558\ub098\uc758 \uc870\ud68c \uacb0\uacfc\ub85c \uad6c\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub300\ud45c\uc801\uc778 JOIN\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INNER JOIN\nLEFT JOIN\nRIGHT JOIN\nFULL OUTER JOIN\nCROSS JOIN\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\ubb34\uc5d0\uc11c\ub294 \ud2b9\ud788 <code>INNER JOIN<\/code>\uacfc <code>LEFT JOIN<\/code>\uc744 \uc790\uc8fc \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Index<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ub370\uc774\ud130\uac00 \ub9ce\uc544\uc9c0\uba74 \uc870\uac74\uc5d0 \ub9de\ub294 Row\ub97c \ucc3e\uae30 \uc704\ud574 \ubaa8\ub4e0 \ub370\uc774\ud130\ub97c \uc21c\ucc28\uc801\uc73c\ub85c \ud655\uc778\ud558\ub294 \ubc29\uc2dd\uc740 \ube44\ud6a8\uc728\uc801\uc77c \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub54c Index\ub97c \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 Email\uc744 \uc790\uc8fc \uac80\uc0c9\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 Index\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE INDEX idx_users_email\nON users(email);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ud6c4 \ub2e4\uc74c Query\ub97c \uc2e4\ud589\ud560 \ub54c PostgreSQL\uc774 \ud574\ub2f9 Index\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT *\nFROM users\nWHERE email = 'test@example.com';\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Index\ub294 \uc870\ud68c \uc131\ub2a5\uc744 \ub192\uc774\ub294 \ub300\uc2e0 \uc800\uc7a5 \uacf5\uac04\uc744 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub610\ud55c <code>INSERT<\/code>, <code>UPDATE<\/code>, <code>DELETE<\/code>\uac00 \ubc1c\uc0dd\ud558\uba74 \uad00\ub828 Index\ub3c4 \ud568\uaed8 \uad00\ub9ac\ud574\uc57c \ud558\uae30 \ub54c\ubb38\uc5d0 \ubb34\uc870\uac74 \ub9ce\uc740 Index\ub97c \ub9cc\ub4dc\ub294 \uac83\uc740 \uc88b\uc740 \uc124\uacc4\uac00 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c Query \ud328\ud134\uc744 \uae30\uc900\uc73c\ub85c \uc5b4\ub5a4 Column\uc5d0 Index\uac00 \ud544\uc694\ud55c\uc9c0 \ud310\ub2e8\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Composite Index<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\ub7ec Column\uc744 \ud568\uaed8 \uc870\uac74\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 Query\ub77c\uba74 Composite Index\ub97c \uace0\ub824\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE INDEX idx_users_class_level\nON users(class, level);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\uc74c\uacfc \uac19\uc740 Query\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT *\nFROM users\nWHERE class = 'Knight'\n  AND level &gt;= 30;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Composite Index\uc5d0\uc11c \uc911\uc694\ud55c \uac83\uc740 Column\uc758 \uc21c\uc11c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(class, level)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uacfc<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(level, class)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc740 \ub3d9\uc77c\ud55c Index\uac00 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c Index\ub97c \uc124\uacc4\ud560 \ub54c\ub294 \ub2e8\uc21c\ud788 \uc870\uac74\uc5d0 \uc0ac\uc6a9\ub418\ub294 Column\ub9cc \ubcf4\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \uc2e4\uc81c Query\uc758 WHERE \uc870\uac74, JOIN \uc870\uac74, ORDER BY \ub4f1\uc744 \ud568\uaed8 \ud655\uc778\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">EXPLAIN<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Query\uac00 \ub290\ub9b4 \ub54c\ub294 SQL \uc790\uccb4\ub9cc \ubcf4\ub294 \uac83\uc774 \uc544\ub2c8\ub77c PostgreSQL\uc774 Query\ub97c \uc5b4\ub5bb\uac8c \uc2e4\ud589\ud558\ub294\uc9c0\ub3c4 \ud655\uc778\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub54c <code>EXPLAIN<\/code>\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXPLAIN\nSELECT *\nFROM users\nWHERE email = 'test@example.com';\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c Query\ub97c \uc2e4\ud589\ud558\uba74\uc11c \uc2e4\ud589 \uc2dc\uac04\uae4c\uc9c0 \ud655\uc778\ud558\ub824\uba74 <code>EXPLAIN ANALYZE<\/code>\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXPLAIN ANALYZE\nSELECT *\nFROM users\nWHERE email = 'test@example.com';\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\ud589 \uacc4\ud68d\uc5d0\uc11c\ub294 PostgreSQL\uc774 \uc5b4\ub5a4 \ubc29\uc2dd\uc73c\ub85c Table\uacfc Index\uc5d0 \uc811\uadfc\ud588\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub300\ud45c\uc801\uc778 \uc811\uadfc \ubc29\uc2dd\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Seq Scan\nIndex Scan\nIndex Only Scan\nBitmap Index Scan\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Seq Scan<\/code>\uc740 Table\uc744 \uc21c\ucc28\uc801\uc73c\ub85c \uc77d\ub294 \ubc29\uc2dd\uc774\uace0 <code>Index Scan<\/code>\uc740 Index\ub97c \uc774\uc6a9\ud574\uc11c \ub370\uc774\ud130\ub97c \ucc3e\ub294 \ubc29\uc2dd\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\uc9c0\ub9cc <code>Seq Scan<\/code>\uc774 \ubb34\uc870\uac74 \ub098\uc05c \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Table\uc774 \uc791\uac70\ub098 \uc870\ud68c \ub300\uc0c1\uc774 \ub300\ubd80\ubd84\uc758 Row\ub77c\uba74 \uc21c\ucc28\uc801\uc73c\ub85c \uc77d\ub294 \uac83\uc774 \ub354 \ud6a8\uc728\uc801\uc77c \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \uc2e4\ud589 \uacc4\ud68d\uc740 Index \uc0ac\uc6a9 \uc5ec\ubd80 \ud558\ub098\ub9cc \ubcf4\uace0 \ud310\ub2e8\ud560 \uac83\uc774 \uc544\ub2c8\ub77c \uc2e4\uc81c \ub370\uc774\ud130\uc758 \uc591\uacfc \ubd84\ud3ec, Query \uc870\uac74\uc744 \ud568\uaed8 \ubd10\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Transaction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Transaction\uc740 \uc5ec\ub7ec \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc791\uc5c5\uc744 \ud558\ub098\uc758 \ub17c\ub9ac\uc801\uc778 \uc791\uc5c5 \ub2e8\uc704\ub85c \ubb36\ub294 \uae30\ub2a5\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uacc4\uc88c \uc774\uccb4\ub294 \ub2e4\uc74c \ub450 \uc791\uc5c5\uc73c\ub85c \uad6c\uc131\ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>A \uacc4\uc88c -&gt; 10,000\uc6d0 \ucc28\uac10\nB \uacc4\uc88c -&gt; 10,000\uc6d0 \uc99d\uac00\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uccab \ubc88\uc9f8 \uc791\uc5c5\ub9cc \uc131\uacf5\ud558\uace0 \ub450 \ubc88\uc9f8 \uc791\uc5c5\uc774 \uc2e4\ud328\ud558\uba74 \ub370\uc774\ud130\uac00 \uc798\ubabb\ub41c \uc0c1\ud0dc\uac00 \ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \ub450 \uc791\uc5c5\uc744 \ud558\ub098\uc758 Transaction\uc73c\ub85c \ucc98\ub9ac\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN;\n\nUPDATE accounts\nSET balance = balance - 10000\nWHERE id = 1;\n\nUPDATE accounts\nSET balance = balance + 10000\nWHERE id = 2;\n\nCOMMIT;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc911\uac04\uc5d0 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\uba74 Transaction\uc744 \ucde8\uc18c\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ROLLBACK;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Transaction\uc758 \ud575\uc2ec \ud2b9\uc131\uc740 ACID\ub85c \uc815\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Atomicity\nConsistency\nIsolation\nDurability\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uc11c\ubc84\uc5d0\uc11c\ub294 \ud558\ub098\uc758 \ube44\uc988\ub2c8\uc2a4 \uc791\uc5c5\uc5d0 \uc5ec\ub7ec DB \ubcc0\uacbd\uc774 \ud568\uaed8 \uc774\ub8e8\uc5b4\uc838\uc57c \ud558\ub294\uc9c0\ub97c \ud310\ub2e8\ud558\uace0 \ud544\uc694\ud55c \ubc94\uc704\uc5d0\uc11c Transaction\uc744 \uc801\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">MVCC<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc744 \uc774\ud574\ud560 \ub54c \uc911\uc694\ud55c \uac1c\ub150 \uc911 \ud558\ub098\uac00 MVCC\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MVCC\ub294 Multi-Version Concurrency Control\uc758 \uc57d\uc790\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\ub7ec Transaction\uc774 \ub3d9\uc2dc\uc5d0 \ub370\uc774\ud130\ub97c \uc77d\uace0 \uc218\uc815\ud560 \ub54c \ubd88\ud544\uc694\ud55c \ucda9\ub3cc\uc744 \uc904\uc774\uae30 \uc704\ud574 \ub370\uc774\ud130\uc758 \uc5ec\ub7ec \ubc84\uc804\uc744 \uad00\ub9ac\ud558\ub294 \ubc29\uc2dd\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac1c\ub150\uc801\uc73c\ub85c \ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Transaction A -&gt; \ub370\uc774\ud130 \uc77d\uae30\nTransaction B -&gt; \ub370\uc774\ud130 \uc218\uc815\nTransaction A -&gt; \uc790\uc2e0\uc758 Transaction\uc5d0\uc11c \ubcfc \uc218 \uc788\ub294 \ub370\uc774\ud130 \ubc84\uc804 \uc720\uc9c0\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc5d0\uc11c\ub294 <code>UPDATE<\/code>\ub098 <code>DELETE<\/code>\uac00 \uae30\uc874 Row\ub97c \ub2e8\uc21c\ud788 \ub36e\uc5b4\uc4f0\ub294 \ubc29\uc2dd\uc73c\ub85c\ub9cc \ucc98\ub9ac\ub418\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uae30\uc874 Row Version\uacfc \uc0c8\ub85c\uc6b4 Row Version\uc744 \uad00\ub9ac\ud558\ub294 \uad6c\uc870\ub97c \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ub54c\ubb38\uc5d0 PostgreSQL\uc5d0\uc11c\ub294 \ub354 \uc774\uc0c1 \ud544\uc694\ud558\uc9c0 \uc54a\uc740 Row Version\uc744 \uc815\ub9ac\ud558\ub294 \uacfc\uc815\uc774 \uc911\uc694\ud574\uc9c4\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8 \uc5ed\ud560\uc744 \ud558\ub294 \uac83\uc774 VACUUM\uc774\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">VACUUM<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc5d0\uc11c\ub294 <code>UPDATE<\/code>\uc640 <code>DELETE<\/code>\uac00 \ubc1c\uc0dd\ud558\uba74\uc11c \ub354 \uc774\uc0c1 \uc0ac\uc6a9\ub418\uc9c0 \uc54a\ub294 Row Version\uc774 \uc0dd\uae38 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub7f0 \ub370\uc774\ud130\ub294 \uacc4\uc18d \uc313\uc774\uac8c \ub418\ubbc0\ub85c PostgreSQL\uc5d0\uc11c\ub294 \uc774\ub97c \uad00\ub9ac\ud558\uae30 \uc704\ud55c VACUUM\uc774 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uae30\ubcf8\uc801\uc778 \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>UPDATE \/ DELETE -&gt; \uc0c8\ub85c\uc6b4 Row Version \ub610\ub294 \ubcc0\uacbd \uc0c1\ud0dc \uc0dd\uc131 -&gt; \uae30\uc874 Row Version\uc774 \ub354 \uc774\uc0c1 \ud544\uc694\ud558\uc9c0 \uc54a\uc74c -&gt; VACUUM -&gt; \uacf5\uac04 \uc7ac\uc0ac\uc6a9 \ubc0f \uc815\ub9ac\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc77c\ubc18\uc801\uc778 PostgreSQL \ud658\uacbd\uc5d0\uc11c\ub294 AutoVacuum\uc774 \ubc31\uadf8\ub77c\uc6b4\ub4dc\uc5d0\uc11c \uc774\ub7ec\ud55c \uc791\uc5c5\uc744 \uc790\ub3d9\uc73c\ub85c \uc218\ud589\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c PostgreSQL\uc744 \uc6b4\uc601\ud560 \ub54c\ub294 VACUUM\uacfc AutoVacuum\uc758 \uc5ed\ud560\uc744 \uc774\ud574\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">JSON\uacfc JSONB<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc740 \uad00\uacc4\ud615 \ub370\uc774\ud130\ubfd0\ub9cc \uc544\ub2c8\ub77c JSON \ud615\ud0dc\uc758 \ub370\uc774\ud130\ub3c4 \uc800\uc7a5\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ub2e4\uc74c\uacfc \uac19\uc740 Table\uc744 \ub9cc\ub4e4 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE users (\n    id BIGINT PRIMARY KEY,\n    profile JSONB\n);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub9ac\uace0 \ub2e4\uc74c\uacfc \uac19\uc740 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    \"nickname\": \"player\",\n    \"level\": 30,\n    \"items\": &#91;\"sword\", \"shield\"]\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc5d0\uc11c\ub294 <code>JSON<\/code>\uacfc <code>JSONB<\/code> \ud0c0\uc785\uc744 \uc81c\uacf5\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc77c\ubc18\uc801\uc778 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c\ub294 JSON \ub370\uc774\ud130\ub97c \uac80\uc0c9\ud558\uac70\ub098 Index\ub97c \uc801\uc6a9\ud560 \ud544\uc694\uac00 \uc788\uae30 \ub54c\ubb38\uc5d0 <code>JSONB<\/code>\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">JSONB \ub0b4\ubd80\uc758 \uac12\uc744 \uc870\ud68c\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT *\nFROM users\nWHERE profile-&gt;&gt;'nickname' = 'player';\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">JSONB\uc5d0 GIN Index\ub97c \uc0dd\uc131\ud558\ub294 \uac83\ub3c4 \uac00\ub2a5\ud558\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE INDEX idx_users_profile\nON users\nUSING GIN (profile);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uae30\ub2a5\uc744 \uc774\uc6a9\ud558\uba74 \uad00\uacc4\ud615 \ub370\uc774\ud130\uc640 \uc77c\ubd80 \ubc18\uc815\ud615 \ub370\uc774\ud130\ub97c \ud558\ub098\uc758 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ud568\uaed8 \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\ub9cc JSONB\uac00 \uc77c\ubc18\uc801\uc778 \uad00\uacc4\ud615 \ubaa8\ub378\uc744 \ub300\uccb4\ud558\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc790\uc8fc \uc870\ud68c\ud558\uac70\ub098 \ub2e4\ub978 \ub370\uc774\ud130\uc640 \uad00\uacc4\ub97c \ub9fa\ub294 \ud575\uc2ec \ub370\uc774\ud130\ub77c\uba74 \uc77c\ubc18\uc801\uc778 Column\uacfc Table\ub85c \ubaa8\ub378\ub9c1\ud558\ub294 \uac83\uc774 \ub354 \uc801\ud569\ud55c \uacbd\uc6b0\uac00 \ub9ce\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Array<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc740 Array \ud0c0\uc785\ub3c4 \uc9c0\uc6d0\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE users (\n    id BIGINT PRIMARY KEY,\n    tags TEXT&#91;]\n);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ubc30\uc5f4 \ud615\ud0dc\uc758 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT INTO users (id, tags)\nVALUES (1, ARRAY&#91;'game', 'developer']);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud0dc\uadf8\ucc98\ub7fc \ub2e8\uc21c\ud55c \uc5ec\ub7ec \uac12\uc744 \ud558\ub098\uc758 Column\uc5d0\uc11c \uad00\ub9ac\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 \uc720\uc6a9\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\ub9cc \ubc30\uc5f4 \ub0b4\ubd80 \ub370\uc774\ud130 \uc0ac\uc774\uc5d0 \ubcf5\uc7a1\ud55c \uad00\uacc4\uac00 \uc0dd\uae30\uac70\ub098 \uac1c\ubcc4 \uac12\uc744 \uc790\uc8fc \uac80\uc0c9\ud574\uc57c \ud55c\ub2e4\uba74 \ubcc4\ub3c4\uc758 Table\ub85c \ubd84\ub9ac\ud558\ub294 \uac83\uc774 \ub354 \uc801\ud569\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Function\uacfc Trigger<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc740 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ub0b4\ubd80\uc5d0\uc11c Function\uc744 \uc815\uc758\ud558\uace0 \uc2e4\ud589\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub610\ud55c \ud2b9\uc815 \ub370\uc774\ud130 \ubcc0\uacbd\uc774 \ubc1c\uc0dd\ud588\uc744 \ub54c \uc790\ub3d9\uc73c\ub85c \uc2e4\ud589\ub418\ub294 Trigger\ub97c \ub9cc\ub4e4 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ub370\uc774\ud130\uac00 \ubcc0\uacbd\ub420 \ub54c \ub85c\uadf8\ub97c \uae30\ub85d\ud558\ub3c4\ub85d \uad6c\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT \/ UPDATE \/ DELETE -&gt; Trigger -&gt; Log \ucc98\ub9ac\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub7f0 \uae30\ub2a5\uc740 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ub0b4\ubd80\uc5d0\uc11c \uc77c\uad00\ub41c \uaddc\uce59\uc744 \uc801\uc6a9\ud574\uc57c \ud560 \ub54c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\uc9c0\ub9cc \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \uc9c0\ub098\uce58\uac8c Database \ub0b4\ubd80\uc5d0 \ub123\uc73c\uba74 \uc804\uccb4 \uc2dc\uc2a4\ud15c \uad6c\uc870\ub97c \uc774\ud574\ud558\uae30 \uc5b4\ub824\uc6cc\uc9c8 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \ub370\uc774\ud130 \ubb34\uacb0\uc131\uc744 \ubcf4\uc7a5\ud558\uae30 \uc704\ud55c DB \uaddc\uce59\uacfc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ud575\uc2ec \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \uad6c\ubd84\ud574\uc11c \uc124\uacc4\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Extension<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc758 \ud2b9\uc9d5 \uc911 \ud558\ub098\ub294 Extension \uc2dc\uc2a4\ud15c\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL \uc790\uccb4\uc5d0 \ucd94\uac00 \uae30\ub2a5\uc744 \uc124\uce58\ud574\uc11c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \uae30\ub2a5\uc744 \ud655\uc7a5\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub300\ud45c\uc801\uc778 \uc608\uac00 PostGIS\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PostGIS\ub97c \uc0ac\uc6a9\ud558\uba74 PostgreSQL\uc5d0\uc11c \uacf5\uac04 \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PostgreSQL -&gt; PostGIS -&gt; Spatial Data \/ Spatial Query\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point, Polygon \uac19\uc740 \uacf5\uac04 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\uace0 \uc704\uce58 \uae30\ubc18 Query\ub97c \uc218\ud589\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub7f0 \ud655\uc7a5\uc131 \ub54c\ubb38\uc5d0 PostgreSQL\uc740 \ub2e8\uc21c\ud55c \uad00\uacc4\ud615 \ub370\uc774\ud130 \uc800\uc7a5\uc18c\ub97c \ub118\uc5b4 \ud2b9\uc815 \ub3c4\uba54\uc778\uc5d0 \ud544\uc694\ud55c \uae30\ub2a5\uc744 \ucd94\uac00\ud574\uc11c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub3c4 \ub9ce\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Node.js\uc640 PostgreSQL<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js \uc11c\ubc84\uc5d0\uc11c PostgreSQL\uc744 \uc5f0\uacb0\ud560 \ub54c\ub294 PostgreSQL \ud074\ub77c\uc774\uc5b8\ud2b8 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub300\ud45c\uc801\uc73c\ub85c <code>pg<\/code> \ud328\ud0a4\uc9c0\uac00 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install pg\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uae30\ubcf8\uc801\uc778 \uc5f0\uacb0 \uad6c\uc870\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const { Pool } = require('pg');\n\nconst pool = new Pool({\n    host: process.env.DB_HOST,\n    port: 5432,\n    database: process.env.DB_NAME,\n    user: process.env.DB_USER,\n    password: process.env.DB_PASSWORD\n});\n\nconst result = await pool.query(\n    'SELECT * FROM users WHERE id = $1',\n    &#91;userId]\n);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\uae30\uc11c \uc911\uc694\ud55c \uac83\uc740 \uc0ac\uc6a9\uc790 \uc785\ub825\uac12\uc744 SQL \ubb38\uc790\uc5f4\uc5d0 \uc9c1\uc811 \uc5f0\uacb0\ud558\uc9c0 \uc54a\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc798\ubabb\ub41c \ubc29\uc2dd\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const query = `SELECT * FROM users WHERE id = ${userId}`;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub300\uc2e0 Parameterized Query\ub97c \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>await pool.query(\n    'SELECT * FROM users WHERE id = $1',\n    &#91;userId]\n);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub7f0 \ubc29\uc2dd\uc740 SQL Injection \uac19\uc740 \ubb38\uc81c\ub97c \ubc29\uc9c0\ud558\ub294 \ub370 \uc911\uc694\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub610\ud55c Node.js \uc11c\ubc84\uc5d0\uc11c\ub294 \uc694\uccad\ub9c8\ub2e4 DB Connection\uc744 \uc0c8\ub85c \uc0dd\uc131\ud558\ub294 \uac83\ubcf4\ub2e4 Connection Pool\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc77c\ubc18\uc801\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Node.js -&gt; Connection Pool -&gt; PostgreSQL\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pool\uc774 \uc5ec\ub7ec DB Connection\uc744 \uad00\ub9ac\ud558\uace0 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc740 \ud544\uc694\ud55c Connection\uc744 \ube4c\ub824 \uc0ac\uc6a9\ud55c \ub4a4 \ubc18\ud658\ud55c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">ORM<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js\uc5d0\uc11c PostgreSQL\uc744 \uc0ac\uc6a9\ud560 \ub54c SQL\uc744 \uc9c1\uc811 \uc791\uc131\ud558\ub294 \ubc29\ubc95 \uc678\uc5d0 ORM\uc744 \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub300\ud45c\uc801\uc73c\ub85c Prisma, TypeORM \ub4f1\uc774 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uae30\ubcf8\uc801\uc778 \uad6c\uc870\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Node.js -&gt; ORM -&gt; PostgreSQL\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">ORM\uc744 \uc0ac\uc6a9\ud558\uba74 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uac1d\uccb4\uc640 Database Table \uc0ac\uc774\uc758 Mapping\uc744 \uad00\ub9ac\ud560 \uc218 \uc788\uace0 Migration\uc774\ub098 Type \uad00\ub9ac \uac19\uc740 \uae30\ub2a5\ub3c4 \ud568\uaed8 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ubc18\ub300\ub85c \ubcf5\uc7a1\ud55c Query\ub098 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \uc138\ubc00\ud55c \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud574\uc57c \ud558\ub294 \uacbd\uc6b0\uc5d0\ub294 Raw SQL\uc774 \ub354 \uc801\ud569\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ORM\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uace0 \ud574\uc11c SQL\uacfc Database\uc758 \ub3d9\uc791\uc744 \ubab0\ub77c\ub3c4 \ub418\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uc131\ub2a5 \ubb38\uc81c\ub97c \ubd84\uc11d\ud558\ub824\uba74 JOIN, Index, Transaction, Execution Plan \ub4f1\uc744 \uc774\ud574\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Migration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Database Schema\ub3c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ucf54\ub4dc\uc640 \ub9c8\ucc2c\uac00\uc9c0\ub85c \uacc4\uc18d \ubcc0\uacbd\ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc98\uc74c\uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 Table\uc774\uc5c8\ub2e4\uace0 \ud558\uc790.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>users -&gt; id \/ name\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ud6c4 Email Column\uc744 \ucd94\uac00\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>users -&gt; id \/ name \/ email\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub7f0 Schema \ubcc0\uacbd\uc744 \ucf54\ub4dc\uc640 \ud568\uaed8 \uad00\ub9ac\ud558\ub294 \uac83\uc774 Migration\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uae30\ubcf8\uc801\uc778 \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Migration 001 -&gt; users Table \uc0dd\uc131 -&gt; Migration 002 -&gt; email Column \ucd94\uac00 -&gt; Migration 003 -&gt; Index \ucd94\uac00\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Migration\uc744 \uc0ac\uc6a9\ud558\uba74 \uac1c\ubc1c \ud658\uacbd\uacfc \uc6b4\uc601 \ud658\uacbd\uc758 Database Schema \ubcc0\uacbd \uc774\ub825\uc744 \ucf54\ub4dc\ub85c \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">PostgreSQL\uacfc MySQL<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc744 \uc774\ud574\ud560 \ub54c \ub2e8\uc21c\ud788 MySQL\uc758 \ub300\uccb4\ud488\uc73c\ub85c \uc0dd\uac01\ud558\uba74 PostgreSQL\uc758 \ud2b9\uc9d5\uc744 \ub193\uce58\uae30 \uc27d\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub450 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubaa8\ub450 \uad00\uacc4\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc774\uace0 \ub2e4\uc74c\uacfc \uac19\uc740 \uae30\ubcf8 \uac1c\ub150\uc744 \uacf5\uc720\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Table\nPrimary Key\nForeign Key\nJOIN\nIndex\nTransaction\nConstraint\nSQL\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \uae30\ubcf8\uc801\uc778 Database \uad6c\uc870\uc640 SQL\uc744 \uc774\ud574\ud558\uace0 \uc788\ub2e4\uba74 \ub2e4\ub978 RDBMS\ub85c \ub118\uc5b4\uac00\ub294 \uacfc\uc815 \uc790\uccb4\ub294 \uc5b4\ub835\uc9c0 \uc54a\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc28\uc774\ub294 \uc138\ubd80 \uae30\ub2a5\uacfc \uad6c\ud604, \ub370\uc774\ud130 \ud0c0\uc785, Query \ucc98\ub9ac \ub2a5\ub825, \ud655\uc7a5 \uae30\ub2a5 \ub4f1\uc5d0\uc11c \ub098\ud0c0\ub09c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc740 \ud2b9\ud788 \ub2e4\uc74c\uacfc \uac19\uc740 \uc0c1\ud669\uc5d0\uc11c \uac15\ub825\ud55c \uc120\ud0dd\uc9c0\uac00 \ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ubcf5\uc7a1\ud55c \uad00\uacc4\ud615 \ub370\uc774\ud130 -&gt; PostgreSQL\n\ubcf5\uc7a1\ud55c JOIN \/ Query -&gt; PostgreSQL\n\uac15\ud55c \ub370\uc774\ud130 \ubb34\uacb0\uc131 \uc694\uad6c -&gt; PostgreSQL\nTransaction \uc911\uc2ec \uc2dc\uc2a4\ud15c -&gt; PostgreSQL\n\uad00\uacc4\ud615 \ub370\uc774\ud130 + JSONB -&gt; PostgreSQL\n\uacf5\uac04 \ub370\uc774\ud130 -&gt; PostgreSQL + PostGIS\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\ub9cc \uc774\uac83\uc774 PostgreSQL\ub9cc \uac00\ub2a5\ud55c \uae30\ub2a5\uc774\ub77c\ub294 \uc758\ubbf8\ub294 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MySQL \uc5ed\uc2dc \ub300\ubd80\ubd84\uc758 \uae30\ubcf8\uc801\uc778 Database \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uacb0\uad6d \ud2b9\uc815 Database\uac00 \ubb34\uc870\uac74 \uc6b0\uc6d4\ud55c \uac83\uc774 \uc544\ub2c8\ub77c <strong>\uc11c\ube44\uc2a4\uc758 \ub370\uc774\ud130 \uad6c\uc870\uc640 Query \ud328\ud134, \uc6b4\uc601 \ud658\uacbd\uc5d0 \ub9de\ub294 Database\ub97c \uc120\ud0dd\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">PostgreSQL\uc758 \ub3d9\uc2dc\uc131<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\uc5d0\uc11c\ub294 \uc5ec\ub7ec \uc694\uccad\uc774 \ub3d9\uc2dc\uc5d0 Database\uc5d0 \uc811\uadfc\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Request A -&gt; PostgreSQL\nRequest B -&gt; PostgreSQL\nRequest C -&gt; PostgreSQL\nRequest D -&gt; PostgreSQL\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub54c \uac19\uc740 \ub370\uc774\ud130\ub97c \ub3d9\uc2dc\uc5d0 \uc77d\uac70\ub098 \uc218\uc815\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc740 Transaction\uacfc MVCC \ub4f1\uc744 \uc774\uc6a9\ud574\uc11c \uc774\ub7f0 \ub3d9\uc2dc\uc131 \uc0c1\ud669\uc744 \ucc98\ub9ac\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac1c\ub150\uc801\uc73c\ub85c \ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \uc5f0\uacb0\ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Concurrent Request -&gt; Transaction -&gt; MVCC -&gt; Lock -&gt; Data Consistency\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c Database \uc131\ub2a5\uc744 \ub2e8\uc21c\ud788 Query \ud558\ub098\uc758 \uc2e4\ud589 \uc2dc\uac04\uc73c\ub85c\ub9cc \ud310\ub2e8\ud574\uc11c\ub294 \uc548 \ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Transaction\uc774 \ub108\ubb34 \uc624\ub798 \uc720\uc9c0\ub418\uac70\ub098 \ubd88\ud544\uc694\ud55c Lock\uc774 \ubc1c\uc0dd\ud558\uba74 \ub2e4\ub978 \uc694\uccad\uc758 \ucc98\ub9ac\uc5d0\ub3c4 \uc601\ud5a5\uc744 \uc904 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">PostgreSQL \uc804\uccb4 \uad6c\uc870<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc9c0\uae08\uae4c\uc9c0\uc758 \ub0b4\uc6a9\uc744 \uc804\uccb4\uc801\uc73c\ub85c \uc5f0\uacb0\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Application -&gt; SQL \/ ORM -&gt; PostgreSQL -&gt; Database -&gt; Schema -&gt; Table -&gt; Row \/ Column\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Table\uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \ub370\uc774\ud130 \uad00\ub9ac \uc694\uc18c\uac00 \uc5f0\uacb0\ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Table -&gt; Primary Key \/ Foreign Key \/ Constraint \/ Index\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Query\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \ucc98\ub9ac\ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SQL -&gt; SELECT \/ INSERT \/ UPDATE \/ DELETE -&gt; JOIN -&gt; Execution Plan -&gt; Index\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub3d9\uc2dc\uc131 \ucc98\ub9ac\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc5f0\uacb0\ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Transaction -&gt; Isolation -&gt; MVCC -&gt; Lock -&gt; Consistency\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc758 \ud655\uc7a5 \uae30\ub2a5\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc5f0\uacb0\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PostgreSQL -&gt; JSONB \/ Array \/ Function \/ Trigger \/ Extension \/ PostGIS\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js \uc11c\ubc84\uae4c\uc9c0 \ud3ec\ud568\ud558\uba74 \uc804\uccb4\uc801\uc778 \uad6c\uc870\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; Node.js API Server -&gt; Service -&gt; Repository \/ ORM -&gt; PostgreSQL\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Connection Pool\uae4c\uc9c0 \ud3ec\ud568\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; Node.js API Server -&gt; Connection Pool -&gt; PostgreSQL\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\uc815\ub9ac<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc740 \ub2e8\uc21c\ud788 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\ub294 SQL \uc11c\ubc84\uac00 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Table\uc744 \uc774\uc6a9\ud574\uc11c \ub370\uc774\ud130\ub97c \uad6c\uc870\ud654\ud558\uace0 Primary Key\uc640 Foreign Key\ub85c \uad00\uacc4\ub97c \ud45c\ud604\ud558\uba70 Constraint\ub97c \uc774\uc6a9\ud574 \ub370\uc774\ud130 \ubb34\uacb0\uc131\uc744 \uad00\ub9ac\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Index\ub97c \uc774\uc6a9\ud574 Query \uc131\ub2a5\uc744 \uac1c\uc120\ud558\uace0 EXPLAIN\uc744 \ud1b5\ud574 \uc2e4\uc81c \uc2e4\ud589 \uacc4\ud68d\uc744 \ubd84\uc11d\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Transaction\uacfc MVCC\ub97c \ud1b5\ud574 \uc5ec\ub7ec \uc694\uccad\uc774 \ub3d9\uc2dc\uc5d0 \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\ub294 \uc0c1\ud669\uc744 \uad00\ub9ac\ud558\uace0, VACUUM\uc744 \ud1b5\ud574 PostgreSQL\uc758 Row Version\uc744 \uc815\ub9ac\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\uae30\uc5d0 JSONB, Array, Function, Trigger, Extension, PostGIS \uac19\uc740 \uae30\ub2a5\uae4c\uc9c0 \uc81c\uacf5\ud558\uae30 \ub54c\ubb38\uc5d0 \uc804\ud1b5\uc801\uc778 \uad00\uacc4\ud615 \ub370\uc774\ud130\ubfd0\ub9cc \uc544\ub2c8\ub77c \ub2e4\uc591\ud55c \ud615\ud0dc\uc758 \ub370\uc774\ud130\ub97c \ud558\ub098\uc758 \uc2dc\uc2a4\ud15c\uc5d0\uc11c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js \uac19\uc740 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc11c\ubc84\uc640 \uc5f0\uacb0\ud558\uba74 \uc77c\ubc18\uc801\uc73c\ub85c \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; Node.js -&gt; Service -&gt; Repository \/ ORM -&gt; PostgreSQL\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">PostgreSQL\uc744 \uc81c\ub300\ub85c \uc0ac\uc6a9\ud558\ub824\uba74 SQL \ubb38\ubc95\ub9cc \uc775\ud788\ub294 \uac83\uc73c\ub85c\ub294 \ubd80\uc871\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud575\uc2ec \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \ubcfc \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ub370\uc774\ud130 \ubaa8\ub378\ub9c1 -&gt; Constraint -&gt; Query -&gt; Index -&gt; Execution Plan -&gt; Transaction -&gt; MVCC -&gt; VACUUM\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uacb0\uad6d PostgreSQL\uc758 \ud575\uc2ec\uc740 <strong>\ub370\uc774\ud130\ub97c \uc5b4\ub5bb\uac8c \ubaa8\ub378\ub9c1\ud558\uace0, \ubb34\uacb0\uc131\uc744 \uc5b4\ub5bb\uac8c \ubcf4\uc7a5\ud558\uba70, Query\ub97c \uc5b4\ub5bb\uac8c \uc2e4\ud589\ud558\uace0, \ub3d9\uc2dc\uc131\uc744 \uc5b4\ub5bb\uac8c \uc81c\uc5b4\ud560 \uac83\uc778\uac00<\/strong>\uc5d0 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Database\ub97c \ub2e8\uc21c\ud55c \uc800\uc7a5 \uacf5\uac04\uc73c\ub85c \ubcf4\uba74 SQL \ubb38\ubc95\ub9cc \ubcf4\uac8c \ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\uc9c0\ub9cc \uc11c\ubc84 \uc2dc\uc2a4\ud15c\uc758 \uc77c\ubd80\ub85c \ubcf4\uba74 Table, Constraint, Index, Query, Transaction, MVCC\uac00 \ud558\ub098\uc758 \uc5f0\uacb0\ub41c \uad6c\uc870\ub85c \ubcf4\uc774\uae30 \uc2dc\uc791\ud55c\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PostgreSQL\uc740 \uc624\ud508\uc18c\uc2a4 \uac1d\uccb4-\uad00\uacc4\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uad00\ub9ac \uc2dc\uc2a4\ud15c(ORDBMS)\uc774\ub2e4. SQL\uc744 \uae30\ubc18\uc73c\ub85c \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\uace0 \uc870\ud68c\ud558\ub294 \uc804\ud1b5\uc801\uc778 \uad00\uacc4\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\uba74\uc11c, JSON, \ubc30\uc5f4, \uc0ac\uc6a9\uc790 \uc815\uc758 \ud0c0\uc785, \ud568\uc218, \ud655\uc7a5 \uae30\ub2a5 \ub4f1 \ub2e4\uc591\ud55c \ub370\uc774\ud130 \ubaa8\ub378\ub9c1 \uae30\ub2a5\ub3c4 \uc9c0\uc6d0\ud55c\ub2e4. MySQL\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c Table, Row, Column, Index, Transaction \ub4f1\uc744 \uae30\ubc18\uc73c\ub85c \ub370\uc774\ud130\ub97c \uad00\ub9ac\ud558\uc9c0\ub9cc PostgreSQL\uc740 \ud2b9\ud788 \ubcf5\uc7a1\ud55c Query \ucc98\ub9ac, \ub370\uc774\ud130 \ud0c0\uc785, \ud655\uc7a5\uc131, SQL \uae30\ub2a5 \uce21\uba74\uc5d0\uc11c \uac15\ud55c \ubaa8\uc2b5\uc744 \ubcf4\uc778\ub2e4. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[49],"tags":[],"class_list":["post-1687","post","type-post","status-publish","format-standard","hentry","category-server"],"_links":{"self":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/1687","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1687"}],"version-history":[{"count":6,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/1687\/revisions"}],"predecessor-version":[{"id":2061,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/1687\/revisions\/2061"}],"wp:attachment":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1687"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1687"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}