-
ํ๋ก์ ํธ TIL (5) - [ XML -> JSON ๋ณํ, CORS ์ด์ ]ํ๋ก์ ํธ ๋ฆฌ๋ทฐ/Book-Square 2020. 9. 28. 01:09
์ค๋ ํ ์ผ ๐ฅด
์ค๋์ ๋ค์ด๋ฒ ๋์ API์์ ์นดํ ๊ณ ๋ฆฌ๋ณ๋ก ๋์ ์ ๋ณด๋ฅผ ๋ฐ์์ค๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์ต๋๋ค.
์ด API๋ ์ฌ์ฉ์๊ฐ ์์ฒญํ ์นดํ ๊ณ ๋ฆฌ๋ณ๋ก ๋์๋ฅผ ํํฐ๋งํ์ฌ ์๋ตํด์ฃผ๋ API์ธ๋ฐ ํด๋ผ์ด์ธํธ์์ ์์ฒญํ๋ ค๊ณ ํ๋ CORS ์๋ฌ๊ฐ ๋ฌ์ต๋๋ค.
ํด๊ฒฐํ๊ธฐ ์ํด ์์ฒญ ์ headers์ Access-Control-Allow-Origin ์ค์ ๋ ์ถ๊ฐํด๋ณด๊ณ ์ด๋ฐ์ ๋ฐ ๋ฐฉ๋ฒ์ ์ ์ฉํด๋ณด์์ง๋ง ํด๊ฒฐ๋์ง ์์์ ๊ฒ์ํ ๊ฒฐ๊ณผ ์ด API๋ ์๋ฒํ๋ก๊ทธ๋๋ฐ(python, jsp, php, node.js ๋ฑ)์ ํตํด์ ํธ์ถํ๋๋ก ๋์ด ์์์ต๋๋ค.
๊ทธ ์ด์ ๋ ๋ค๋ฅธ ์ฌ๋์ ํด๋ผ์ด์ธํธ id, secret์ ๋์ฉํด์ API๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด์์ ๋๋ค.
๊ทธ๋์ ์ ๋ ์๋ฒ์์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์ณ ํด๊ฒฐํ์์ต๋๋ค.
- ์นดํ ๊ณ ๋ฆฌ๋ณ๋ก ์๋ฒ์ ์์ฒญ์ด ๋ค์ด์ฌ ๋ผ์ฐํ ์ค์ (๋งค๊ฐ๋ณ์๋ก ์นดํ ๊ณ ๋ฆฌ ๋ฒํธ ๋๊ธฐ๊ธฐ)
- ์์ฒญ์ผ๋ก ๋์ด์จ ์นดํ ๊ณ ๋ฆฌ ๋ฒํธ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ์์ ๋ค์ด๋ฒ API ์์ฒญ
- ๋ค์ด๋ฒ API์์ ์๋ต์ผ๋ก ์จ XML ๋ฐ์ดํฐ -> JSON ๋ฐ์ดํฐ๋ก ๋ณํ (xml2js ๋ชจ๋ ์ฌ์ฉ)
- ๋ณํํ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ์ ์๋ต์ผ๋ก ๋ณด๋ด์ค
์ด API๋ ๋ฐํ ๊ฐ์ด XML์ด๊ธฐ ๋๋ฌธ์ xml2js ๋ชจ๋์ ์ฌ์ฉํ์ฌ JSON ๋ฐ์ดํฐ๋ก ๋ณํ์ ํด์ฃผ์ด์ผ ํ์ต๋๋ค.
router.post("/", (req, res) => { const { select } = req.body; axios.get(`https://openapi.naver.com/v1/search/book_adv.xml?d_publ=${encodeURI( "๊ต๋ณด๋ฌธ๊ณ ")}&d_catg=${select}&display=4`, { headers: { "X-Naver-Client-Id": "ํด๋ผ์ด์ธํธ id", "X-Naver-Client-Secret": "ํด๋ผ์ด์ธํธ secret", }, } ) .then((data) => { let resultSendData = null; xml2js.parseString(data.data, (err, result) => { if (err) { throw err; } const json = JSON.stringify(result, null, 4); resultSendData = json; }); return resultSendData; }) .then((data) => res.status(200).send(data)); });
req.body๋ก ๋ค์ด์จ select(์นดํ ๊ณ ๋ฆฌ ๋ฒํธ) ๊ฐ์ ์ถ์ถ ํ, axios๋ฅผ ์ฌ์ฉํ์ฌ API ์์ฒญ์ ํฉ๋๋ค.
์ด ๋, encodeURL์ ์ฌ์ฉํ์ฌ ์ถํ์ฌ ์ ๋ณด๋ฅผ UTF-8๋ก ์ธ์ฝ๋ฉํด์ฃผ์ด์ผ ํฉ๋๋ค.
headers์ ๋ฐ๊ธ๋ฐ์ ํด๋ผ์ด์ธํธ id์ secret ํค๋ฅผ ๋ฃ์ด์ ์์ฒญ ํ, then์ผ๋ก ๋ฐ์์จ xml ๋ฐ์ดํฐ๋ฅผ xml2js.parseString์ ํตํด json ๋ฐ์ดํฐ๋ก ๋ณํ์์ผ ํด๋ผ์ด์ธํธ์ ์๋ต์ผ๋ก ๋ณด๋ด์ค๋๋ค.
( JSON.stringify() ๋ฉ์๋์ 3๋ฒ์งธ ์ธ์๋ก ๋ฃ์ ๊ฐ์ json์ผ๋ก ๋ณํํ ๋ฐ์ดํฐ์ ๊ฐ๋ ์ฑ์ ๋์ด๊ธฐ ์ํด ๊ณต๋ฐฑ์ ์กฐ์ ํ ์ ์๋ ์ต์ ์ผ๋ก ์ ์ฉํ๊ฒ ์ฌ์ฉํ์์ต๋๋ค. )
๋ง์น๋ฉฐ
ํด๋ผ์ด์ธํธ๊ฐ ์๋ ์๋ฒ์์ ์ฒ๋ฆฌํด์ผํ๋ ๊ฒ์ธ์ง ๋ชฐ๋ผ์ ํ์ฐธ ํด๋งค๊ธฐ๋ ํ์ง๋ง ๋๋ถ์ xml๋ฐ์ดํฐ๋ฅผ json ๋ฐ์ดํฐ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ๊ฒฝํํด๋ณผ ์ ์์ด์ ์ข์ ๊ธฐํ๊ฐ ๋์์ต๋๋ค.
์ด API ๋ง๊ณ ๋ REST API ์์ฒญ์ ํ ๋์๋ CORS ์ด์๊ฐ ์์ฃผ ๋ฐ์ํ๊ฒ ๋๋๋ฐ ๋งค์ผ ๋ง์ฃผํ๋ ์๋ฌ๊ฐ ์๋์๋ค๋ณด๋ CORS์ ๊ดํ์ฌ ๋ธ๋ก๊น ์ ํ์์๋ ๋ถ๊ตฌํ๊ณ ๊ด๋ จ ์ง์์ด ๋ด ๋จธ๋ฆฟ์์์ ์ฆ๋ฐํด๋ฒ๋ ธ์ต๋๋ค..............
์ด๋ฒ ๊ธฐํ์ ๋ธ๋ก๊น ํ ๋ด์ฉ์ ๋ค์ ์ ๋ ํ๊ณ ๊ตฌ๊ธ๋งํ์ฌ ๊ฐ๋ ์ ์ข ๋ ๋ช ํํ๊ฒ ์ง๊ณ ๋์ด๊ฐ ์ ์๊ฒ ๋์์ต๋๋ค!
โ๏ธ๐
'ํ๋ก์ ํธ ๋ฆฌ๋ทฐ > Book-Square' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ