์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- DFS
- ์๋ง์กด์น์๋น์ค
- ํ๋ธ๋ก
- ์๋ฐ์คํฌ๋ฆฝํธ
- erp
- ์ฝํ
- ๋ฐฑ์ค
- ๋ฐ์ดํฐ ๋ถ์
- ํ ์คํธ๋ถ์
- AI
- ๋ฆฌ์กํธ
- Git
- ํ ์คํธ๋ง์ด๋
- ์ฝ๋ฉํ ์คํธ
- ๊นํ๋ธ
- ๋น ๋ฐ์ดํฐ
- ๋ฐ์ดํฐ๋ถ์
- ๋ฅ๋ฌ๋
- AWS
- nlp
- ์์ฐ์ด์ฒ๋ฆฌ
- ์ธ๊ณต์ง๋ฅ
- ์๊ณ ๋ฆฌ์ฆ
- react
- tableau
- sap
- ํ๋ธ๋ฃจ
- ํ์ด์ฌ
- abap
- github
- Today
- Total
Hey Tech
AWS Lambda๋ฅผ ํ์ฉํ DyanamoDB ํ ์ด๋ธ ๋ฐ์ดํฐ ์ฝ์ /์กฐํ ๋ฐฉ๋ฒ ๋ณธ๋ฌธ
AWS Lambda๋ฅผ ํ์ฉํ DyanamoDB ํ ์ด๋ธ ๋ฐ์ดํฐ ์ฝ์ /์กฐํ ๋ฐฉ๋ฒ
Tony Park (ํ ๋) 2022. 6. 24. 16:44๐จ๐ป ๋ค์ด๊ฐ๋ฉฐ
๋ณธ ํํ ๋ฆฌ์ผ์ ์ ๋ฐ๋ผ์ค์๋ฉด AWS Lambda์์ DynamoDB ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ ๋ฐฉ๋ฒ๊ณผ ํ ์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๋ฐฉ๋ฒ์ ์์๊ฐ์ค ์ ์์ต๋๋ค.
๐ ๊ธฐ์ ์คํ
- AWS DynamoDB
- AWS Lambda (Runtime: Python 3.6)
- AWS IAM
๐ ๋ชฉ์ฐจ
1. AWS DynamoDB ์ธํ
1.1. DynamoDB ๊ฐ๋
1.2. DynamoDB ํ ์ด๋ธ ์์ฑ
2. AWS IAM ์ธํ
2.1. IAM ๊ฐ๋
2.2. IAM Role ๊ฐ๋
2.2. IAM Role ์์ฑ
3. AWS IAM ์ธํ
3.1. Lambda ๊ฐ๋
3.2. Lambda ํจ์ ์์ฑ
3.3. Lambda ์ฝ๋
4. ํ ์คํธ
4.1. ๋ฐ์ดํฐ ์ฝ์ ๋ก์ง ํ ์คํธ
4.2. ๋ฐ์ดํฐ ์กฐํ ๋ก์ง ํ ์คํธ
1. AWS DynamoDB ์ธํ
1.1. DynamoDB ๊ฐ๋
AWS DynamoDB๋ Key-Value ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ AWS์ NoSQL ์๋น์ค์ ๋๋ค. DynamoDB๋ ๊ท๋ชจ์ ์๊ด์์ด ๋๋ถ๋ถ 10ms ๋ด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฒ๋ฆฌํ ๋งํผ ์๋๊ฐ ๋งค์ฐ ๋น ๋ฅด๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ๋ํ, ์์ ๊ด๋ฆฌํ ์๋น์ค๋ผ๋ ํฐ ์ฅ์ ์ด ์์ต๋๋ค. ์ฆ, DB์ ์ฉ๋์ด๋ ํธ๋ํฝ์ด ๋์ด๋๋ฉด AWS์์ ์์์ ์ค์ผ์ผ๋ง ํด์ฃผ๋ฉฐ, DB ๋ฐฑ์ ๋ ์์์ ํด์ค๋๋ค. ์ฌ์ฉ์๊ฐ ์ค์ ํ ์ฑ๋ฅ๊ณผ ์ฌ์ฉํ ์ฉ๋์ ๋ํด์๋ง ๊ณผ๊ธ์ ๋ถ๊ณผํ๊ธฐ ๋๋ฌธ์ ๋น์ฉ ์ต์ ํ์๋ ๋์์ด ๋ฉ๋๋ค.
1.2. DynamoDB ํ ์ด๋ธ ์์ฑ
1) DynamoDB ์ฝ์ ์ ๊ทผ
AWS ๊ฒ์์ฐฝ์ DynamoDB๋ฅผ ๊ฒ์ํ์ ์ ์ฝ์์ ์ ๊ทผํฉ๋๋ค(๊ทธ๋ฆผ 1).
2) ํ ์ด๋ธ ์์ฑ ๋ฒํผ ํด๋ฆญ
ํ ์ด๋ธ ์์ฑ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค(๊ทธ๋ฆผ 2).
3) ํ ์ด๋ธ ์์ฑ ์ต์ ์ค์
ํ ์ด๋ธ ์ด๋ฆ, ํํฐ์ ํค, ์ ๋ ฌ ํค๋ฅผ ์ ๋ ฅํฉ๋๋ค(๊ทธ๋ฆผ 3). ๊ธฐ๋ณธ ํค(Primary Key)์ธ ํํฐ์ ํค(Partition Key)๋ ๋ฐ๋์ ์ค์ ํด์ผ ํ๋ฉฐ ์ ๋ ฌ ํค(Sort Key)๋ ์ ํ ์ฌํญ์ ๋๋ค. ๊ฐ๊ฐ์ ๋ํด ์์๋ด ๋๋ค.
- ํํฐ์
ํค(Partition Key)
- ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ํ ์ฅ์น๋ก์จ ๋ฐ์ดํฐ๊ฐ ๊ฒน์น๊ฑฐ๋ null, undefined ๊ฐ ํ ๋น ๋ถ๊ฐ(e.g., ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ)
- Hash ์์ฑ์ผ๋ก Hash Key๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ '๊ฐ๋ค' ํน์ '๊ฐ์ง ์๋ค'์ ๊ฐ์ ์ฐ์ฐ๋ง ๊ฐ๋ฅ
- ๊ธฐ๋ณธ ํค, Primary Key๋ผ๊ณ ๋ ๋ถ๋ฆ
- ์ ๋ ฌ ํค(Sort Key)
- Range ์์ฑ์ผ๋ก Sort Key๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ ๋น๊ต๋์ ํน์ '~๋ก ์์ํ๋'๊ณผ ๊ฐ์ ์ฐ์ฐ๋ง ๊ฐ๋ฅ
- DynamoDB์์ ๋ฐ์ดํฐ ์ ๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉ
๋๋จธ์ง๋ ๊ธฐ๋ณธ ์ค์ ์ผ๋ก ๋๊ณ ๋งจ ์๋์ ํ ์ด๋ธ์ ์์ฑํ๊ฒ ์ต๋๋ค. ์๊ฐ์ด ์กฐ๊ธ ์ง๋๋ฉด ์๋์ ๊ทธ๋ฆผ 4์ ๊ฐ์ด Table์ด ์์ฑ๋ฉ๋๋ค.
2. AWS IAM ์ธํ
2.1. IAM ๊ฐ๋
IAM์ Identity and Access Management์ ์ฝ์๋ก, ํน์ ์ฌ์ฉ์๋ ๊ทธ๋ฃน์ ์๋น์ค ํน์ ๋ฆฌ์์ค์ ๋ํ ์ ๊ทผ ๊ถํ์ ๊ด๋ฆฌํ๋ ์๋น์ค์
๋๋ค. IAM ์๋น์ค์ ๋ํ ๊ฐ๋
์ ์๋์ ํฌ์คํ
์ ์ฐธ๊ณ ํด ์ฃผ์๊ธธ ๋ฐ๋๋๋ค.
https://heytech.tistory.com/391?category=559266
2.2. IAM Role ๊ฐ๋
IAM Role(์ญํ )์ ํน์ AWS ์๋น์ค์ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ๋ ๋ณด์ ์ฆ๋ช ์์ ๋๋ค. ์ฝ๊ฒ ๋งํด, AWS ๋ด ์ด๋ค ์๋น์ค๋ฅผ ์ด์ฉํ ์ ์๋ ์๊ฒฉ์ ์๋ฏธํฉ๋๋ค.
2.3. IAM Role ์์ฑ
1) IAM ์ฝ์ ์ ๊ทผ
๊ฒ์์ฐฝ์ IAM์ ๊ฒ์ํ์ ์ IAM ์ฝ์์ ์ ๊ทผํฉ๋๋ค(๊ทธ๋ฆผ 5).
2) ์ญํ ์์ฑ
์๋์ ๊ทธ๋ฆผ 6์ฒ๋ผ, ์ข์ธก์ "์ญํ " ํ ์คํธ๋ฅผ ํด๋ฆญํ์ ํ, ์ฐ์ธก์ "์ญํ ๋ง๋ค๊ธฐ" ๋ฒํผ์ ๋๋ฌ์ฃผ์ธ์.
3) Lamda ์ ํ
์๋์ ๊ทธ๋ฆผ 7์ฒ๋ผ, ์ฌ์ฉ ์ฌ๋ก๋ Lambda๋ฅผ ์ฌ์ฉํ ์์ ์ด๋ฏ๋ก Lambda๋ฅผ ์ ํํ ํ, ํ๋จ์ "๋ค์" ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
4) ๊ถํ ์ถ๊ฐ
์๋์ ๊ทธ๋ฆผ 8์ฒ๋ผ, ๊ฒ์์ฐฝ์ dynamodb๋ฅผ ์ ๋ ฅ ํ ์ํฐ๋ฅผ ์น์ ํ, ์๋์ AmazonDyanmoDBfullAccess ๊ถํ์ ์ฒดํฌํ์๊ณ ์๋์ "๋ค์" ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
5) ์ญํ ์ด๋ฆ ์ค์
์๋์ ๊ทธ๋ฆผ 9์ฒ๋ผ, ์ญํ ์ด๋ฆ์ ์ค์ ํ์ ํ์ ๋งจ ํ๋จ์ "์ญํ ์์ฑ"์ ํด๋ฆญํฉ๋๋ค.
3. AWS Lambda ์ธํ
3.1. Lambda ๊ฐ๋
AWS Lambda๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ฝ๋(=ํจ์)๋ฅผ ์คํํ๊ณ ์ปดํจํฐ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ Serverless ์ปดํจํ
์๋น์ค์
๋๋ค. ์ฌ๊ธฐ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ฅผ ๋ค๋ฅธ ๋ง๋ก "trigger ๋์์ ๋" ๋๋ "ํจ์๋ฅผ ํธ์ถํ์ ๋"๋ผ๊ณ ๋ ํํํฉ๋๋ค. ์ฆ, 24์๊ฐ ์๋ฒ๊ฐ ๋์๊ฐ๋ AWS EC2์ ๋ฌ๋ฆฌ, AWS Lambda๋ ์ฌ์ฉ์๊ฐ ํจ์๋ฅผ ํธ์ถํ์ ๋๋ง ์ฝ๋๊ฐ ์คํ๋๋ ์๋น์ค์
๋๋ค. AWS Lambda์ ๋ํ ์์ธํ ๊ฐ๋
, ์ฅ๋จ์ , ์ฌ์ฉ๋ชฉ์ ์ ๋ํด ์๊ณ ์ถ์ผ์ ๋ถ์ ์๋์ ํฌ์คํ
์ ์ฐธ๊ณ ํด ์ฃผ์ธ์.
https://heytech.tistory.com/397
3.2. Lambda ํจ์ ์์ฑ
1) Lambda ์ฝ์ ์ ๊ทผ
AWS ํํ์ด์ง ๊ฒ์์ฐฝ์์ Lambda๋ฅผ ๊ฒ์ํ์ฌ Lambda ์ฝ์๋ก ์ด๋ํฉ๋๋ค(๊ทธ๋ฆผ 10).
2) Lambda ํจ์ ์์ฑ
"ํจ์ ์์ฑ" ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค(๊ทธ๋ฆผ 11).
3) Lambda ํจ์ ์์ฑ ์ต์
์๋์ ๊ทธ๋ฆผ 12์ฒ๋ผ ์๋์ ์ต์ ์ ์ ํํ์ ํ ๋งจ ํ๋จ์ "ํจ์ ์์ฑ" ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
- ํจ์ ์ด๋ฆ: ์ง๊ด์ ์ผ๋ก ์์๋ณผ ์ ์๋๋ก ์์ฑ
- ๋ฐํ์: Python 3.6
- ์คํ ์ญํ : "๊ธฐ์กด ์ญํ ์ฌ์ฉ" ์ ํ ํ ์์ ์์ฑํ IAM Role์ ์ ํ(DynamoDBfullAccess)
3.2. Lambda ์ฝ๋
1) ์ ์ฒด ์ฝ๋
import boto3
from datetime import datetime
class DatabaseAccess():
def __init__(self, TABLE_NAME):
# DynamoDB ์ธํ
self.dynamodb = boto3.resource('dynamodb')
self.table = self.dynamodb.Table(TABLE_NAME)
def get_data(self):
res = self.table.scan()
items = res['Items'] # ๋ชจ๋ item
count = res['Count'] # item ๊ฐ์
return items, count
def put_data(self, input_data):
self.table.put_item(
Item = input_data
)
print("Putting data is completed!")
def lambda_handler(event, context):
db_access = DatabaseAccess('resultTable')
if event['Method'] == 'POST':
input_data = {
"userID" : event['userID'],
"date" : event['date']
}
db_access.put_data(input_data)
elif event['Method'] == 'GET':
items, count = db_access.get_data()
print(f"items: {items}, count: {count}")
else:
print("Confirm the method!")
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('This is Hey Tech Blog!')
}
2) ์ฝ๋ ์ค๋ช
(1) ํจํค์ง import
import boto3
from datetime import datetime
- boto3
- AWS ์๋น์ค ์ก์ธ์ค์ฉ ํจํค์ง
- datetime
- ์๊ฐ ์ ๋ณด ์ถ๋ ฅ์ฉ
(2) DB Access ํด๋์ค
class DatabaseAccess():
def __init__(self, TABLE_NAME):
# DynamoDB ์ธํ
self.dynamodb = boto3.resource('dynamodb')
self.table = self.dynamodb.Table(TABLE_NAME)
def get_data(self):
res = self.table.scan()
items = res['Items'] # ๋ชจ๋ item
count = res['Count'] # item ๊ฐ์
return items, count
def put_data(self, input_data):
self.table.put_item(
Item = input_data
)
print("Putting data is completed!")
- ์์ฑ์ ํจ์
- ์์ TABLE_NAME: Access ํ DynamoDB ํ ์ด๋ธ ์ด๋ฆ
- get_data ํจ์
- ํ ์ด๋ธ์์ ๋ชจ๋ item ๋ฐ item ๊ฐ์ ๋ฐํ
- put_data ํจ์
- ํ ์ด๋ธ์ ์ ๋ฌ ๋ฐ์ ๋ฐ์ดํฐ ์ฝ์
(3) main ํจ์
def lambda_handler(event, context):
db_access = DatabaseAccess('resultTable')
if event['Method'] == 'POST':
input_data = {
"userID" : event['userID'],
"date" : event['date']
}
db_access.put_data(input_data)
elif event['Method'] == 'GET':
items, count = db_access.get_data()
print(f"items: {items}, count: {count}")
else:
print("Confirm the method!")
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('This is Hey Tech Blog!')
}
- db_access
- ์์ ์ ์ธํ DB Access ํด๋์ค ๊ฐ์ฒด ์์ฑ
- Access ํ Table ์ด๋ฆ ์ ๋ฌ
- Method == POST
- ๋ฐ์ดํฐ ์ฝ์ ๋ก์ง
- Mehtod == GET
- ๋ฐ์ดํฐ ์กฐํ ๋ก์ง
- default (Mehtod != POST and Method != GET)
- ์ง์ ํ method์ ํด๋นํ์ง ์๋ ๊ฒฝ์ฐ ์์ธ ์ฒ๋ฆฌ
4. ํ ์คํธ
๊ฐ๋จํ ํ ์คํธ๋ฅผ ์ํด Lambda ์ฝ์์์ ์๋์ ๊ทธ๋ฆผ 13์ฒ๋ผ, "ํ ์คํธ" ํญ์ผ๋ก ์ด๋ํฉ๋๋ค.
4.1. ๋ฐ์ดํฐ ์ฝ์ ๋ก์ง ํ ์คํธ
1) ์ด๋ฒคํธ ์์ฑ
๋จผ์ , ๋ฐ์ดํฐ ์ฝ์ ๋ก์ง ํ ์คํธ ์ด๋ฒคํธ๋ฅผ ์๋์ ๊ทธ๋ฆผ 14์ ๊ฐ์ ์์๋ก ์์ฑํฉ๋๋ค.
POST Method์์ ๋ช ์ํ์ฌ, ๋ฐ์ดํฐ ์ฝ์ ๋ก์ง์ ์คํ์ํค๋๋ก ํฉ๋๋ค. ํ ์ด๋ธ ์์ฑ ์ ํํฐ์ ํค์ ์ ๋ ฌ ํค ๊ฐ์ธ userID์ date Key์ ์ฝ์ ํ value๋ ์์๋ก ์ ๋ ฅํฉ๋๋ค. ๋ชจ๋ ์ ๋ ฅํ์ จ๋ค๋ฉด ํ ์คํธ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
2) ๋ก๊ทธ ํ์ธ
๊ทธ๋ฆผ 15์ ๊ฐ์ด, ๋ฐ์ดํฐ ์ฝ์ ๋ก์ง์ด ์ํ๋ ํ ์ถ๋ ฅํ๋๋ก ์์ฑํ print๋ฌธ์ด ์ ์คํ๋ ๊ฒ์ ํ์ธํ์ค ์ ์์ต๋๋ค.
3) DB ํ ์ด๋ธ ํ์ธ
์๋ ๊ทธ๋ฆผ 16๊ณผ ๊ฐ์ด ์ค์ ๋ก DynamoDB ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฝ์ ๋ ๊ฒ์ ํ์ธํ์ค ์ ์์ต๋๋ค.
4.2. ๋ฐ์ดํฐ ์กฐํ ๋ก์ง ํ ์คํธ
1) ์ด๋ฒคํธ ์์ฑ
๋ฐ์ดํฐ ์กฐํ ๋ก์ง ์ํ์ ์ํด Method Key ๊ฐ์ GET๋ก ์ค์ ํ ์ด๋ฒคํธ๋ฅผ ์คํ์์ผ ๋ด ๋๋ค(๊ทธ๋ฆผ 17).
2) ๋ก๊ทธ ํ์ธ
์๋์ ๊ทธ๋ฆผ 18์ฒ๋ผ, ๋ก์ง์ด ์ฑ๊ณต์ ์ผ๋ก ์ํํ์์ผ๋ฉฐ, ๋ก๊ทธ์ ํ ์ด๋ธ ๋ด ๋ฐ์ดํฐ์ ๋ฐ์ดํฐ ๊ฐ์๊ฐ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋ ๊ฒ์ ํ์ธํ์ค ์ ์์ต๋๋ค.
๐ ์ฐธ๊ณ ํ ๋งํ ํฌ์คํ
1. AWS ๊ธฐ๋ฐ ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ
1) ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (1) React ๊ธฐ๋ฐ Frontend ๊ฐ๋ฐ
2) ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (2) AWS IAM ์ญํ ์์ฑ
3) ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (3) AWS Lambda ์์ฑ
4) ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (4) AWS S3 ์์ฑ
5) ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (5) AWS API Gateway ์์ฑ
6) ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (6) AWS Lambda ํจ์ ์์ฑ
7) ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (7) Axios ๊ธฐ๋ฐ API Call
8) ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (8) ํ์ผ ์ ๋ก๋ ํ ์คํธ
9) ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (9) AWS S3 ๊ธฐ๋ฐ ์น ํธ์คํ
2. AWS ํ์ฉ ํฌ์คํ
1) AWS Lambda์ Docker๋ฅผ ํ์ฉํ ํ์ผ ์ ๋ก๋/์ฝ๊ธฐ ์์คํ ๊ตฌํ
2) AWS Lambda์์ AWS S3 ํ์ผ ์ฝ์ด์ค๋ ๋ฐฉ๋ฒ
3) AWS DynamoDB ๊ฐ๋ ๋ฐ ํ ์ด๋ธ ์์ฑ ์ ์ฐจ(ํํฐ์ ํค, ์ ๋ ฌ ํค ๊ฐ๋ )
4) AWS Lambda๋ฅผ ํ์ฉํ DyanamoDB ํ ์ด๋ธ ๋ฐ์ดํฐ ์ฝ์ /์กฐํ ๋ฐฉ๋ฒ
์ค๋์ AWS Lambda์์ DynamoDB ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ๊ณ ์กฐํํ๊ธฐ ์ํ ์ ๊ณผ์ ์ ์๊ฐํด ๋๋ ธ์ต๋๋ค.
ํฌ์คํ
๋ด์ฉ์ ์ค๋ฅ๊ฐ ์๊ฑฐ๋ ๋ณด์ํ ์ ์ด ์๋ค๋ฉด ์๋์ ๋๊ธ ๋จ๊ฒจ์ฃผ์๋ฉด ๊ฐ์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
๊ทธ๋ผ ์ค๋๋ ์ฆ๊ฒ๊ณ ๊ฑด๊ฐํ ํ๋ฃจ ๋ณด๋ด์๊ธธ ๋ฐ๋๋๋ค :)
๊ณ ๋ง์ต๋๋ค๐