[Django]Iamport 연동하기 - 4

Edit

[Django]Iamport 연동하기 - 4

이번에는 template인 html를 작성해보자. 여기서 IMP.init() 값은 아엠포트 관리자 페이지에서 가맹점 코드를 넣어주면 된다.

{% load staticfiles %}

<html lang="ko">
<head>
<meta charset="UTF-8">
<title>디제이비버title>

<script src="https://code.jquery.com/jquery-2.2.4.min.js">script>
<script type="text/javascript" src="https://service.iamport.kr/js/iamport.payment-1.1.1.js">script>
<script type="text/javascript">
$(function () {
var IMP = window.IMP;
// 가맹점 코드
IMP.init('imp68762150');

$('.charge-button').on('click', function (e) {
var amount = parseInt($('.charge-total #total').text().replace(',', '').slice(0, -1));
var type = $('.charge-type input:checked').val();
var merchant_id = AjaxStoreTransaction(e, amount, type);

if (merchant_id !== '') {
IMP.request_pay({
pg: 'html5_inicis',
escrow: false,
digital: true,
pay_method: type,
merchant_uid: merchant_id,
name: '포인트' + amount + '원 충전',
amount: amount
}, function (rsp) {
if (rsp.success) {
var msg = '결제가 완료되었습니다.';
msg += '고유ID : ' + rsp.imp_uid;
msg += '상점 거래ID : ' + rsp.merchant_uid;
msg += '결제 금액 : ' + rsp.paid_amount;
msg += '카드 승인번호 : ' + rsp.apply_num;
ImpTransaction(e, rsp.merchant_uid, rsp.imp_uid, rsp.paid_amount);
} else {
var msg = '결제에 실패하였습니다.';
msg += '에러내용 : ' + rsp.error_msg;
console.log(msg);
}
});
}
});
});

function AjaxStoreTransaction(e, amount, type) {
e.preventDefault();
var merchant_id = '';
var request = $.ajax({
method: "POST",
url: '{% url "point_checkout" %}',
async: false,
data: {
amount: amount,
type: type,
csrfmiddlewaretoken: '{{ csrf_token }}'
}
});
request.done(function (data) {
if (data.works) {
merchant_id = data.merchant_id;
}
});
request.fail(function (jqXHR, textStatus) {
if (jqXHR.status == 404) {
alert("페이지가 존재하지 않습니다.");
} else if (jqXHR.status == 403) {
alert("로그인 해주세요.");
} else {
alert("문제가 발생했습니다. 다시 시도해주세요.");
}
});
return merchant_id;
}

function ImpTransaction(e, merchant_id, imp_id, amount) {
e.preventDefault();
var request = $.ajax({
method: "POST",
url: '{% url "point_validation" %}',
async: false,
data: {
merchant_id: merchant_id,
imp_id: imp_id,
amount: amount,
csrfmiddlewaretoken: '{{ csrf_token }}'
}
});
request.done(function (data) {
if (data.works) {
}
});
request.fail(function (jqXHR, textStatus) {
if (jqXHR.status == 404) {
alert("페이지가 존재하지 않습니다.");
} else if (jqXHR.status == 403) {
alert("로그인 해주세요.");
} else {
alert("문제가 발생했습니다. 다시 시도해주세요.");
}
});
}
script>

head>
<body>
{% if user.is_authenticated %}
{{ user }}으로 접속되어 있습니다.
{% else %}
로그인 해주세요!
{% endif %}

<div class="charge-type">
<div class="billing-title">
결제방식
div>
<div class="billing-radio">
<label class="control control--radio">
<input type="radio" name="type" value="card" checked="checked"/>
신용카드
label>
<label class="control control--radio">
<input type="radio" name="type" value="trans"/>
실시간 계좌이체
label>
<label class="control control--radio">
<input type="radio" name="type" value="phone"/>
휴대폰
label>
<label class="control control--radio">
<input type="radio" name="type" value="vbank"/>
가상계좌 입금
label>
div>
div>
<div class="charge-total">
총 결제금액 <span id="total">1000원span>
div>
<div class="charge-click">
<button class="charge-button">충전하기button>
div>
body>
html>

이제 로컬 서버를 띄우고 localhost:8000에 접속해보자.

$ python manage.py runserver

참고로 결제를 하기 위해서는 로그인 되어 있는 상태이여야 한다.

Alt text

이제 결제를 진행해보면 실제로 돈이 빠지는걸 확인할수 있다.

%23%23%23%5BDjango%5DIamport%20%uC5F0%uB3D9%uD558%uAE30%20-%204%0A@%28Django%29%5Bdjango%2C%20iamport%5D%0A%0A%uC774%uBC88%uC5D0%uB294%20template%uC778%20html%uB97C%20%uC791%uC131%uD574%uBCF4%uC790.%20%uC5EC%uAE30%uC11C%20%60IMP.init%28%29%60%20%uAC12%uC740%20%uC544%uC5E0%uD3EC%uD2B8%20%uAD00%uB9AC%uC790%20%uD398%uC774%uC9C0%uC5D0%uC11C%20%uAC00%uB9F9%uC810%20%uCF54%uB4DC%uB97C%20%uB123%uC5B4%uC8FC%uBA74%20%uB41C%uB2E4.%0A%0A%60%60%60vbscript-html%0A%7B%25%20load%20staticfiles%20%25%7D%0A%3C%21DOCTYPE%20html%3E%0A%3Chtml%20lang%3D%22ko%22%3E%0A%3Chead%3E%0A%20%20%20%20%3Cmeta%20charset%3D%22UTF-8%22%3E%0A%20%20%20%20%3Ctitle%3E%uB514%uC81C%uC774%uBE44%uBC84%3C/title%3E%0A%20%20%20%20%3Cscript%20src%3D%22https%3A//code.jquery.com/jquery-2.2.4.min.js%22%3E%3C/script%3E%0A%20%20%20%20%3Cscript%20type%3D%22text/javascript%22%20src%3D%22https%3A//service.iamport.kr/js/iamport.payment-1.1.1.js%22%3E%3C/script%3E%0A%20%20%20%20%3Cscript%20type%3D%22text/javascript%22%3E%0A%20%20%20%20%20%20%20%20%24%28function%20%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20IMP%20%3D%20window.IMP%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20//%20%uAC00%uB9F9%uC810%20%uCF54%uB4DC%0A%20%20%20%20%20%20%20%20%20%20%20%20IMP.init%28%27imp68762150%27%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%24%28%27.charge-button%27%29.on%28%27click%27%2C%20function%20%28e%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20amount%20%3D%20parseInt%28%24%28%27.charge-total%20%23total%27%29.text%28%29.replace%28%27%2C%27%2C%20%27%27%29.slice%280%2C%20-1%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20type%20%3D%20%24%28%27.charge-type%20input%3Achecked%27%29.val%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20merchant_id%20%3D%20AjaxStoreTransaction%28e%2C%20amount%2C%20type%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28merchant_id%20%21%3D%3D%20%27%27%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20IMP.request_pay%28%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pg%3A%20%27html5_inicis%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20escrow%3A%20false%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20digital%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pay_method%3A%20type%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20merchant_uid%3A%20merchant_id%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20%27%uD3EC%uC778%uD2B8%27%20+%20amount%20+%20%27%uC6D0%20%uCDA9%uC804%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20amount%3A%20amount%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%20function%20%28rsp%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28rsp.success%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20msg%20%3D%20%27%uACB0%uC81C%uAC00%20%uC644%uB8CC%uB418%uC5C8%uC2B5%uB2C8%uB2E4.%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20msg%20+%3D%20%27%uACE0%uC720ID%20%3A%20%27%20+%20rsp.imp_uid%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20msg%20+%3D%20%27%uC0C1%uC810%20%uAC70%uB798ID%20%3A%20%27%20+%20rsp.merchant_uid%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20msg%20+%3D%20%27%uACB0%uC81C%20%uAE08%uC561%20%3A%20%27%20+%20rsp.paid_amount%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20msg%20+%3D%20%27%uCE74%uB4DC%20%uC2B9%uC778%uBC88%uD638%20%3A%20%27%20+%20rsp.apply_num%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ImpTransaction%28e%2C%20rsp.merchant_uid%2C%20rsp.imp_uid%2C%20rsp.paid_amount%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20msg%20%3D%20%27%uACB0%uC81C%uC5D0%20%uC2E4%uD328%uD558%uC600%uC2B5%uB2C8%uB2E4.%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20msg%20+%3D%20%27%uC5D0%uB7EC%uB0B4%uC6A9%20%3A%20%27%20+%20rsp.error_msg%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.log%28msg%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%20%20%20%20function%20AjaxStoreTransaction%28e%2C%20amount%2C%20type%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20merchant_id%20%3D%20%27%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20request%20%3D%20%24.ajax%28%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20method%3A%20%22POST%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20url%3A%20%27%7B%25%20url%20%22point_checkout%22%20%25%7D%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20async%3A%20false%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20data%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20amount%3A%20amount%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20type%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20csrfmiddlewaretoken%3A%20%27%7B%7B%20csrf_token%20%7D%7D%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20request.done%28function%20%28data%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28data.works%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20merchant_id%20%3D%20data.merchant_id%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20request.fail%28function%20%28jqXHR%2C%20textStatus%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28jqXHR.status%20%3D%3D%20404%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert%28%22%uD398%uC774%uC9C0%uAC00%20%uC874%uC7AC%uD558%uC9C0%20%uC54A%uC2B5%uB2C8%uB2E4.%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20%28jqXHR.status%20%3D%3D%20403%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert%28%22%uB85C%uADF8%uC778%20%uD574%uC8FC%uC138%uC694.%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert%28%22%uBB38%uC81C%uAC00%20%uBC1C%uC0DD%uD588%uC2B5%uB2C8%uB2E4.%20%uB2E4%uC2DC%20%uC2DC%uB3C4%uD574%uC8FC%uC138%uC694.%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20merchant_id%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20function%20ImpTransaction%28e%2C%20merchant_id%2C%20imp_id%2C%20amount%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20request%20%3D%20%24.ajax%28%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20method%3A%20%22POST%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20url%3A%20%27%7B%25%20url%20%22point_validation%22%20%25%7D%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20async%3A%20false%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20data%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20merchant_id%3A%20merchant_id%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20imp_id%3A%20imp_id%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20amount%3A%20amount%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20csrfmiddlewaretoken%3A%20%27%7B%7B%20csrf_token%20%7D%7D%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20request.done%28function%20%28data%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28data.works%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20request.fail%28function%20%28jqXHR%2C%20textStatus%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28jqXHR.status%20%3D%3D%20404%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert%28%22%uD398%uC774%uC9C0%uAC00%20%uC874%uC7AC%uD558%uC9C0%20%uC54A%uC2B5%uB2C8%uB2E4.%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20%28jqXHR.status%20%3D%3D%20403%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert%28%22%uB85C%uADF8%uC778%20%uD574%uC8FC%uC138%uC694.%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert%28%22%uBB38%uC81C%uAC00%20%uBC1C%uC0DD%uD588%uC2B5%uB2C8%uB2E4.%20%uB2E4%uC2DC%20%uC2DC%uB3C4%uD574%uC8FC%uC138%uC694.%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%3C/script%3E%0A%3C/head%3E%0A%3Cbody%3E%0A%7B%25%20if%20user.is_authenticated%20%25%7D%0A%20%20%20%20%7B%7B%20user%20%7D%7D%uC73C%uB85C%20%uC811%uC18D%uB418%uC5B4%20%uC788%uC2B5%uB2C8%uB2E4.%0A%7B%25%20else%20%25%7D%0A%20%20%20%20%uB85C%uADF8%uC778%20%uD574%uC8FC%uC138%uC694%21%0A%7B%25%20endif%20%25%7D%0A%0A%3Cdiv%20class%3D%22charge-type%22%3E%0A%20%20%20%20%3Cdiv%20class%3D%22billing-title%22%3E%0A%20%20%20%20%20%20%20%20%uACB0%uC81C%uBC29%uC2DD%0A%20%20%20%20%3C/div%3E%0A%20%20%20%20%3Cdiv%20class%3D%22billing-radio%22%3E%0A%20%20%20%20%20%20%20%20%3Clabel%20class%3D%22control%20control--radio%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cinput%20type%3D%22radio%22%20name%3D%22type%22%20value%3D%22card%22%20checked%3D%22checked%22/%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%uC2E0%uC6A9%uCE74%uB4DC%0A%20%20%20%20%20%20%20%20%3C/label%3E%0A%20%20%20%20%20%20%20%20%3Clabel%20class%3D%22control%20control--radio%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cinput%20type%3D%22radio%22%20name%3D%22type%22%20value%3D%22trans%22/%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%uC2E4%uC2DC%uAC04%20%uACC4%uC88C%uC774%uCCB4%0A%20%20%20%20%20%20%20%20%3C/label%3E%0A%20%20%20%20%20%20%20%20%3Clabel%20class%3D%22control%20control--radio%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cinput%20type%3D%22radio%22%20name%3D%22type%22%20value%3D%22phone%22/%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%uD734%uB300%uD3F0%0A%20%20%20%20%20%20%20%20%3C/label%3E%0A%20%20%20%20%20%20%20%20%3Clabel%20class%3D%22control%20control--radio%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cinput%20type%3D%22radio%22%20name%3D%22type%22%20value%3D%22vbank%22/%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%uAC00%uC0C1%uACC4%uC88C%20%uC785%uAE08%0A%20%20%20%20%20%20%20%20%3C/label%3E%0A%20%20%20%20%3C/div%3E%0A%3C/div%3E%0A%3Cdiv%20class%3D%22charge-total%22%3E%0A%20%20%20%20%uCD1D%20%uACB0%uC81C%uAE08%uC561%20%3Cspan%20id%3D%22total%22%3E1000%uC6D0%3C/span%3E%0A%3C/div%3E%0A%3Cdiv%20class%3D%22charge-click%22%3E%0A%20%20%20%20%3Cbutton%20class%3D%22charge-button%22%3E%uCDA9%uC804%uD558%uAE30%3C/button%3E%0A%3C/div%3E%0A%3C/body%3E%0A%3C/html%3E%0A%60%60%60%0A%0A%uC774%uC81C%20%uB85C%uCEEC%20%uC11C%uBC84%uB97C%20%uB744%uC6B0%uACE0%20%60localhost%3A8000%60%uC5D0%20%uC811%uC18D%uD574%uBCF4%uC790.%0A%60%60%60bash%0A%24%20python%20manage.py%20runserver%0A%60%60%60%0A%0A%uCC38%uACE0%uB85C%20%uACB0%uC81C%uB97C%20%uD558%uAE30%20%uC704%uD574%uC11C%uB294%20%uB85C%uADF8%uC778%20%uB418%uC5B4%20%uC788%uB294%20%uC0C1%uD0DC%uC774%uC5EC%uC57C%20%uD55C%uB2E4.%0A%0A%21%5BAlt%20text%5D%28./%u1109%u1173%u110F%u1173%u1105%u1175%u11AB%u1109%u1163%u11BA%202017-02-17%20%u110B%u1169%u110C%u1165%u11AB%201.14.24.png%29%0A%0A%uC774%uC81C%20%uACB0%uC81C%uB97C%20%uC9C4%uD589%uD574%uBCF4%uBA74%20%uC2E4%uC81C%uB85C%20%uB3C8%uC774%20%uBE60%uC9C0%uB294%uAC78%20%uD655%uC778%uD560%uC218%20%uC788%uB2E4.