์ด ๋ฌธ์์์๋ AlloyDB Omni์์ ๋ ผ๋ฆฌ์ ๋ณต์ ์ฌ๋กฏ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค. PostgreSQL์์ ๋ ผ๋ฆฌ ๋ณต์ ๋ ๊ฒ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ฌํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ ๊ธฐํ ์ ํ๋ฆฌ์ผ์ด์ ์ผ ์ ์๋ ํ๋ ์ด์์ ๊ตฌ๋ ์๋ก ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. AlloyDB Omni Kubernetes ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ง๋ ํด๋ฌ์คํฐ์์ ๋ ผ๋ฆฌ์ ๋ณต์ ๋ฅผ ์ฌ์ฉ ์ค์ ํ๊ณ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
์คํธ๋ฆฌ๋ฐ๋ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ๋ณ ํ ์ ๋ฐ์ดํธ, ์ฝ์ ๋๋ ์ญ์ ์ผ ์ ์์ต๋๋ค. ๊ตฌ๋ ์๋ ์ง์์ ์ธ ์ฐ๊ฒฐ์ ๋ณด์ฅํ๋ ๊ณ ์ ํ ๋ณต์ ์ฌ๋กฏ์ ํตํด ๊ฒ์์์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ์๊ตฌ ์ฐ๊ฒฐ์ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ ์ํ๋ฅผ ์ ์งํ๋ฏ๋ก ์ค๋จ์ด ๋ฐ์ํ๋ฉด ์ค๋จ๋ ์ง์ ๋ถํฐ ์คํธ๋ฆฌ๋ฐ์ด ์ฌ๊ฐ๋ฉ๋๋ค.
PostgreSQL์ ๋ ผ๋ฆฌ ๋ณต์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ ผ๋ฆฌ ๋ณต์ ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์ด ํ์ด์ง์ ์ฝ๋ ์ค๋ํซ์ ๊ฐ์ ์์ฒด AlloyDB Omni ๋ฆฌ์์ค์ ๊ฐ์ผ๋ก ๋์ฒดํ์ฌ ๋ชจ๋ธ๋ก ์ฌ์ฉํ ์ ์๋ ์์์ ๋๋ค.
์์ํ๊ธฐ ์ ์
- Kubernetes์ Omni Operator๋ฅผ ์ค์นํฉ๋๋ค.
๊ฒ์์ ํด๋ฌ์คํฐ ๋ง๋ค๊ธฐ
๋ณต์ ์ฌ๋กฏ์ ๋ง๋ค๊ธฐ ์ ์ ๋
ผ๋ฆฌ์ ๋ณต์ ๊ฐ ์ฌ์ฉ ์ค์ ๋ ๊ฒ์์ ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค. DBCluster
๋งค๋ํ์คํธ์์ wal_level
๋งค๊ฐ๋ณ์๋ฅผ logical
๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
๋ ผ๋ฆฌ ๋ณต์ ๊ฐ ์ฌ์ฉ ์ค์ ๋ ๊ฒ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋งค๋ํ์คํธ๋ฅผ ์ ์ฉํ์ธ์.
apiVersion: v1
kind: Secret
metadata:
name: db-pw-DB_CLUSTER_NAME
namespace: DB_CLUSTER_NAMESPACE
type: Opaque
data:
DB_CLUSTER_NAME: "ENCODED_PASSWORD"
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
name: DB_CLUSTER_NAME
namespace: DB_CLUSTER_NAMESPACE
spec:
databaseVersion: "ALLOYDB_OMNI_VERSION"
spec:
availability:
numberOfStandbys: 1
primarySpec:
parameters:
wal_level: "logical"
adminUser:
passwordRef:
name: db-pw-DB_CLUSTER_NAME
resources:
cpu: CPU_COUNT
memory: MEMORY_SIZE
disks:
- name: DataDisk
size: DISK_SIZE
๋ค์์ ๋ฐ๊ฟ๋๋ค.
DB_CLUSTER_NAME
: ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ฌ์คํฐ์ ์ด๋ฆ์ ๋๋ค(์:publisher
).DB_CLUSTER_NAMESPACE
(์ ํ์ฌํญ): ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ค๋ ค๋ ๋ค์์คํ์ด์ค์ ๋๋ค(์:publisher-namespace
).ENCODED_PASSWORD
: ๊ธฐ๋ณธpostgres
์ฌ์ฉ์ ์ญํ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ก๊ทธ์ธ ๋น๋ฐ๋ฒํธ๋ก, base64 ๋ฌธ์์ด๋ก ์ธ์ฝ๋ฉ๋ฉ๋๋ค(์:ChangeMe123
์ ๊ฒฝ์ฐQ2hhbmdlTWUxMjM=
).ALLOYDB_OMNI_VERSION
: AlloyDB Omni ๋ฒ์ ,15.7.0
์ด์CPU_COUNT
: ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ฌ์คํฐ์ ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์คํด์ค์์ ์ฌ์ฉํ ์ ์๋ CPU ์์ ๋๋ค.MEMORY_SIZE
: ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ฌ์คํฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์คํด์ค๋น ๋ฉ๋ชจ๋ฆฌ ์์ ๋๋ค. CPU๋น 8GB๋ก ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด ๋งค๋ํ์คํธ์์ ์ด์ ์cpu
๋ฅผ2
๋ก ์ค์ ํ ๊ฒฝ์ฐmemory
๋ฅผ16Gi
๋ก ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.DISK_SIZE
: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์คํด์ค๋น ๋์คํฌ ํฌ๊ธฐ์ ๋๋ค(์:10Gi
).
๋ณต์ ์ฌ๋กฏ ๋ง๋ค๊ธฐ
๊ฒ์์ ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ ํ ๊ฒ์์ ํด๋ฌ์คํฐ์์ Replication
๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋
ผ๋ฆฌ ๋ณต์ ์ฌ๋กฏ์ ๋ง๋ค ์ ์์ต๋๋ค. ๊ฐ Replication
๋ฆฌ์์ค๋ ํด๋น ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ฌ์คํฐ ๋ฆฌ์์ค์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ฌ์คํฐ์๋ ์ฐ๊ฒฐ๋ ๋
ผ๋ฆฌ์ ๋ณต์ ๋ฆฌ์์ค๊ฐ ์ฌ๋ฌ ๊ฐ ์์ ์ ์์ต๋๋ค.
๊ฒ์์ ํด๋ฌ์คํฐ์์ ๋ณต์ ์ฌ๋กฏ์ ๊ตฌ์ฑํ๋ ค๋ฉด ๋ค์ ๋งค๋ํ์คํธ๋ฅผ ์ ์ฉํ์ธ์.
$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: USER_PASSWORD_SECRET_NAME
namespace: USER_PASSWORD_SECRET_NAMESPACE
type: Opaque
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: Replication
metadata:
name: REPLICATION_NAME
namespace: NAMESPACE
spec:
dbcluster:
name: DB_CLUSTER_NAME
upstream:
logicalReplication:
pluginName: DECODER_PLUGIN
databaseName: DATABASE_NAME
applicationName: APPLICATION_NAME
replicationSlotName: REPLICATION_SLOT_NAME
synchronous: "REPLICATION_MODE"
username: APPLICATION_USER
password:
name: USER_PASSWORD_SECRET_NAME
namespace: USER_PASSWORD_SECRET_NAMESPACE
EOF
๋ค์์ ๋ฐ๊ฟ๋๋ค.
- REPLICATION_NAME: ์ด
Replication
๋ฆฌ์์ค์ ์ด๋ฆ์ ๋๋ค(์:replication-1
). - NAMESPACE: ์ด
Replication
๋ฆฌ์์ค์ Kubernetes ๋ค์์คํ์ด์ค์ ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ฌ์คํฐ์ ๋ค์์คํ์ด์ค์ ์ผ์นํด์ผ ํฉ๋๋ค. - DB_CLUSTER_NAME: ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ฌ์คํฐ์ ์ด๋ฆ์ ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ค ๋ ํ ๋นํ์ต๋๋ค.
- DECODER_PLUGIN: ๋
ผ๋ฆฌ ๋ณต์ ์ ์ฌ์ฉํ ๋์ฝ๋ฉ ํ๋ฌ๊ทธ์ธ(์:
pgoutput
)์ผ๋ก ์ค์ ํฉ๋๋ค. ๋ค์ํ ๋์ฝ๋ฉ ํ๋ฌ๊ทธ์ธ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ถ๋ ฅ ํ๋ฌ๊ทธ์ธ์ ์ฐธ๊ณ ํ์ธ์. - DATABASE_NAME: ๋ณ๊ฒฝ์ฌํญ์ ๋ณต์ ์ฌ๋กฏ์ผ๋ก ์คํธ๋ฆฌ๋ฐํ๋ ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ฆ์ผ๋ก ์ค์ ํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ฒ์์ ํด๋ฌ์คํฐ์ ์ด๋ฏธ ์์ฑ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
- APPLICATION_NAME (์ ํ์ฌํญ): ๋ณต์ ์ฌ๋กฏ์ ์ฐ๊ฒฐํ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฆ์ผ๋ก ์ค์ ๋ฉ๋๋ค. ์คํธ๋ฆฌ๋ฐ ๋ชจ๋๊ฐ ๋๊ธฐ์์ผ๋ก ์ค์ ๋ ๊ฒฝ์ฐ ์ด ํ๋๋ ํ์์ ๋๋ค.
- REPLICATION_MODE (์ ํ์ฌํญ): ๋น๋๊ธฐ ๋ณต์ ์ ๊ฒฝ์ฐ
false
๋ก ์ค์ ํฉ๋๋ค. ๋๊ธฐ ๋ณต์ ๋ฅผ ์ฌ์ฉ ์ค์ ํ๋ ์๋๋ ํฌ์ํ๋ ค๋ฉด ์ด ๊ฐ์true
๋ก ์ค์ ํฉ๋๋ค. ๋ช ์์ ์ผ๋ก ์ค์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์false
์ ๋๋ค. - REPLICATION_SLOT_NAME: ์์ฑ๋๊ณ ๊ตฌ๋
์๊ฐ ์ฌ์ฉํ ๋ณต์ ์ฌ๋กฏ์ ์ด๋ฆ์
๋๋ค(์:
logicalrepltestslot
). - REPLICATION_USER (์ ํ์ฌํญ): ๋ณต์ ์ฌ๋กฏ์ ์ฐ๊ฒฐํ๋ ์ฌ์ฉ์์ ์ด๋ฆ์ ๋๋ค. ๋ณต์ ์ฌ์ฉ์๋ฅผ ์ค์ ํ๋ ๊ฒฝ์ฐ ๋ณด์ ๋น๋ฐ ์ด๋ฆ, ๋ค์์คํ์ด์ค, ๋น๋ฐ๋ฒํธ๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
- USER_PASSWORD_SECRET_NAME (์ ํ์ฌํญ): ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ฉ์์ Kubernetes ๋ณด์ ๋น๋ฐ ์ด๋ฆ์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ฉ์๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ ํ์์ ๋๋ค.
- USER_PASSWORD_SECRET_NAMESPACE (์ ํ์ฌํญ): ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ฉ์์ Kubernetes ๋ณด์ ๋น๋ฐ์ด ์๋ ๋ค์์คํ์ด์ค์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ฉ์๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ ํ์์ ๋๋ค.
๋ณต์ ์ฌ๋กฏ ์ํ ๋ณด๊ธฐ
๋ณต์ ์ฌ๋กฏ์ ์ํ๋ฅผ ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
kubectl get replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE -oyaml
status
ํ๋์ ๊ธฐํ ์ธ๋ถ์ ๋ณด๊ฐ ์๋ต์ ํฌํจ๋ฉ๋๋ค.
apiVersion: alloydbomni.dbadmin.goog/v1
kind: Replication
metadata:
name: REPLICATION_NAME
namespace: NAMESPACE
...
...
status:
conditions:
- lastTransitionTime: "2025-01-25T06:49:25Z"
message: Ready for replication
reason: Ready
status: "True"
type: Ready
- lastTransitionTime: "2025-01-25T06:49:25Z"
message: Replication slot is not being used
reason: Unhealthy
status: "False"
type: Healthy
observedGeneration: 2
upstream:
host: DATABASE_ENDPOINT
password:
name: USER_PASSWORD_SECRET_NAME
namespace: USER_PASSWORD_SECRET_NAMESPACE
port: DATABASE_PORT
replicationSlotName: REPLICATION_SLOT_NAME
username: APPLICATION_USER
DATABASE_ENDPOINT
์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ๋ ๋ฐ ์ฌ์ฉํ๋ IP ์ฃผ์๊ฐ ํ์๋ฉ๋๋ค. READY
์ด์ ์ํ TRUE
์ ์ฌ๋กฏ์ด ์คํธ๋ฆฌ๋ฐํ ์ค๋น๊ฐ ๋์์์ ๋ํ๋
๋๋ค. ๊ตฌ๋
์ DBCluster ๋๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ณต์ ์ฌ๋กฏ์ ์ฐ๊ฒฐ๋๋ฉด HEALTHY
์ด์ ์ํ๊ฐ TRUE
๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
๊ฒ์์ ํด๋ฌ์คํฐ ๊ตฌ์ฑ
ํ์ํ ํฌ๋๋ฅผ ์ฐพ์ต๋๋ค.
$ kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=DB_CLUSTER_NAME, alloydbomni.internal.dbadmin.goog/task-type=database, dbs.internal.dbadmin.goog/ha-role=Primary"
psql
์ ์ฌ์ฉํ์ฌ ๊ฒ์์ ํด๋ฌ์คํฐ์ ๊ธฐ๋ณธ ํฌ๋์ ์ฐ๊ฒฐํฉ๋๋ค.psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME
๋ค์์ ๋ฐ๊ฟ๋๋ค.
- IP_ADDRESS: ๊ฒ์์ ํด๋ฌ์คํฐ์ ๊ธฐ๋ณธ ํฌ๋ IP ์ฃผ์์ ๋๋ค.
- USERNAME: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ postgres ์ฌ์ฉ์์ ๋๋ค.
- DATABASE_NAME: ๊ตฌ๋ ์๊ฐ ๊ตฌ๋ ํ๋ ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ค.
๋ณต์ ๋ฆฌ์์ค์ ์ง์ ๋
DATABASE_NAME
๊ฐ ์์ผ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ง๋ญ๋๋ค.CREATE DATABASE DATABASE_NAME;
์ ํ์ฌํญ: ํ ์คํธ ๋ชฉ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ์ ์ถ๊ฐํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํฉ๋๋ค. ์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์์์์ ๊ตฌ๋ ์๋ก์ ๋ฐ์ดํฐ ๋ณต์ ๋ฅผ ๊ด์ฐฐํ ์ ์์ต๋๋ค.
$ psql -h localhost -U postgres DATABASE_NAME customer=# CREATE TABLE TABLE_NAME( customer(# ID INT PRIMARY KEY NOT NULL, customer(# NAME TEXT NOT NULL, customer(# AGE INT NOT NULL, customer(# SALARY REAL customer(# ); CREATE TABLE customer=# INSERT INTO TABLE_NAME (ID,NAME,AGE,SALARY) VALUES customer-# (1, 'Quinn', 25, 65000.00), customer-# (2, 'Kim', 22, 72250.00), customer-# (3, 'Bola', 31, 53000.00), customer-# (4, 'Sasha', 33, 105000.00), customer-# (5, 'Yuri', 27, 85000.00); INSERT 0 5 customer=# \dt List of relations Schema | Name | Type | Owner --------+---------+-------+---------- public | company | table | postgres (1 row) customer=# select * from TABLE_NAME; id | name | age | salary ----+-------+-----+-------- 1 | Quinn | 25 | 65000 2 | Kim | 22 | 72250 3 | Bola | 31 | 53000 4 | Sasha | 33 | 105000 5 | Yuri | 27 | 85000 (5 rows)
TABLE_NAME์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ตฌ๋ ์๊ฐ ๊ตฌ๋ ํ๋ ํ ์ด๋ธ๋ก ๋ฐ๊ฟ๋๋ค.
๊ถํ์ ๋ถ์ฌํฉ๋๋ค.
GRANT SELECT ON ALL TABLES IN SCHEMA public TO REPLICATION_USER; GRANT USAGE ON SCHEMA public TO REPLICATION_USER; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO REPLICATION_USER;
๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ๊ฒ์๋ฅผ ๋ง๋ญ๋๋ค.
CREATE PUBLICATION PUBLICATION_NAME; ALTER PUBLICATION PUBLICATION_NAME ADD TABLE TABLE_NAME;
๋ค์์ ๋ฐ๊ฟ๋๋ค.
- PUBLICATION_NAME: ๊ตฌ๋ ์๊ฐ ๊ตฌ๋ ํ๋ ๋ฐ ์ฌ์ฉํ ๊ฒ์ ์ด๋ฆ์ ๋๋ค.
๊ฒ์๋ฅผ ๋ง๋ ํ ๋ ผ๋ฆฌ์ ๋ณต์ ๋ฅผ ์ํด ๊ตฌ๋ ์ ํด๋ฌ์คํฐ๋ฅผ ์ค์ ํ๊ฑฐ๋ ๋ณต์ ๋ฅผ ์์ํ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
์ ํ์ฌํญ
๋ณต์ ์ฌ๋กฏ ๊ตฌ์ฑ ์ ๋ฐ์ดํธ๋ ์ง์๋์ง ์์ต๋๋ค. ๊ตฌ์ฑ์ ์ ๋ฐ์ดํธํ๋ ค๋ฉด ๋ณต์ ์ฌ๋กฏ์ ์ญ์ ํ๊ณ ์ ๋ฐ์ดํธ๋ ๊ตฌ์ฑ์ผ๋ก ๋ค์ ๋ง๋ญ๋๋ค.
๋ณต์ ์ฌ๋กฏ์ ์ญ์ ํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
kubectl delete replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE
๊ฒ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ง ๋ ผ๋ฆฌ์ ๋ณต์ ์ฌ๋กฏ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ๋ณต์ API๋ ๋ ผ๋ฆฌ์ ๋ณต์ ๊ตฌ๋ ์ DBCluster ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ํ์ง ์์ต๋๋ค.
๋ณต์ ๊ฐ์ฒด์์ ์ฐธ์กฐํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ฌ์คํฐ๊ฐ ๊ณ ๊ฐ์ฉ์ฑ์ผ๋ก ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ ์ฅ์ ์กฐ์น ํ ์น๊ฒฉ๋ ๋๊ธฐ ์๋ฒ์์ ๋ ผ๋ฆฌ ๋ณต์ ์ฌ๋กฏ์ด ๋ค์ ์์ฑ๋ฉ๋๋ค. ๋ณต์ ์ฌ๋กฏ์ด ๋ค์ ์์ฑ๋๋ฉด ์ฌ๋กฏ์ ์คํธ๋ฆผ ์์น๋ฅผ ๋ ์ด์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์คํธ๋ฆผ์ ๊ตฌ๋ ํ๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํธ๋ฆผ์ ๋ค์ ์ฐ๊ฒฐํ๊ณ ์ฌ์ํด์ผ ํฉ๋๋ค.