728x90
์ด๋ฒ์ ์ ๋ฌด๊ณผ์ ์์ ์ผ๋ ํด๋ค์ ์ ๋ฆฌํด๋ณด๋ฉด์ k8s ์น ๋ฐฐํฌ๋ฅผ ์๋ ์ ํ๋ ๊ธฐ์ต์ ๋์ด๋ ค ๋ค์ ๊ณต๋ถํด๋ณด๋ฉด์ ํฌ์คํ ํ๊ธฐ๋ก ํ๋ค. ์ง๋ ํฌ์คํ ์์๋ kubectl, gcloud๋ฅผ ์ค์นํ๊ณ fastapi ์ธก ์ํฌ๋ก๋ ์ปจํ ์ด๋๋ฅผ gke ์์ ์ฌ๋ ค๋ณด์๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ DB ์ค์ ์ ํ์ํ ํ์ผ๋ค์ ๋ง๋ค์ด๋ณด๋ฉด์ PV, PVC, configmap ๋ฑ ๋ด๊ฐ ํท๊ฐ๋ ธ๋ ๊ฒ๋ค์ ์ ๋ฆฌํด๋ณด๋ ์๊ฐ์ ๊ฐ์ง๋ค.
๋ชฉํ
- GKE(Google Kubernetes Engine)์ GCE(Google Compute Engine) ๋ฑ์ ํ์ฉํ ํ์คํ ์น ์๋น์ค ๋ฐฐํฌํ๊ธฐ
- docker file ๊ตฌ์ฑํ๊ธฐ
- kubectl ํ์ฉํ๊ธฐ
- ์ฟ ๋ฒ๋คํฐ์ค ๊ตฌ์ฑ์ ๊ดํ ์ดํด ๋ฐ ์ ์ฉ
- Deployment
- StatefulSet
- Persistent Volume
- Service
- Gateway
1. DB
- Database๋ Stateful Set ์ ์ฌ์ฉํ์ฌ ์ฟ ๋ฒ๋คํฐ์ค์ ์ฌ๋ฆฐ๋ค.
- DB๋ ์๋๋ ์ํ์ ๋ณด๊ฐ ์๋(stateful) ์์์ด๋ค. K8S์ Stateful set์ ๋ํด์ ์ค๋ช
ํ๊ธฐ ์ํด ์ด์ ํฌ์คํ
์ Deployment์ ๋น๊ตํด๋ณด๊ฒ ๋ค.
- Deployment(Replica Set)๋ก ์์ฑ๋ Pod๋ ์ ๋ฐ์ดํธ๋ฅผ ์ํด ๋์ฒด๋๊ฑฐ๋ ์ญ์ ํ ๋ ๊ธฐ์กด Pod์ ์๋ก์ด Pod๊ฐ ์ด๋ฆ, IP ์ฃผ์ ๋ฑ์ด ๊ฐ์ ๊ฒ์ ๋ณด์ฅํ์ง ์๋๋ค.
- ๋ฐ๋ฉด Stateful Set์ ๊ฐ๊ฐ์ Pod ๋ง๋ค ๊ณ ์ ์ Volume์ ๊ฐ์ง๊ณ , ์ญ์ ํ๊ฑฐ๋ ํ๋๋ผ๋ ๊ธฐ์กด Pod์ ๋๊ฐ์ ์ด๋ฆ๊ณผ IP๋ฅผ ๊ฐ์ง ๋์ผ Pod๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ Volume๊ณผ ์ฐ๊ฒฐ์ ์ง์ํ ์ ์๋ค.
- replica set์ผ๋ก volume(Persistant Volume Claim)๊ณผ ์ฐ๊ฒฐํ๊ณ ์๋ค๊ฐ ์ฐ๊ฒฐ pod ์๋ฅผ 0์ผ๋ก ๋ง๋ค๋ฉด PVC๋ ์ฌ๋ผ์ง์ง๋ง, stateful set์ ๊ฒฝ์ฐ์๋ PVC๊ฐ ์ฌ๋ผ์ง์ง ์์ ์๋ก Pod๋ฅผ ์์ฑํ๋ฉด ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
- ๊ฒฐ๋ก ์ ์ผ๋ก, Pod๊ฐ N๊ฐ๋ฉด PVC๋ N๊ฐ, PV๋ N๊ฐ๋ก ๊ฐ Pod๋ ์์ ์๊ฒ ๋ ๋ฆฝ์ ์ผ๋ก ํ ๋น๋ ํ๋์ PV์๋ง ์ฐ๊ฒฐ๋๋ค.
A. Persistent Volume / Claim
- Persistent Volume
- ํด๋ฌ์คํฐ์ ์คํ ๋ฆฌ์ง์ด์ ๋ฆฌ์์ค.
- Pod ์ ์ฉ ๋ณผ๋ฅจ์ฒ๋ผ ์ฌ์ฉํ๋ค.
- Persistent Volume Claim
- ์คํ ๋ฆฌ์ง์ ๋ํ ์ฌ์ฉ์์ ์์ฒญ. ํน์ ํฌ๊ธฐ / ์ ๊ทผ๋ชจ๋ ๋ฑ
- ์คํ ๋ฆฌ์ง์ Pod๋ฅผ ์๋ ์ฐ๊ฒฐ๋ค๋ฆฌ๋ผ๊ณ ์๊ฐํ๋ฉด ์ฝ๊ฒ ๋ค.
- ์ ์ ํ๋ก๋น์ ๋(๊ด๋ฆฌ์๊ฐ ์ง์ ์์ฑ)๊ณผ ๋์ ํ๋ก๋น์ ๋(PVC๋ฅผ ์ํด ์คํ ๋ฆฌ์ง ํด๋์ค ๊ธฐ๋ฐ์ผ๋ก ํ๋ก๋น์ ๋) ํ๋ ๋ฐฉ์์ด ์๋ค.
- Pod๊ฐ ์ฌ์ฉ ์ค์ธ PVC๋ฅผ ์ญ์ ํ๋ฉด PVC๋ ์ฆ์ ์ญ์ ๋์ง ์๊ณ Pod๊ฐ ์ฌ์ฉ๋์ง ์์ ๋๊น์ง ์ญ์ ๊ฐ ์ฐ๊ธฐ๋๋ค.
- PVC์ ๋ฐ์ธ๋ฉ ๋์ด์๋ PV๋ฅผ ์ญ์ ํ๋ฉด PV๋ ์ฆ์ ์ญ์ ๋์ง ์๊ณ PVC์ ๋ฐ์ธ๋ฉ ๋์ง ์์ ๋๊น์ง ์ญ์ ๊ฐ ์ฐ๊ธฐ๋๋ค.
- ๋ด๊ฐ ์ฒ์์ ํ๋ ค๊ณ ํ๋ ๊ฒ์ ์ฌ์ค persistent volume ํ๋๋ฅผ ๋๊ณ pvc๋ pod๊ฐ ๋ฐ๋์ด๋ ๊ณ์ ์ฌ์ฉํ ์ ์๊ฒ๋ ํ๋ ๊ฒ์ด์๋ค. ๊ทธ๋ฐ๋ฐ stateful set์ ๊ทธ๋ ๊ฒ ๋์ํ์ง๋ ์๊ณ , PV์ PVC๊ฐ ํ๋์ ์ง๊ฟ์ผ๋ก ์์์ ์ผ๋ก ๋ฌถ์ธ๋ค.
- pod๋ง๋ค pv์ pvc๊ฐ ์๋ก ์๊ธด๋ค๋ฉด pod๋ฅผ ๊ต์ฒดํ์ ๋ ์ธ๋ถ์์ ๊ธฐ์กด ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์ง ์์๊น?
- stateful set์ pod๊ฐ ์ญ์ ๋์ด๋ PVC์ PV๋ฅผ ์ญ์ ํ์ง ์๋๋ค.
- ์ด์ ๊ณผ ๋์ผํ ์ด๋ฆ์ ์ pod๋ฅผ ์์ฑํ๋ค๋ฉด ์ pod๋ ๊ธฐ์กด PVC๋ฅผ ์ฐพ์ ๋ง์ดํธํ๋ค.
- ๊ทธ๋ผ ์ด์ ์ DB์ ์ ๊ทผํ ์ ์๋ค.
B. StatefulSet
- ๋ฐ๋ก yaml ํ์ผ์ ๋ณด๋ฉด์ ๋ถ์ํด๋ณด์.
# StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgresql
namespace: web
spec:
serviceName: postgresql
replicas: 1
selector:
matchLabels:
app: postgresql
template:
metadata:
labels:
app: postgresql
spec:
containers:
- name: postgres
image: postgres:15
env:
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: postgres-credentials
key: POSTGRES_USER
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-credentials
key: POSTGRES_PASSWORD
ports:
- containerPort: 5432
volumeMounts:
- name: postgres-data
mountPath: "/data/postgres"
subPath: postgresql-data
- name: pg-config
mountPath: "/docker-entrypoint-initdb.d"
volumes:
- name: pg-config
configMap:
name: postgres-initdb-config
volumeClaimTemplates:
- metadata:
name: postgres-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
- Deployment ์ ๋ค๋ฅธ ๋ถ๋ถ์ volumeMounts, volumes, volumeClaimTemplates ๋ถ๋ถ์ด๋ค.
volumeClaimTemplates
- pod๊ฐ ์๋ก ์๊ธธ ๋๋ง๋ค ์ด ํ ํ๋ฆฟ๋๋ก pvc๋ฅผ ๋ง๋ค์ด์ฃผ์ธ์~ ํ๋ ๊ฒ์ด๋ค.
- pvc๊ฐ ์์ฑ๋๊ณ pv๊ฐ pvc์ ๋ง์ถฐ ์์ฑ๋๋ค.
- pv access mode๋ read write once์ด๋ค. ํ๋์ pv์ ํ๋์ pvc๋ง ๋ถ์ผ ์ ์๊ธฐ ๋๋ฌธ์!
- resources.requests์์๋ ์ ์ฅ๊ณต๊ฐ 5Gi๋ฅผ ์์ฒญํ๋ค.
volumeMounts / volumes
- volumeMounts๋ฅผ ๋จผ์ ๋ณด์. ๋ง ๊ทธ๋๋ก ์กด์ฌํ๋ volume์ ์ด ์ปจํ ์ด๋์ ๋ง์ดํธ ํ๋ค๋ ๋ป์ด๋ค.
- ์ด๋ฆ์ด postgres-data ์ด๋ค. ์ด๋ volumeClaimTemplate ์์ ์ง์ ํ ์ด๋ฆ๊ณผ ๊ฐ๋ค. ๊ทธ๋ฌ๋๊น ์ด ํํธ์์ ๋ง์ดํธํ๋ ๋ณผ๋ฅจ์ด PV๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
- mountPath์ subPath๋ ์ปจํ ์ด๋ ๋ด ์ด๋์ volume์ mountํ ๊ฒ์ธ์ง๋ฅผ ์ ํ๋ค.
- ๊ทธ ๋ค์ volume์ ์ด๋ฆ์ pg-config ์ด๊ณ , ์ด๋ ์๋ spec.template.spec.volumes์ ์๋ volume๊ณผ ๊ฐ๋ค.
- ์ด ๊ฒฝ์ฐ์๋ pv๊ฐ ์๋๊ณ , ์ด๋ค ์ ์ฅ๊ณต๊ฐ ๋ฑ์ /docker-entrypoint-initdb.d ๋ก ๋ง์ดํธํ๋ ๊ฒ์ด๋ค.
C. Config Map
- configMap์ key-value ํํ๋ก ์ด๋ฃจ์ด์ง ๊ธฐ๋ฐ์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ค๋ธ์ ํธ์ด๋ค.
- ์ฒซ ๋ฒ์งธ ํฌ์คํธ์์ postgresql์ custom docker image๋ฅผ ๋ง๋ค์๋ ์ด์ ์ธ init.sql ์ ๋์์ ์ ์ฅํด๋๊ธฐ ์ํด์ configMap์ ์ฌ์ฉํ ๊ฒ์ด๋ค.
- init.sql ์ ๋ค์ ๋ณด์.
// init.sql
DO
$$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg.catalog.pg_roles WHERE rolename == 'dain') THEN
CREATE ROLE dain WITH LOGIN PASSWORD 'password';
END IF;
END
$$;
DO
$$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_database WHERE datname == 'energy_monitor') THEN
CREATE DATABASE energy_monitor OWNER dain;
END IF;
END
$$;
ALTER DATABASE energy_monitor OWNER TO dain;
- ์ด ํ์ผ์ ๊ทธ๋๋ก configMap ๋ฐ์ดํฐ๋ก ๋ง๋ค๋ ค๊ณ ํ์ ๋, ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์๋ค.
- rolname์ด๋ password์ ๊ฐ์ ๊ธฐ๋ฐ์ด ์ํธํ๋์ง ์๋ conigMap ํ์ผ์ ๊ทธ๋๋ก ๋ ธ์ถ
- CREATE DATABASE cannot run inside a transaction block ์ค๋ฅ ๋ฐ์
- ์ฒซ ๋ฒ์งธ ๋ฌธ์ ํด๊ฒฐ์ ์ํด rolename, password๋ก ์ง์ ํ ๋ด์ฉ๋ค์ secret ํํ๋ก ์ฎ๊ฒผ๋ค. ๊ธฐ๋ณธ ์ ์ ์ธ POSTGRES_USER, POSTGRES_PASSWORD ํ๊ฒฝ๋ณ์๋ก ๋ง๋ค๋ฉด ์๋ก ์ ์ ๋ฅผ ๋ง๋ค ํ์๊ฐ ์๋ค.
# Secret
apiVersion: v1
kind: Secret
metadata:
name: postgres-credentials
namespace: web
type: Opaque
stringData:
POSTGRES_USER: "dain"
POSTGRES_PASSWORD: "password"
- ๋ ๋ฒ์งธ ๋ฌธ์ ๋ CREATE DATABASE ๋ช ๋ น์ด๊ฐ ํธ๋์ญ์ ๋ธ๋ก ์์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ค.
- ์์์ ๋ง๋ค๋ ค๊ณ ํ๋ user๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ค์ ํ๊ธฐ ๋๋ฌธ์ ์ด์ ์ ์ ๊ฐ ์๋์ง ํ์ธํ ํ์๊ฐ ์์ผ๋ฏ๋ก, DO~ ๋ก ์์ํ๋ ํธ๋์ญ์ ๋ธ๋ก์์ ๋ถ๋ฆฌํด DB๊ฐ ์๋์ง๋ง ํ์ธํ๊ณ ์์ผ๋ฉด ์์ฑํ๋๋ก ํ๋ฉด ๋๋ค.
# Config Map
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-initdb-config
namespace: web
data:
pg-init-sql.sql: |
SELECT 'CREATE DATABASE energy_monitor OWNER dain'
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'energy_monitor')\gexec
- configMap์๋ spec ๋์ data / binaryData๊ฐ ์๊ณ , key-value ํํ๋ก ์ด๋ฃจ์ด์ง๋ค.
- configMap์ metadata.name์ volumes์์ ๊ทธ๋๋ก ์ด๋ค.
- ๋ค์ statefulset์์ configMap ๋ง์ดํธ ๋ถ๋ถ์ ๋ณด๋ฉด,
volumeMounts:
- name: postgres-data
mountPath: "/data/postgres"
subPath: postgresql-data
- name: pg-config
mountPath: "/docker-entrypoint-initdb.d"
volumes:
- name: pg-config
configMap:
name: postgres-initdb-config
- volumes์์ configMap type์ ์ง์ ํ๊ณ , configMap ์ด๋ฆ์ ๋ง๋ ๊ฒ์ ์จ์ค๋ค. volume์ ๋ณ์นญ๋ ์ ํ๋ค.
- volumeMounts์์ volume์ ์ ์ธํ ๋ณ์นญ์ name์ผ๋ก ์จ์ ์ด๋ค volume์ ๋ง์ดํธํ ๊ฒ์ธ์ง ํ์ ํ๊ณ , ์ด volume์ mountํ ๊ฒฝ๋ก๋ฅผ ์ ์ด์ฃผ๋ฉด ๋๋ค.
D. Service
- ๋ง์ง๋ง์ผ๋ก ์ง๋ ํฌ์คํธ์์ ํ๋ ๊ฒ๊ณผ ๋น์ทํ๊ฒ ์ด stateful set์ ์์ฒญ์ ๋ฐ์์ ์ ๋ฌํด์ค service๋ฅผ ๋์ฐ๋ฉด ๋๋ค.
- ์ด๋ฒ์๋ ์ธ๋ถ ๋จธ์ ์์ DB์ ์ง์ ์ ์ํ ์ผ์ ์๊ธฐ ๋๋ฌธ์ ํด๋ฌ์คํฐ ๋ด์์ ํต์ ํ ์ ์๋๋ก Cluster IP type์ผ๋ก ์ ์ธํด์ฃผ์๋ค.
# Service
apiVersion: v1
kind: Service
metadata:
name: postgresql
namespace: web
spec:
type: ClusterIP
selector:
app: postgresql
ports:
- name: tcp
port: 5432
targetPort: 5432
E. ๋์๋ณด๊ธฐ!
- ์ด์ ์ฌํ๊ป ๋ง๋ ๊ฒ๋ค์ GKE ํด๋ฌ์คํฐ์ ๋์๋ณผ ๊ฒ์ด๋ค.

- ์ ๋ถ๋ถ์์ ์ฐ๊ฒฐ ๋ฒํผ์ ๋๋ฅด๋ฉด CLI์ ์ฐ๊ฒฐํ ์ ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๊ณตํด์ค๋ค.
gcloud container clusters get-credentials <cluster-name> --region <region> --project <project-id>
- ๊ทธ๋ฆฌ๊ณ namespace๋ฅผ default ์๋๊ณ ๋ค๋ฅธ ๊ฑธ ์ผ์ผ๋ฉด kubectl create namespace <name> ์ผ๋ก ๋ง๋ค์.
- ์์๋ secret/configMap > DB > DB service > Web > Web Service ์์ผ๋ก ๋์์ผํ๋ค.
- ๊ทธ๋ฆฌ๊ณ kubernetes ๊ณต์ ๋ฌธ์์์ ๊ตฌ์ฑ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ณด๋ฉด ์๋ฏธ์ ๋ง๋ค๋ฉด ๊ฐ๋ฅํ ์ฐ๊ด๋ ์ค๋ธ์ ํธ๋ค์ ํ๋์ ํ์ผ์ ๋ชจ์ ๋๋๋ค. ๋๋ก๋ ์ฌ๋ฌ ๊ฐ์ ํ์ผ๋ณด๋ค ํ๋์ ํ์ผ์ด ๋ ๊ด๋ฆฌํ๊ธฐ ์ฝ๋ค. ๋ผ๊ณ ๋์ด์์ผ๋ฏ๋ก, ๋๋ ํฌ๊ฒ DB์ชฝ ํ์ผ 4๊ฐ๋ฅผ ํ๋๋ก ๋ฌถ๊ณ , Web์ชฝ ํ์ผ 2๊ฐ๋ฅผ ํ๋๋ก ๋ฌถ์๋ค. ์ ๋ฌธ์ ์๋์ ๊ฐ๋ค.
# Secret
apiVersion: v1
kind: Secret
metadata:
name: postgres-credentials
namespace: web
type: Opaque
stringData:
POSTGRES_USER: "dain"
POSTGRES_PASSWORD: "password"
---
# Config Map
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-initdb-config
namespace: web
data:
pg-init-sql.sql: |
SELECT 'CREATE DATABASE energy_monitor OWNER dain'
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'energy_monitor')\gexec
---
# StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgresql
namespace: web
spec:
serviceName: postgresql
replicas: 1
selector:
matchLabels:
app: postgresql
template:
metadata:
labels:
app: postgresql
spec:
containers:
- name: postgres
image: postgres:15
env:
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: postgres-credentials
key: POSTGRES_USER
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-credentials
key: POSTGRES_PASSWORD
ports:
- containerPort: 5432
volumeMounts:
- name: postgres-data
mountPath: "/data/postgres"
subPath: postgresql-data
- name: pg-config
mountPath: "/docker-entrypoint-initdb.d"
volumes:
- name: pg-config
configMap:
name: postgres-initdb-config
volumeClaimTemplates:
- metadata:
name: postgres-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
---
# Service
apiVersion: v1
kind: Service
metadata:
name: postgresql
namespace: web
spec:
type: ClusterIP
selector:
app: postgresql
ports:
- name: tcp
port: 5432
targetPort: 5432

- ์ด๋ ๊ฒ ๋์ฐ๊ณ ๋๋ฉด ์ฌ๊ธฐ์ ๊ธฐ์์ ์ ๋์์ก๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค. ๋จผ์ ๋ช ๋ น์ค ๋๊ตฌ์์๋,
kubectl <type> -n <namespace>
- ์ด๋ ๊ฒ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ ๋ฆฌ์คํธ์ ์ํ ๋ฑ์ ํ์ธํ ์ ์๋ค.

- google cloud ์ฝ์ ํํ์ด์ง์์๋ ํฌ๊ฒ ์ํฌ๋ก๋์ ๋ณด์ ๋น๋ฐ ๋ฐ ConfigMap, ๊ฒ์ดํธ์จ์ด, ์๋น์ค, ์ธ๊ทธ๋ ์ค ํ์ด์ง์์ ํ์ธ์ด ๊ฐ๋ฅํ๋ค.





- ์ด์ ์น ์ํฌ๋ก๋๋ ์ฌ๋ ค๋ณด๊ฒ ๋ค.
- ํฉ์น ์ ๋ฌธ์ ์๋์ ๊ฐ๋ค.
# Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: server
namespace: web
labels:
app: server
spec:
replicas: 1
selector:
matchLabels:
app: server
template:
metadata:
name: server
labels:
app: server
spec:
containers:
- name: server
image: mysterias/web-service:251103-0.0
env:
- name: db_user
valueFrom:
secretKeyRef:
name: postgres-credentials
key: POSTGRES_USER
- name: db_password
valueFrom:
secretKeyRef:
name: postgres-credentials
key: POSTGRES_PASSWORD
- name: db_host
value: "postgresql"
- name: db_port
value: "5432"
- name: db_name
value: "energy_monitor"
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: postgres-credentials
key: POSTGRES_USER
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-credentials
key: POSTGRES_PASSWORD
ports:
- containerPort: 8080
name: server
---
# Service
apiVersion: v1
kind: Service
metadata:
name: server-svc
namespace: web
labels:
app: server
spec:
selector:
app: server
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: loadBalancer



- ์ต์ข ์ ์ผ๋ก web service๊ฐ ์ ์์ ์ผ๋ก ์ฌ๋ผ๊ฐ๋ค๋ฉด, ์๋น์ค๊ฐ ํ ๋น๋ฐ์ ์ธ๋ถ ์๋ํฌ์ธํธ ip์ ์ง์ ํ ํฌํธ์์ ์ ์ํด์ ์น ์ฌ์ดํธ๋ฅผ ๋ณผ ์ ์๋ค!
728x90