๋ถํธํ์ด ๊ณต์ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค (์๋ฒ์ฌ์ด๋ ์ฉ)
Python ์ธ์ด๋ก ์์ฑ๋ ์ดํ๋ฆฌ์ผ์ด์ , ํ๋ ์์ํฌ ๋ฑ์์ ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค.
- PG ๊ฒฐ์ ์ฐฝ ์ฐ๋์ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ํ๋ฉ๋๋ค. (Javascript, Android, iOS, React Native, Flutter ๋ฑ)
- ๊ฒฐ์ ๊ฒ์ฆ ๋ฐ ์ทจ์, ๋น๋งํค ๋ฐ๊ธ, ๋ณธ์ธ์ธ์ฆ ๋ฑ์ ์ํ์ ์๋ฒ์ฌ์ด๋์์ ์งํ๋ฉ๋๋ค. (Java, PHP, Python, Ruby, Node.js, Go, ASP.NET ๋ฑ)
- ์ฌ์ฉํ๊ธฐ
- 1. ํ ํฐ ๋ฐ๊ธ
- 2. ๊ฒฐ์ ๋จ๊ฑด ์กฐํ
- 3. ๊ฒฐ์ ์ทจ์ (์ ์ก ์ทจ์ / ๋ถ๋ถ ์ทจ์)
- 4. ์๋/๋น๋ง/์ ๊ธฐ ๊ฒฐ์
- 5. ํ์ ํ ํฐ ๋ฐ๊ธ์์ฒญ
- 6. ์๋ฒ ์น์ธ ์์ฒญ
- 7. ๋ณธ์ธ ์ธ์ฆ ๊ฒฐ๊ณผ ์กฐํ
- 8. ์์คํฌ๋ก ์ด์ฉ์ PG์ฌ๋ก ๋ฐฐ์ก์ ๋ณด ๋ณด๋ด๊ธฐ
- 9-1. ํ๊ธ์์์ฆ ๋ฐํํ๊ธฐ
- 9-2. ํ๊ธ์์์ฆ ๋ฐํ ์ทจ์
- 9-3. ๋ณ๊ฑด ํ๊ธ์์์ฆ ๋ฐํ
- 9-4. ๋ณ๊ฑด ํ๊ธ์์์ฆ ๋ฐํ ์ทจ์
- Example ํ๋ก์ ํธ
- Documentation
- ๊ธฐ์ ๋ฌธ์
- License
pip install bootpay-backend
from bootpay_backend import BootpayBackend
bootpay = BootpayBackend('5b8f6a4d396fa665fdc2b5ea', 'rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw=')
token = bootpay.get_access_token()
if 'error_code' not in token:
# ํ ํฐ ๋ฐ๊ธ ์ฑ๊ณต
print(token)๋ถํธํ์ด์ ์๋ฒ๊ฐ ํต์ ์ ํ๊ธฐ ์ํด์๋ ๋ถํธํ์ด ์๋ฒ๋ก๋ถํฐ ํ ํฐ์ ๋ฐ๊ธ๋ฐ์์ผ ํฉ๋๋ค.
๋ฐ๊ธ๋ ํ ํฐ์ 30๋ถ๊ฐ ์ ํจํ๋ฉฐ, ์ต์ด ๋ฐ๊ธ์ผ๋ก๋ถํฐ 30๋ถ์ด ์ง๋ ๊ฒฝ์ฐ ํ ํฐ ๋ฐ๊ธ ํจ์๋ฅผ ์ฌํธ์ถ ํด์ฃผ์
์ผ ํฉ๋๋ค.
bootpay = BootpayBackend('5b8f6a4d396fa665fdc2b5ea', 'rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw=')
token = bootpay.get_access_token()
if 'error_code' not in token:
# ํ ํฐ ๋ฐ๊ธ ์ฑ๊ณต
print(token)๊ฒฐ์ ์ฐฝ ๋ฐ ์ ๊ธฐ๊ฒฐ์ ์์ ์น์ธ/์ทจ์๋ ๊ฒฐ์ ๊ฑด์ ๋ํ์ฌ ์ฌ๋ฐ๋ฅธ ๊ฒฐ์ ๊ฑด์ธ์ง ์๋ฒ๊ฐ ํต์ ์ผ๋ก ๊ฒฐ์ ๊ฒ์ฆ์ ํฉ๋๋ค.
response = bootpay.receipt_payment('62b2c3c2d01c7e001bc20b10')
if 'error_code' not in response:
# ์์ฒญ ์ฑ๊ณต
print(response)price๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ์ ์ก์ทจ์ ๋ฉ๋๋ค.
- ํด๋ํฐ ๊ฒฐ์ ์ ๊ฒฝ์ฐ ์ด์๋ ๊ฒฝ์ฐ ์ดํต์ฌ ์ ์ฑ ์ ์ทจ์๋์ง ์์ต๋๋ค
- ์ ์ฐ๋ฐ์ผ์ค ๊ธ์ก๋ณด๋ค ์ทจ์๊ธ์ก์ด ํด ๊ฒฝ์ฐ PG์ฌ ์ ์ฑ ์ ์ทจ์๋์ง ์์ ์ ์์ต๋๋ค. ์ด๋ PG์ฌ์ ๋ฌธ์ํ์๋ฉด ๋๊ฒ ์ต๋๋ค.
- ๊ฐ์๊ณ์ข์ ๊ฒฝ์ฐ CMS ํน์ฝ์ด ๋์ด์์ง ์์ผ๋ฉด ์ทจ์๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ฒฐ์ ํ ์คํธ์์๋ ๊ฐ์๊ณ์ข๋ก ํ ์คํธ ํ์ง ์๊ธธ ์ถ์ฒํฉ๋๋ค.
๋ถ๋ถ์ทจ๋ ์นด๋๋ก ๊ฒฐ์ ๋ ๊ฑด๋ง ๊ฐ๋ฅํ๋ฉฐ, ์ผ๋ถ PG์ฌ๋ง ์ง์ํฉ๋๋ค. ์์ฒญ์ price์ ๊ธ์ก์ ์ง์ ํ์๋ฉด ๋๊ฒ ์ต๋๋ค.
- (์ง์๊ฐ๋ฅ PG์ฌ: ์ด๋์์ค, kcp, ๋ค๋ , ํ์ด๋ ํฐ, ๋์ด์คํ์ด, ์นด์นด์คํ์ด, ํ์ด์ฝ)
๊ฐํน ๊ฐ๋ฐ์ฌ์์ ์ค์๋ก ์ฌ๋ฌ๋ฒ ๋ถ๋ถ์ทจ์๋ฅผ ๋ณด๋ด์ ์ฌ๋ฌ๋ฒ ์ทจ์๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋๋ฌธ์, ๋ถํธํ์ด์์๋ ๋ถ๋ถ์ทจ์ ์ค๋ณต ์์ฒญ์ ๋ง๊ธฐ ์ํด cancel_id ๋ผ๋ ํ๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค. cancel_id๋ฅผ ์ง์ ํ์๋ฉด, ํด๋น ๊ฑด์ ๋ํด ์ค๋ณต ์์ฒญ๋ฐฉ์ง๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
response = bootpay.cancel_payment(
receipt_id='62ba5a3cd01c7e001fb45c46',
cancel_id=str(uuid.uuid4()),
cancel_username='test',
cancel_message='test๊ฒฐ์ ์ทจ์'
)
if 'error_code' not in response:
# ์์ฒญ ์ฑ๊ณต
print(response)REST API ๋ฐฉ์์ผ๋ก ๊ณ ๊ฐ์ผ๋ก๋ถํฐ ์นด๋ ์ ๋ณด๋ฅผ ์ ๋ฌํ์ฌ, PG์ฌ์๊ฒ ๋น๋งํค๋ฅผ ๋ฐ๊ธ๋ฐ์ ์ ์์ต๋๋ค. ๋ฐ๊ธ๋ฐ์ ๋น๋งํค๋ฅผ ์ ์ฅํ๊ณ ์๋ค๊ฐ, ์ํ๋ ์์ , ์ํ๋ ๊ธ์ก์ ๊ฒฐ์ ์น์ธ ์์ฒญํ์ฌ ์ข ๋ ์์ ๋ก์ด ๊ฒฐ์ ์๋๋ฆฌ์ค์ ์ ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋น์ธ์ฆ ์ ๊ธฐ๊ฒฐ์ (REST API) ๋ฐฉ์์ ์ง์ํ๋ PG์ฌ๋ง ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
response = bootpay.request_subscribe_billing_key(
pg='๋์ด์คํ์ด',
order_name='ํ
์คํธ๊ฒฐ์ ',
subscription_id=str(time.time()),
card_no="5570********1074", # ์นด๋๋ฒํธ
card_pw="**", # ์นด๋ ๋น๋ฐ๋ฒํธ 2์๋ฆฌ
card_identity_no="******", # ์นด๋ ์์ฃผ ์๋
์์ผ
card_expire_year="**", # ์นด๋ ์ ํจ๊ธฐ๊ฐ ๋
2์๋ฆฌ
card_expire_month="**", # ์นด๋ ์ ํจ๊ธฐ๊ฐ ์ 2์๋ฆฌ
)
if 'error_code' not in response:
# ์์ฒญ ์ฑ๊ณต
print(response)REST API ๋ฐฉ์์ผ๋ก ๊ณ ๊ฐ์ ๊ณ์ข ์ ๋ณด๋ฅผ ์ ๋ฌํ์ฌ, PG์ฌ์๊ฒ ๋น๋งํค ๋ฐ๊ธ์ ์์ฒญํฉ๋๋ค. ์์ฒญ ํ ๋น๋งํค๊ฐ ๋ฐ๋ก ๋ฐ๊ธ๋์ง ์๊ณ , ์ถ๊ธ๋์ ํ์ธ ์ ์ฐจ๊น์ง ์งํํด์ผ ๋น๋งํค๊ฐ ๋ฐ๊ธ๋ฉ๋๋ค. ๋จผ์ ๋น๋งํค๋ฅผ ์์ฒญํฉ๋๋ค.
response = bootpay.request_subscribe_automatic_transfer_billing_key(
pg="๋์ด์คํ์ด",
order_name='ํ
์คํธ๊ฒฐ์ ',
subscription_id=str(time.time()),
price=1000,
username='ํ๊ธธ๋',
bank_name='๊ตญ๋ฏผ',
bank_account='67560123412342472',
identity_no='901014',
cash_receipt_identity_no='01012341234',
phone='01012341234'
)์ดํ ๋น๋งํค ๋ฐ๊ธ ์์ฒญ์ ์๋ต๋ฐ์ receipt_id๋ก, ์ถ๊ธ ๋์ ํ์ธ์ ์์ฒญํฉ๋๋ค.
response = bootpay.publish_automatic_transfer_billing_key(
receipt_id="66542d4be86c1eedf6b17965",
)๋ฐ๊ธ๋ ๋น๋งํค๋ก ์ํ๋ ์์ ์ ์ํ๋ ๊ธ์ก์ผ๋ก ๊ฒฐ์ ์น์ธ ์์ฒญ์ ํ ์ ์์ต๋๋ค. ์์ก์ด ๋ถ์กฑํ๊ฑฐ๋ ๋๋ ์นด๋ ๋ฑ์ ํน๋ณํ ๊ฑด์ด ์๋๋ฉด PG์ฌ์์ ๊ฒฐ์ ๋ฅผ ๋ฐ๋ก ์น์ธํฉ๋๋ค.
response = bootpay.request_subscribe_card_payment(
billing_key='62b2c3cfd01c7e001cc20a84',
order_name='ํ
์คํธ๊ฒฐ์ ',
order_id=str(time.time()),
price=100,
user={
"phone": '01000000000',
"username": 'ํ๊ธธ๋',
"email": 'test@bootpay.co.kr'
}
)
if 'error_code' not in response:
# ์์ฒญ ์ฑ๊ณต
print(response)์ํ๋ ์์ ์ 4-1๋ก ๊ฒฐ์ ์น์ธ ์์ฒญ์ ๋ณด๋ด๋ ๋์ง๋ง, ๋น๋งํค ๋ฐ๊ธ ์ดํ์ ๋ฐ๋ก ๊ฒฐ์ ์์ฝ ํ ์ ์์ต๋๋ค. (๋น๋งํค๋น ์ต๋ 10๊ฑด)
response = bootpay.subscribe_payment_reserve(
billing_key='[ ๋น๋งํค ]',
order_name='ํ
์คํธ๊ฒฐ์ ',
order_id=str(time.time()),
price=1000,
user={
"phone": '01000000000',
"username": 'ํ๊ธธ๋',
"email": 'test@bootpay.co.kr'
},
reserve_execute_at=(datetime.datetime.now() + datetime.timedelta(seconds=5)).astimezone().strftime(
'%Y-%m-%dT%H:%M:%S%z')
)
if 'error_code' not in response:
# ์์ฒญ ์ฑ๊ณต
print(response)์์ฝ์ ์๋ต๋ฐ์ reserveId๋ก ์์ฝ๋ ๊ฑด์ ์กฐํํฉ๋๋ค.
response = bootpay.subscribe_payment_reserve_lookup('6490149ca575b40024f0b70d')
print(response)์์ฝ์ ์๋ต๋ฐ์ reserveId๋ก ์์ฝ๋ ๊ฑด์ ์ทจ์ํฉ๋๋ค.
result = bootpay.cancel_subscribe_reserve(
'612debc70d681b0039e6133d'
)
if 'error_code' not in response:
# ์์ฒญ ์ฑ๊ณต
print(response)๋ฐ๊ธ๋ ๋น๋งํค๋ฅผ ์ญ์ ํฉ๋๋ค. ์ญ์ ํ๋๋ผ๋ ์์ฝ๋ ๊ฒฐ์ ๊ฑด์ ์ทจ์๋์ง ์์ต๋๋ค. ์์ฝ๋ ๊ฒฐ์ ๊ฑด ์ทจ์๋ฅผ ์ํ์๋ฉด ์์ฝ ์ทจ์ํ๊ธฐ๋ฅผ ์์ฒญํ์ ์ผ ํฉ๋๋ค.
response = bootpay.destroy_billing_key(
billing_key='62b2c3cfd01c7e001cc20a85',
)
if 'error_code' not in response:
# ์์ฒญ ์ฑ๊ณต
print(response)ํด๋ผ์ด์ธํธ์์ ๋น๋งํค ๋ฐ๊ธ์, ๋ณด์์ ํด๋ผ์ด์ธํธ ์ด๋ฒคํธ์ ๋น๋งํค๋ฅผ ์ ๋ฌํด์ฃผ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ด API๋ฅผ ํตํด ์กฐํํด์ผ ํฉ๋๋ค. ๋ค์์ ๋น๋งํค ๋ฐ๊ธ ์์ฒญํ๋ receiptId ๋ก ๋น๋งํค๋ฅผ ์กฐํํฉ๋๋ค.
response = bootpay.lookup_subscribe_billing_key('62b2c3c2d01c7e001bc20b10')
if 'error_code' not in response:
# ์์ฒญ ์ฑ๊ณต
print(response)์๋๋ billingKey๋ก ์กฐํํฉ๋๋ค.
response = bootpay.lookup_billing_key('66542dfb4d18d5fc7b43e1b6')
print(response)ใ ใ ํ์ด ์ฌ์ฉ์ ์ํด ๊ฐ๋งน์ ํ์์ ํ ํฐ์ ๋ฐ๊ธํฉ๋๋ค. ๊ฐ๋งน์ ์ ํ์์ ๊ณ ์ ๋ฒํธ๋ฅผ ๊ด๋ฆฌํด์ผํฉ๋๋ค. ์ด ํ ํฐ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํด๋ผ์ด์ธํธ์์ ๊ฒฐ์ ์์ฒญ(payload.user_token) ํ์๋ฉด ๋๊ฒ ์ต๋๋ค.
result = bootpay.request_user_token({
'user_id': '12341-234',
'email': 'test@email.com',
'name': 'ํ๊ธธ๋',
'gender': '1',
'birth': '901014',
'phone': '01012341234'
})
if 'error_code' not in token:
# ์์ฒญ ์ฑ๊ณต
print(response)๊ฒฐ์ ์น์ธ ๋ฐฉ์์ ํด๋ผ์ด์ธํธ ์น์ธ ๋ฐฉ์๊ณผ, ์๋ฒ ์น์ธ ๋ฐฉ์์ผ๋ก ์ด 2๊ฐ์ง๊ฐ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ ์น์ธ ๋ฐฉ์์ pythonscript๋ native ๋ฑ์์ confirm ํจ์์์ ์งํํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค๋ง, ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์๋ฒ ์น์ธ ๋ฐฉ์์ด ํ์ํ ์ ์์ต๋๋ค.
ํ์ํ ์ด์
- 100% ์์ ์ ์ธ ๊ฒฐ์ ํ ๊ณ ๊ฐ ์๋ด๋ฅผ ์ํด - ํด๋ผ์ด์ธํธ์์ PG๊ฒฐ์ ์งํ ํ ์น์ธ ์๋ฃ๋ ๋ onDone์ด ์ํ๋์ง ์์ (์ธํฐ๋ท ํ๊ฒฝ ๋ฑ), ๊ฒฐ์ ์ดํ ๊ณ ๊ฐ์๊ฒ ์๋ดํ์ง ๋ชปํ ์ ์์ต๋๋ค
- ๋จ์ผ ํธ๋์ญ์ ์ ๊ฐ๋ ์ด ํ์ํ ๊ฒฝ์ฐ - ์ฌ๊ณ ํ์ ์ด ์ค์ํ ์ปค๋จธ์ค๋ฅผ ์ด์ํ ๊ฒฝ์ฐ ํธ๋์ญ์ ๊ฐ๋ ์ด ํ์ํ ์ ์๊ฒ ์ผ๋ฉฐ, ์ด๋ฅผ ์ํด์๋ ์๋ฒ ์น์ธ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
result = bootpay.confirm_payment(
receipt_id='612df0250d681b001de61de6'
)
if 'error_code' not in token:
# ์์ฒญ ์ฑ๊ณต
print(response)๋ค๋ ๋ณธ์ธ์ธ์ฆ ํ ๊ฒฐ๊ณผ๊ฐ์ ์กฐํํฉ๋๋ค. ๋ค๋ ๋ณธ์ธ์ธ์ฆ์์ ํต์ ์ฌ, ์ธ๊ตญ์ธ์ฌ๋ถ, ์ ํ๋ฒํธ ์ด 3๊ฐ์ง ์ ๋ณด๋ ๋ค๋ ์ ์ถ๊ฐ๋ก ์์ฒญํ์ ์ผ ๋ฐ์ผ์ค ์ ์์ต๋๋ค.
result = bootpay.certificate(
receipt_id='612df0250d681b001de61de6'
)
if 'error_code' not in token:
# ์์ฒญ ์ฑ๊ณต
print(response)- (์์คํฌ๋ก ์ด์ฉ์) PG์ฌ๋ก ๋ฐฐ์ก์ ๋ณด ๋ณด๋ด๊ธฐ ํ๊ธ ๊ฑฐ๋์ ํํด ๊ตฌ๋งค์์ ์์ ๊ฑฐ๋๋ฅผ ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ํ๋งค์์ ๊ตฌ๋งค์์ ์จ๋ผ์ธ ์ ์์๊ฑฐ๋๊ฐ ์ํํ๊ฒ ์ด๋ฃจ์ด์ง ์ ์๋๋ก ์ค๊ณํด์ฃผ๋ ๋งค๋งค๋ณดํธ์๋น์ค์ ๋๋ค. ๊ตญ๋ด๋ฒ์ ๋ฐ๋ผ ์ ์์๊ฑฐ๋์์ ๋ฐ๋์ ์ ์ฉ์ด ๋์ด ์์ด์ผํฉ๋๋ค. PG์์๋ ์์คํฌ๋ก ๊ฒฐ์ ๋ฅผ ์ง์ํ๋ฉฐ, ์์คํฌ๋ก ๊ฒฐ์ ์ฌ์ฉ์ ์ํ์๋ฉด PG์ฌ ๊ฐ๋งน์์ ์์คํฌ๋ก๊ฒฐ์ ๋ฅผ ๋ฏธ๋ฆฌ ์๊ธฐํ๊ณ ๋์ ์งํ์ ํ์๋ ๊ฒ์ด ์์ํฉ๋๋ค.
PG์ฌ๋ก ๋ฐฐ์ก์ ๋ณด( ์ด๋์์ค, KCP๋ง ์ง์ )๋ฅผ ๋ณด๋ด์ ์์คํฌ๋ก ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ API ์ ๋๋ค.
response = bootpay.shipping_start(
receipt_id="62a946aad01c7e001b7dc20b",
tracking_number='3989838',
delivery_corp='CJ๋ํํต์ด',
user={
"phone": '01000000000',
"username": 'ํ๊ธธ๋',
"address": "์์ธํน๋ณ์ ์ข
๋ก๊ตฌ",
"zipcode": "039899"
}
)
if 'error_code' not in token:
# ์์ฒญ ์ฑ๊ณต
print(response)bootpay api๋ฅผ ํตํด ๊ฒฐ์ ๋ ๊ฑด์ ๋ํ์ฌ ํ๊ธ์์์ฆ์ ๋ฐํํฉ๋๋ค.
response = bootpay.cash_receipt_publish_on_receipt(
receipt_id='62e0f11f1fc192036b1b3c92',
username='ํ
์คํธ',
email='test@bootpay.co.kr',
phone='01000000000',
identity_no='01000000000',
cash_receipt_type='์๋๊ณต์ '
)
if 'error_code' not in token:
# ์์ฒญ ์ฑ๊ณต
print(response)9-1์ ํตํด ๋ฐํํ ํ๊ธ์์์ฆ์ ์ทจ์ํฉ๋๋ค.
response = bootpay.cash_receipt_cancel_on_receipt(
receipt_id='62e0f11f1fc192036b1b3c92',
)
if 'error_code' not in token:
# ์์ฒญ ์ฑ๊ณต
print(response)๋ถํธํ์ด ๊ฒฐ์ ์ ์๊ด์์ด ๊ธ์ก, ์ํ๋ช , ํ๊ธ์์์ฆ ๋ฐํ์ ๋ณด ๋ฑ์ ๋ณด๋ด ํ๊ธ์์์ฆ์ ๋ฐํํ๋ API ์ ๋๋ค
response = bootpay.request_cash_receipt(
pg='ํ ์ค',
price=1000,
order_name='ํ
์คํธ',
cash_receipt_type='์๋๊ณต์ ',
user={
"username": '๋ถํธํ์ด',
"phone": '01000000000',
"email": "bootpay@bootpay.co.kr"
},
identity_no='01000000000',
purchased_at=datetime.datetime.now().astimezone().strftime(
'%Y-%m-%dT%H:%M:%S%z'),
order_id=str(time.time())
)
if 'error_code' not in token:
# ์์ฒญ ์ฑ๊ณต
print(response)9-3์ ํตํด ๋ฐํํ ํ๊ธ์์์ฆ์ ์ทจ์ํฉ๋๋ค.
response = bootpay.cancel_cash_receipt(
receipt_id='62f20fc21fc192036b4f6f89',
cancel_username='์์คํ
',
cancel_message='ํ
์คํธ'
)
if 'error_code' not in token:
# ์์ฒญ ์ฑ๊ณต
print(response)์ ์ฉํ ์ํ ํ๋ก์ ํธ์ ์ฐธ์กฐํด์ฃผ์ธ์
๋ถํธํ์ด ๊ฐ๋ฐ๋งค๋ด์ผ์ ์ฐธ์กฐํด์ฃผ์ธ์
๋ถํธํ์ด ํํ์ด์ง ์ฐ์ธก ํ๋จ ์ฑํ ์ ํตํด ๊ธฐ์ ๋ฌธ์ ์ฃผ์ธ์!