JSONP๋ ์ดํดํ์ง๋ง JSONP๋ ์ดํดํ์ง ๋ชปํฉ๋๋ค. JSON์ ๋ํ Wikipedia์ ๋ฌธ์ ๋ JSONP์ ์ต์์ ๊ฒ์ ๊ฒฐ๊ณผ์ ๋๋ค. ์ด๊ฒ์ ๋งํฉ๋๋ค :
JSONP ๋๋ โํจ๋ฉ์ด์๋ JSONโ์ JSON ํ์ฅ์ด๋ฉฐ ์ ๋์ฌ๊ฐ ํธ์ถ ์์ฒด์ ์ ๋ ฅ ์ธ์๋ก ์ง์ ๋ฉ๋๋ค.
์? ๋ฌด์จ ์ ํ? ๊ทธ๊ฑด ๋ง์ด๋์ง ์์ต๋๋ค. JSON์ ๋ฐ์ดํฐ ํ์์ ๋๋ค. ์ ํ๊ฐ ์์ต๋๋ค.
๋ ๋ฒ์งธ ๊ฒ์ ๊ฒฐ๊ณผ ๋ JSONP์ ๋ํด ์ด Remy ๋ผ๋ ์ฌ๋์ ๊ฒ์ ๊ฒฐ๊ณผ ์ ๋๋ค .
JSONP๋ ์๋ฒ์์ ์ฌ์ฉ์ ์ง์ ํจ์๋ก ์๋ต์ ์ ๋ฌํ๋ ์คํฌ๋ฆฝํธ ํ๊ทธ ์ฝ์ ์ ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์ดํดํ ์ ์์ง๋ง ์ฌ์ ํ ์ดํด๊ฐ๋์ง ์์ต๋๋ค.
JSONP ๋ ๋ฌด์์ ๋๊น? ์ ๋ง๋ค์ด ์ก์ต๋๊น (์ด๋ค ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋์์ต๋๊น)? ์ ๋ด๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํฉ๋๊น?
๋ถ๋ก : Wikipedia ์์ JSONP ์ฉ ์ ํ์ด์ง๋ฅผ ๋ง๋ค์์ต๋๋ค . ์ด์ jvenema ์ ๋ต๋ณ์ ๊ธฐ๋ฐ์ผ๋ก JSONP์ ๋ํ ๋ช ํํ๊ณ ์ฒ ์ ํ ์ค๋ช ์ด ์์ต๋๋ค.
๋ต๋ณ
์ค์ ๋ก ๋๋ฌด ๋ณต์กํ์ง๋ ์์ต๋๋ค โฆ
domain example.com
์ ์๊ณ domain ์ ์์ฒญํ๋ ค๊ณ ํ๋ค๊ณ ๊ฐ์ ํ์ญ์์ค example.net
. ์ด๋ ๊ฒํ๋ ค๋ฉด, ๋น์ ์ ํ ํ์๊ฐ ์์ต๋๋ค ํฌ๋ก์ค ๋๋ฉ์ธ A, ๊ฒฝ๊ณ ์๋ ๋ browserland์ ๋๋ถ๋ถ.
์ด ์ ํ์ ์ฐํํ๋ ํญ๋ชฉ์ <script>
ํ๊ทธ์
๋๋ค. ๋น์ ์ ์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ๋๋ฉ์ธ ์ ํ์ด ๋ฌด์๋์ง๋ง, ์ ์์ ์ธ ์ํฉ์์, ๋น์ ์ด ์ ๋ง๋ก ํ ์์๋ ์ํ ๊ฒฐ๊ณผ์ ์๋ฌด๊ฒ๋, ์คํฌ๋ฆฝํธ๋ ํ๊ฐ๋ฉ๋๋ค.
๋ฅผ ์
๋ ฅํ์ญ์์ค JSONP
. JSONP๋ฅผ ์ฌ์ฉํ๋ ์๋ฒ์ ์์ฒญํ๋ฉด ํ์ด์ง์ ๋ํด ์๋ฒ์ ์๋ ค์ฃผ๋ ํน์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๋ฌํฉ๋๋ค. ์ด๋ ๊ฒํ๋ฉด ์๋ฒ๊ฐ ํ์ด์ง๋ฅผ ์ฒ๋ฆฌ โโํ ์์๋ ๋ฐฉ์์ผ๋ก ์๋ต์ ๋ฉ์ง๊ฒ ๋ง๋ฌด๋ฆฌ ํ ์ โโ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ฒ callback
๊ฐ JSONP ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด ํธ์ถ๋๋ ๋งค๊ฐ ๋ณ์๋ฅผ ์์ํ๋ค๊ณ ๊ฐ์ ํ์ญ์์ค . ๊ทธ๋ฐ ๋ค์ ์์ฒญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
http://www.example.net/sample.aspx?callback=mycallback
JSONP๊ฐ ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ JavaScript ๊ฐ์ฒด๊ฐ ๋ฐํ ๋ ์ ์์ต๋๋ค.
{ foo: 'bar' }
๊ทธ๋ฌ๋ JSONP๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ๊ฐ โ์ฝ๋ฐฑโ๋งค๊ฐ ๋ณ์๋ฅผ ์์ ํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ๋ง๋ฌด๋ฆฌ๋์ด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ฆฌํด๋ฉ๋๋ค.
mycallback({ foo: 'bar' });
๋ณด์๋ค์ํผ ์ด์ ์ง์ ํ ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค. ๋ฐ๋ผ์ ํ์ด์ง์์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ์ํ์ญ์์ค.
mycallback = function(data){
alert(data.foo);
};
์ด์ ์คํฌ๋ฆฝํธ๊ฐ๋ก๋๋๋ฉด ํ๊ฐ๋๊ณ ํจ์๊ฐ ์คํ๋ฉ๋๋ค. Voila, ๋๋ฉ์ธ ๊ฐ ์์ฒญ!
JSONP์ ์ฃผ์ ๋ฌธ์ ์ค ํ๋๋ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์์ฒญ์ ๋ํ ๋ง์ ์ ์ด๊ถ์ ์๊ฒ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ ํ ์ค๋ฅ ์ฝ๋๋ฅผ ๋ค์ ์ป๋ โ์ข์โ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ํ์ด๋จธ ๋ฑ์ ์ฌ์ฉํ์ฌ ์์ฒญ ๋ฑ์ ๋ชจ๋ํฐ๋งํ๊ฒ๋๋ฉฐ, ์ด๋ ํญ์ ์ฝ๊ฐ ์์ฌ๋ฉ๋๋ค. JSONRequest ์ ์์ ๋๋ฉ์ธ ๊ฐ ์คํฌ๋ฆฝํ ์ ํ์ฉํ๊ณ ๋ณด์์ ์ ์งํ๋ฉฐ ์์ฒญ์ ์ ์ ํ ์ ์ด ํ ์์๋ ํ๋ฅญํ ์๋ฃจ์ ์ ๋๋ค.
์์ฆ (2015) CORS ๋ JSONRequest์ ๋น๊ตํ์ฌ ๊ถ์ฅ๋๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. JSONP๋ ์ฌ์ ํ ์ค๋๋ ๋ธ๋ผ์ฐ์ ์ง์์ ์ ์ฉํ์ง๋ง CORS๊ฐ ๋ ๋์ ์ ํ์ด ์๋ ํ ๋ณด์์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
๋ต๋ณ
JSONP ๋ XMLHttpRequest ์ ๋์ผํ ๋๋ฉ์ธ ์ ์ฑ ์ ๊ทน๋ณตํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋๋ค . (์๋ค์ํผ AJAX (XMLHttpRequest) ์์ฒญ์ ๋ค๋ฅธ ๋๋ฉ์ธ์ผ๋ก ๋ณด๋ผ ์๋ ์์ต๋๋ค .)
๋ฐ๋ผ์ XMLHttpRequest ๋ฅผ ์ฌ์ฉํ๋ ๋์ js๊ฐ ๋ค๋ฅธ ๋๋ฉ์ธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ ์ค๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก js ํ์ผ์๋ก๋ํ๋ ๋ฐ ์ฌ์ฉํ๋ ์คํฌ๋ฆฝํธ HTML ํ๊ทธ ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด์ํ๋ฐ?
๊ฒ์ ๋๋ค โ ๋ฐํ ์คํฌ๋ฆฝํธ ํ๊ทธ์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์์๋ XMLHttpRequest๋ฅผ ! ์ด๊ฒ ์ข ๋ด:
script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'http://www.someWebApiServer.com/some-data';
๋น์ ์ ๋๋ผ ๊ฒ์ด๋ค ์คํฌ๋ฆฝํธ ๊ทธ ํ ๊ฐ์ ์ธ๋ชจ๊ฐ ๋ฐ์ดํฐ๋ฅผ๋ก๋ํ๋๋ก ์ธ๊ทธ๋จผํธ :
<script>
{['some string 1', 'some data', 'whatever data']}
</script>
๊ทธ๋ฌ๋ ์ด๊ฒ์ ์คํฌ๋ฆฝํธ ํ๊ทธ ์์์ด ๋ฐฐ์ด์ ๊ฐ์ ธ์์ผํ๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ ๋ถํธ ํฉ๋๋ค. ๋ฐ๋ผ์ JSONP ์ ์์๋ ์ด๊ฒ์ด ๋ ์ ์๋ํ๋ค๊ณ ๊ฒฐ์ ํ์ต๋๋ค.
script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'http://www.someWebApiServer.com/some-data?callback=my_callback';
ํต์ง my_callback์ ์ ๊ธฐ ๊ธฐ๋ฅ์? ๋ฐ๋ผ์ JSONP ์๋ฒ๊ฐ ์์ฒญ์ ๋ฐ๊ณ ์ฝ๋ฐฑ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฐพ์ผ๋ฉด ์ผ๋ฐ js ๋ฐฐ์ด์ ๋ฐํํ๋ ๋์ ๋ค์์ ๋ฐํํฉ๋๋ค.
my_callback({['some string 1', 'some data', 'whatever data']});
์ด์ต์ด ์ด๋ ์๋์ง ํ์ธํ์ญ์์ค. ์ด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ ์ค๋ฉด ์๋ ์ฝ๋ฐฑ (my_callback)์ด ์คํ๋ฉ๋๋ค. JSONP
์ ๋ํด ์์์ผ ํ ๊ฒ์ ์ฝ๋ฐฑ ๋ฐ ์คํฌ๋ฆฝํธ ํ๊ทธ์
๋๋ค.
์ฐธ๊ณ : ์ด๋ค์ JSONP ์ฌ์ฉ๋ฒ์ ๊ฐ๋จํ ์์ด๋ฉฐ ํ๋ก๋์ ์ค๋น ์คํฌ๋ฆฝํธ๊ฐ ์๋๋๋ค.
๊ธฐ๋ณธ JavaScript ์์ (JSONP๋ฅผ ์ฌ์ฉํ ๊ฐ๋จํ Twitter ํผ๋)
<html>
<head>
</head>
<body>
<div id = 'twitterFeed'></div>
<script>
function myCallback(dataWeGotViaJsonp){
var text = '';
var len = dataWeGotViaJsonp.length;
for(var i=0;i<len;i++){
twitterEntry = dataWeGotViaJsonp[i];
text += '<p><img src = "' + twitterEntry.user.profile_image_url_https +'"/>' + twitterEntry['text'] + '</p>'
}
document.getElementById('twitterFeed').innerHTML = text;
}
</script>
<script type="text/javascript" src="http://twitter.com/status/user_timeline/padraicb.json?count=10&callback=myCallback"></script>
</body>
</html>
๊ธฐ๋ณธ jQuery ์ (JSONP๋ฅผ ์ฌ์ฉํ ๊ฐ๋จํ Twitter ํผ๋)
<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script>
$(document).ready(function(){
$.ajax({
url: 'http://twitter.com/status/user_timeline/padraicb.json?count=10',
dataType: 'jsonp',
success: function(dataWeGotViaJsonp){
var text = '';
var len = dataWeGotViaJsonp.length;
for(var i=0;i<len;i++){
twitterEntry = dataWeGotViaJsonp[i];
text += '<p><img src = "' + twitterEntry.user.profile_image_url_https +'"/>' + twitterEntry['text'] + '</p>'
}
$('#twitterFeed').html(text);
}
});
})
</script>
</head>
<body>
<div id = 'twitterFeed'></div>
</body>
</html>
JSONP ๋ JSON with Padding์ ๋ํ๋ ๋๋ค . (๋๋ถ๋ถ์ ์ฌ๋๋ค์ดโํจ๋ฉโ์ด๋ผ๊ณ ์๊ฐํ๋ ๊ฒ๊ณผ๋ ์๋ฌด ๊ด๋ จ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ฆ์ด ๋งค์ฐ ๋ฎ์ ๊ธฐ์ ์ ๋๋ค.)
๋ต๋ณ
JSONP๋ ์๊ฒฉ ๋ฐ์ดํฐ ์๋น์ค ์์น์ ์์ฒญํ๋ โscriptโ์์ (HTML ๋งํฌ ์ ๋๋ JavaScript๋ฅผ ํตํด DOM์ ์ฝ์ )๋ฅผ ๊ตฌ์ฑํ์ฌ ์๋ํฉ๋๋ค. ์๋ต์ JSON ๋ฐ์ดํฐ๊ฐ ์์ฒญ๋๋ ๋งค๊ฐ ๋ณ์๊ฐ ์ ๋ฌ๋๊ณ ๋ฏธ๋ฆฌ ์ ์ ๋ ํจ์์ ์ด๋ฆ์ผ๋ก ๋ธ๋ผ์ฐ์ ์๋ก๋ ๋ ์๋ฐ ์คํฌ๋ฆฝํธ์ ๋๋ค. ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋ ๋ JSON ๋ฐ์ดํฐ์ ํจ๊ป ํจ์๊ฐ ํธ์ถ๋์ด ์์ฒญ ํ์ด์ง๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ ์ฒ๋ฆฌ ํ ์ โโ์์ต๋๋ค.
์์ธํ ๋ด์ฉ์ ๋ณด๋ ค๋ฉด https://blogs.sap.com/2013/07/15/secret-behind-jsonp/๋ฅผ ๋ฐฉ๋ฌธํ์ญ์์ค.
ํด๋ผ์ด์ธํธ ์ธก ์ฝ๋ ์ค ๋ํซ
<!DOCTYPE html>
<html lang="en">
<head>
<title>AvLabz - CORS : The Secrets Behind JSONP </title>
<meta charset="UTF-8" />
</head>
<body>
<input type="text" id="username" placeholder="Enter Your Name"/>
<button type="submit" onclick="sendRequest()"> Send Request to Server </button>
<script>
"use strict";
//Construct the script tag at Runtime
function requestServerCall(url) {
var head = document.head;
var script = document.createElement("script");
script.setAttribute("src", url);
head.appendChild(script);
head.removeChild(script);
}
//Predefined callback function
function jsonpCallback(data) {
alert(data.message); // Response data from the server
}
//Reference to the input field
var username = document.getElementById("username");
//Send Request to Server
function sendRequest() {
// Edit with your Web Service URL
requestServerCall("http://localhost/PHP_Series/CORS/myService.php?callback=jsonpCallback&message="+username.value+"");
}
</script>
</body>
</html>
์๋ฒ ์ธก PHP ์ฝ๋
<?php
header("Content-Type: application/javascript");
$callback = $_GET["callback"];
$message = $_GET["message"]." you got a response from server yipeee!!!";
$jsonResponse = "{\"message\":\"" . $message . "\"}";
echo $callback . "(" . $jsonResponse . ")";
?>
๋ต๋ณ
๋ฆฌํด ๋ JSON ์ค๋ธ์ ํธ ์์ ์ ๋๋ถ๋ฅผ ์ถ๊ฐํ๋๋ก ์๋ฒ์ ์์ฒญํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ :
function_prefix(json_object);
๋ธ๋ผ์ฐ์ ๊ฐ eval
JSON ๋ฌธ์์ด์ ํํ์์ผ๋ก โ์ธ๋ผ์ธโ ํ๊ธฐ ์ํด . ์ด ํธ๋ฆญ์ ์ฌ์ฉํ๋ฉด ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ์๋ฐ ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ โ์ฃผ์
โํ ์ ์์ผ๋ฉฐ โ๋์ผํ ์์ โ์ ํ์ ๋ฌด์ํ ์ ์์ต๋๋ค.
์ฆ, ๋๋ฉ์ธ ๊ฐ ๋ฐ์ดํฐ ๊ตํ์ ๋ฌ์ฑ ํ ์ ์์ต๋๋ค .
์ผ๋ฐ์ ์ผ๋ก XMLHttpRequest
๋๋ฉ์ธ ๊ฐ ๋ฐ์ดํฐ ๊ตํ์ ์ง์ ํ์ฉํ์ง ์์ต๋๋ค (๋์ผํ ๋๋ฉ์ธ์ ์๋ฒ๋ฅผ ํต๊ณผํด์ผ ํจ).
<script src="some_other_domain/some_data.js&prefix=function_prefix
>`์์ ์ด ์๋ ๋๋ฉ์ธ์ ๋ฐ์ดํฐ์ ์ก์ธ์ค ํ ์ ์์ต๋๋ค.
์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค. โํธ๋ฆญโ์ ์๋ํ๊ธฐ ์ ์ ์๋ฒ๋ฅผ โ์ ๋ขฐํ ์์๋โ๊ฒ์ผ๋ก ๊ฐ์ฃผํด์ผํ์ง๋ง ๊ฐ์ฒด ํ์ ๋ฑ์ ๋ณ๊ฒฝ์ผ๋ก ์ธํ ๋ถ์์ฉ์ด ํฌํจ๋ ์ ์์ต๋๋ค. ๊ฒฝ์ฐ function_prefix
(์ฆ, ์ ์ ํ ๊ธฐ๋ฅ JS)๊ฐ JSON ๊ฐ์ฒด๋ฅผ ์์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์๊ธฐ ๊ธฐ๋ฅ์ ์๊ธฐ ๋ฐํ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ / ์น์ธํ๊ธฐ ์ ์ ๊ฒ์ฌ๋ฅผ ์ํ ํ ์์๋ค.
๋ต๋ณ
JSONP๋ ๋๋ฉ์ธ ๊ฐ ์คํฌ๋ฆฝํ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ ์์๋ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค. ์๋ฒ ์ธก์์ AJAX ํ๋ก์๋ฅผ ๊ตฌํํ ํ์์์ด JS๋ง์ผ๋ก JSONP ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
b1t.co ์๋น์ค๋ฅผ ์ฌ์ฉํ์ฌ ์๋ ๋ฐฉ์์ ํ์ธํ ์ ์์ต๋๋ค. URL์ ์ถ์ ํ ์์๋ ๋ฌด๋ฃ JSONP ์๋น์ค์ ๋๋ค. ์๋น์ค์ ์ฌ์ฉํ URL์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
http://b1t.co/Site/api/External/MakeUrlWithGet?callback=[resultsCallBack]&url=[escapedUrlToMinify]
์๋ฅผ ๋ค์ด http://b1t.co/Site/api/External/MakeUrlWithGet?callback=whateverJavascriptName&url=google.com
๋์์ฌ ๊ฒ์ด๋ค
whateverJavascriptName({"success":true,"url":"http://google.com","shortUrl":"http://b1t.co/54"});
๋ฐ๋ผ์ get์ด src๋ก js์๋ก๋๋๋ฉด ์ฝ๋ฐฑ ํจ์๋ก ๊ตฌํ ํด์ผํ๋ JavascriptName์ ์๋์ผ๋ก ์คํํฉ๋๋ค.
function minifyResultsCallBack(data)
{
document.getElementById("results").innerHTML = JSON.stringify(data);
}
์ค์ ๋ก JSONP ํธ์ถ์ ์ํํ๋ ค๋ฉด ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ (jQuery ์ฌ์ฉ ํฌํจ)์ ๋ํด ์ํ ํ ์ ์์ง๋ง ๋ค์์ ์์ํ JS ์์ ์ ๋๋ค.
function minify(urlToMinify)
{
url = escape(urlToMinify);
var s = document.createElement('script');
s.id = 'dynScript';
s.type='text/javascript';
s.src = "http://b1t.co/Site/api/External/MakeUrlWithGet?callback=resultsCallBack&url=" + url;
document.getElementsByTagName('head')[0].appendChild(s);
}
: ๋จ๊ณ ์์ ์ ์ฐ์ต ํ ์์๋ JSONP ์น ์๋น์ค์ ์ํ ๋จ๊ณ์์ ํ์ธํ ์์๋ค ์ด ๊ฒ์๋ฌผ์
๋ต๋ณ
JSONP ์ฌ์ฉ๋ฒ์ ๋ํ ๊ฐ๋จํ ์์ ๋๋ค.
client.html
<html>
<head>
</head>
body>
<input type="button" id="001" onclick=gO("getCompany") value="Company" />
<input type="button" id="002" onclick=gO("getPosition") value="Position"/>
<h3>
<div id="101">
</div>
</h3>
<script type="text/javascript">
var elem=document.getElementById("101");
function gO(callback){
script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'http://localhost/test/server.php?callback='+callback;
elem.appendChild(script);
elem.removeChild(script);
}
function getCompany(data){
var message="The company you work for is "+data.company +"<img src='"+data.image+"'/ >";
elem.innerHTML=message;
}
function getPosition(data){
var message="The position you are offered is "+data.position;
elem.innerHTML=message;
}
</script>
</body>
</html>
server.php
<?php
$callback=$_GET["callback"];
echo $callback;
if($callback=='getCompany')
$response="({\"company\":\"Google\",\"image\":\"xyz.jpg\"})";
else
$response="({\"position\":\"Development Intern\"})";
echo $response;
?>
๋ต๋ณ
JSONP๋ฅผ ์ดํดํ๊ธฐ ์ ์ JSON ํ์๊ณผ XML์ ์์์ผํฉ๋๋ค. ํ์ฌ ์น์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ํ์์ XML์ด์ง๋ง XML์ ๋งค์ฐ ๋ณต์กํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์น ํ์ด์ง์ ํฌํจ ๋ ํ๋ก์ธ์ค๋ฅผ ๋ถํธํ๊ฒ ๋ง๋ญ๋๋ค.
๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ๋ก๊ทธ๋จ์ด๋ผ ํ ์ง๋ผ๋ JavaScript๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๊ตํ ํ ์ ์๋๋ก JavaScript ๊ฐ์ฒด์ ๋ฐ๋ฅธ ํํ์ ์ฌ์ฉํ๊ณ ๊ฐ๋จํ ๋ฐ์ดํฐ ๊ตํ ํ์ ์ธ JSON์ ๊ฐ๋ฐํ์ต๋๋ค. JSON์ ๋ฐ์ดํฐ ๋๋ JavaScript ํ๋ก๊ทธ๋จ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
JSON์ JavaScript์ ์ง์ ์๋ฒ ๋ ๋ ์ ์์ผ๋ฉฐ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ JSON ํ๋ก๊ทธ๋จ์ ์ง์ ์คํํ ์ ์์ง๋ง ๋ณด์ ์ ํ์ผ๋ก ์ธํด ๋ธ๋ผ์ฐ์ ์๋ ๋ฐ์ค ๋ฉ์ปค๋์ฆ์ ๋๋ฉ์ธ ๊ฐ JSON ์ฝ๋ ์คํ์ ๋นํ์ฑํํฉ๋๋ค.
์คํ ํ JSON์ ์ ๋ฌํ ์ ์๋๋ก JSONP๋ฅผ ๊ฐ๋ฐํ์ต๋๋ค. JSONP๋ JavaScript ์ฝ๋ฐฑ ๊ธฐ๋ฅ ๋ฐ <script> ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ ๋ณด์ ์ ํ์ ๋ฌด์ํฉ๋๋ค.
๊ฐ๋จํ ๋งํด JSONP๊ฐ ๋ฌด์์ธ์ง, ์ด๋ค ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋์ง (์ฌ์ฉ ํ ๋) ์ค๋ช ํฉ๋๋ค.