๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
5๏ธโƒฃ CS/Web

[Web] CSV, XML, JSON

by seolhee2750 2022. 9. 18.

๋ฐ์ดํ„ฐ ์ „์†ก ํ˜•์‹์˜ ์ข…๋ฅ˜์™€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ •๋ฆฌํ•œ๋‹ค.

 

๐Ÿ“Ž CSV (Comma Separated Values)

CSV

  • ๊ฐ ํ•ญ๋ชฉ์„ comma๋กœ ๊ตฌ๋ถ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.
  • XML๊ณผ JSON์— ๋น„ํ•ด ๋ฌธ์žฅ์ด ์งง์œผ๋ฏ€๋กœ, ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ์ „์†ก ์‹œ ์œ ๋ฆฌํ•˜๋‹ค.
  • ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ๋‚ด์šฉ์ธ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
    ๐Ÿ‘‰ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ '์™„๋ฒฝํžˆ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ณต์œ ํ•  ๊ฒฝ์šฐ์—๋งŒ' ๊ฐ€์žฅ ๋น ๋ฅผ ์ˆ˜ ์žˆ์Œ

 

CSV ๊ตฌ์กฐ ์˜ˆ์‹œ

<!--jsp ํŒŒ์ผ-->
<%@ page language="java" contentType="text/plain; charset=UTF-8" pageEncoding="UTF-8"%>
1,๊น€์„คํฌ,A,25
2,ํ™์„คํฌ,B,26
3,๋ฐ•์„คํฌ,C,28

๐Ÿ“Ž XML (eXtensible Markup Language)

XML

  • tag๋กœ data๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.
    ๐Ÿ‘‰ tag๋ฅผ ๋ณด๋ฉด ๊ฐ data๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • tag์— ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ณต์žกํ•œ data ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • tag๋ฅผ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์šฉ๋Ÿ‰์ด ์ปค์ง„๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค.

 

XML ๊ตฌ์กฐ ์˜ˆ์‹œ

<!--studentsXML.jsp ํŒŒ์ผ-->
<?xml version="1.0" encoding="UTF-8"?>
<%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%>
<students>
	<student>
		<id>1</id>
		<name>๊น€์„คํฌ</name>
		<class>A</class>
		<age>25</age>
	</student>
	<student>
		<id>2</id>
		<name>ํ™์„คํฌ</name>
		<class>B</class>
		<age>26</age>
	</student>
	<student>
		<id>3</id>
		<name>๋ฐ•์„คํฌ</name>
		<class>C</class>
		<age>28</age>
	</student>
</students>

 

XML ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ ์˜ˆ์‹œ ๊ตฌํ˜„

  • addEventListenter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ๋กœ XML ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.
  • CSV์™€ XML์„ ๋ชจ๋‘ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋Š” response.text()๋ฅผ ์ด์šฉํ•ด์ฃผ์—ˆ๊ณ ,
    ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ž๋กœ ๋„˜๊ฒจ makeList ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ๋‹ค.
  • makeList์—์„œ๋Š” ๋‚ด์žฅ ๊ฐ์ฒด DOMParser๋ฅผ ํ™œ์šฉ, ๋ฐ›์•„์˜จ .data๋ฅผ XML๋กœ ๋ณ€ํ™˜ํ–ˆ๋‹ค.
  • querySelector๋ฅผ ํ†ตํ•ด id๋ฅผ ๋ฐ›์•„์˜ค๊ณ , ํ•ด๋‹นํ•˜๋Š” id์˜ textContent๋ฅผ ๊ฐ€์ ธ์™€ ์ถœ๋ ฅํ–ˆ๋‹ค.
    ๐Ÿ‘‰ ์—ฌ๊ธฐ์„œ๋Š” id, name, class, age๊ฐ€ ๊ฐ๊ฐ ํ•˜๋‚˜์”ฉ๋งŒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ querySelector๋„ ๊ดœ์ฐฎ์ง€๋งŒ
    ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์กด์žฌํ•  ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ •ํ™•ํ•˜๋‹ค.
    querySelectorAll("id")[0] ํ˜น์€ getElementsByTagName("id")[0]
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>XML</title>
    <style type="text/css">
      table {
        width: 300px;
        height: 100px;
      }
      th,
      td {
        text-align: center;
      }
      .first-view-bg {
        background-color: darkgreen;
      }
      .first-view-color {
        color: ivory;
      }
    </style>
  </head>
  <body>
    <h3>ํ•™์ƒ ์ •๋ณด</h3>
    <button id="listBtn">ํ•™์ƒ ์ •๋ณด ์กฐํšŒ</button>
    <table style="display: none">
      <tr>
        <th>ํ•™๋ฒˆ</th>
        <th>์ด๋ฆ„</th>
        <th>๋ถ„๋ฐ˜</th>
        <th>๋‚˜์ด</th>
      </tr>
      <tbody id="studentinfo"></tbody>
    </table>
    <script>
      let btn = document.querySelector("#listBtn"); // == document.getElementById("listBtn");
      btn.addEventListener("click", function () {
        // studentsXml.jsp ๋น„๋™๊ธฐ ํ˜ธ์ถœ
        fetch("studentsXml.jsp")
      		.then((response) => response.text()) // response.text()๋Š” CSV, XML ๋ชจ๋‘ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์Œ
      		.then((data) => makeList(data)) // makeList ํ˜ธ์ถœ
      });

      function makeList(data) {
        document.querySelector("table").setAttribute("style", "display: ;");
        let tbody = document.querySelector("#studentinfo");
        
        // XML parsing
        let parser = new DOMParser(); // DOMParset ๋‚ด์žฅ ๊ฐ์ฒด
        const xml = parser.parseFromString(data, "application/xml"); // ์ž…๋ ฅ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ XMLํ˜•์‹์œผ๋กœ ๋ฐ”๊ฟ”๋ผ!
        
        initTable();
        let students = xml.querySelectorAll("student");
        students.forEach((student) => {
          let tr = document.createElement("tr");

          let idTd = document.createElement("td");
          // id๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์„ ๋•Œ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ All๋กœ ๋ฐ›์•„์˜จ ๋’ค ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผ
          // idTd.appendChild(document.createTextNode(student.querySelectorAll("id")[0].textContent));
          idTd.appendChild(document.createTextNode(student.getElementsByTagName("id")[0].textContent));
          tr.appendChild(idTd);

          let nameTd = document.createElement("td");
          nameTd.appendChild(document.createTextNode(student.querySelector("name").textContent));
          tr.appendChild(nameTd);

          let classTd = document.createElement("td");
          classTd.appendChild(document.createTextNode(student.querySelector("class").textContent));
          tr.appendChild(classTd);

          let gradeTd = document.createElement("td");
          gradeTd.appendChild(document.createTextNode(student.querySelector("age").textContent));
          tr.appendChild(gradeTd);

          tbody.appendChild(tr);
        });
        let first = document.querySelector("tr:first-child");
        first.className = "first-view-bg";
        first.classList.add("first-view-color");
        let odd = document.querySelectorAll("tr:nth-child(even)");
        odd.forEach(function (td) {
          td.setAttribute("style", "background: lightgray;");
        });
      }

      function initTable() {
        let tbody = document.querySelector("#studentinfo");
        let len = tbody.rows.length;
        for (let i = len - 1; i >= 0; i--) {
          tbody.deleteRow(i);
        }
      }
    </script>
  </body>
</html>

(CSV์™€ ๊ฐ™์ง€๋งŒ, CSV์˜ ๊ฒฝ์šฐ XML ํŒŒ์‹ฑ ๋Œ€์‹  '\n'์™€ ','๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋‹ค๋Š” ๊ฒƒ์ด ์ฐจ์ด์ !!

๊ฑฐ์˜ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— CSV๋Š” ์ž‘์„ฑํ•˜์ง€ ์•Š์Œ)


๐Ÿ“Ž JSON

JSON

  • CSV์™€ XML์˜ ๋‹จ์ ์„ ๊ทน๋ณตํ–ˆ๋‹ค.
  • JavaScript์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด์˜ ํ˜•์‹์œผ๋กœ data๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.
  • Ajax ์‚ฌ์šฉ ์‹œ ๊ฑฐ์˜ ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

 

JSON ๊ตฌ์กฐ ์˜ˆ์‹œ

<!--studentsJSON.jsp ํŒŒ์ผ-->
<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>
[
 {
 	"id" : "1",
 	"name" : "๊น€์„คํฌ",
 	"class" : "A",
 	"grade" : 25
 },
 {
 	"id" : "2",
 	"name" : "ํ™์„คํฌ",
 	"class" : "B",
 	"grade" : 26
 },
 {
 	"id" : "3",
 	"name" : "๋ฐ•์„คํฌ",
 	"class" : "C",
 	"grade" : 28
 }
]

 

JSON ํŠน์ง•

  • ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํŒŒ์ผ ํฌ๋งท์ด๋‹ค.
  • ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ€๋ณ๋‹ค.
  • ์ฝ๊ธฐ ํŽธํ•˜๋‹ค.
  • Key์™€ Value ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
  • ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ ์ง๋ ฌํ™”, ์—ญ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํ”„๋กœ๊ทธ๋žจ ์–ธ์–ด๋‚˜ ํ”Œ๋žซํผ์— ์ƒ๊ด€ ์—†์ด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์ง๋ ฌํ™”(serialize)์™€ ์—ญ์ง๋ ฌํ™”(deserialize)

์ง๋ ฌํ™”

  • ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์ด๋‹ค.
  • ํ†ต์‹  ํ•  ๋•Œ๋Š” ๋ฌธ์ž์—ด๋กœ ์ง๋ ฌํ™” ํ•˜์—ฌ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.
  • ์‚ฌ์šฉ๋ฒ• : JSON.stringify(JSON ํ˜•์‹์˜ ๊ฐ์ฒด)

์—ญ์ง๋ ฌํ™”

  • ๋ฌธ์ž์—ด์„ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์ด๋‹ค.
  • ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฌธ์ž์—ด์€ ๊ฐ์ฒด๋กœ ์—ญ์ง๋ ฌํ™” ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์‚ฌ์šฉ๋ฒ• : JSON.parse(JSON ํ˜•์‹์˜ ๋ฌธ์ž์—ด)

 

JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ ์˜ˆ์‹œ ๊ตฌํ˜„

  • JSON์˜ ๊ฒฝ์šฐ response.json()์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋ฉด ํ›จ์”ฌ ํŽธ๋ฆฌํ•˜๋‹ค.
  • ์—ฌ๊ธฐ์„œ๋Š” student๊ฐ€ key : value ์Œ ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ์„œ ๋“ค์–ด์˜ค๊ธฐ ๋•Œ๋ฌธ์—
    querySelector์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ ๋Œ€์‹ , ๋ฐ”๋กœ student.id, student.name๊ณผ ๊ฐ™์ด ๋ฐ”๋กœ ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>JSON</title>
    <style type="text/css">
      table {
        width: 300px;
        height: 100px;
      }
      th,
      td {
        text-align: center;
      }
      .first-view-bg {
        background-color: blueviolet;
      }
      .first-view-color {
        color: ivory;
      }
    </style>
  </head>
  <body>
    <h3>SSAFY ๋ถ„๋ฐ˜</h3>
    <button id="listBtn">ํ•™์ƒ์ •๋ณด๋ณด๊ธฐ</button>
    <table style="display: none">
      <tr>
        <th>ํ•™๋ฒˆ</th>
        <th>์ด๋ฆ„</th>
        <th>๋ถ„๋ฐ˜</th>
        <th>์„ฑ์ </th>
      </tr>
      <tbody id="studentinfo"></tbody>
    </table>
    <script>
      let btn = document.querySelector("#listBtn");
      btn.addEventListener("click", function () {
        // studentsJSON.jsp ๋น„๋™๊ธฐ ํ˜ธ์ถœ
        fetch("studentsJSON.jsp")
      		.then((response) => response.json()) // CSV, XML๊ณผ์˜ ์ฐจ์ด์ 
      		.then((data) => makeList(data))
      });

      function makeList(data) {
        document.querySelector("table").setAttribute("style", "display: ;");
        let tbody = document.querySelector("#studentinfo");
        initTable();
        data.forEach((student) => {
          let tr = document.createElement("tr");

          let idTd = document.createElement("td");
          idTd.appendChild(document.createTextNode(student.id)); // student๊ฐ€ ํ•˜๋‚˜์˜ JSON ๊ฐ์ฒด์ด๋ฏ€๋กœ key๋ฅผ ํ†ตํ•ด ๋ฐ”๋กœ value๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
          tr.appendChild(idTd);

          let nameTd = document.createElement("td");
          nameTd.appendChild(document.createTextNode(student.name));
          tr.appendChild(nameTd);

          let classTd = document.createElement("td");
          classTd.appendChild(document.createTextNode(student.["class"])); // [""]์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ๋„ ๊ฐ€๋Šฅ
          tr.appendChild(classTd);

          let gradeTd = document.createElement("td");
          gradeTd.appendChild(document.createTextNode(student.grade));
          tr.appendChild(gradeTd);

          tbody.appendChild(tr);
        });
        let first = document.querySelector("tr:first-child");
        first.className = "first-view-bg";
        first.classList.add("first-view-color");
        let odd = document.querySelectorAll("tr:nth-child(even)");
        odd.forEach(function (td) {
          td.setAttribute("style", "background: lightgray;");
        });
      }

      function initTable() {
        let tbody = document.querySelector("#studentinfo");
        let len = tbody.rows.length;
        for (let i = len - 1; i >= 0; i--) {
          tbody.deleteRow(i);
        }
      }
    </script>
  </body>
</html>

๐ŸŒŸ ์ •๋ฆฌ

CSV๋Š” comma๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฌธ์ž์—ด, XML์€ ํƒœ๊ทธ๋กœ ๋˜์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ,

JSON์€ JavaScript์˜ ๊ฐ์ฒด๋กœ ํ”„๋กœํผํ‹ฐ์˜ ์ด๋ฆ„๊ณผ ๊ฐ’์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

 

CSV๋Š” ๋ฐ์ดํ„ฐ ์šฉ๋Ÿ‰์ด ๊ฐ€์žฅ ์ž‘์ง€๋งŒ, ๋‚ด์šฉ์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๊ณ ,

XML์€ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด์šฉ ํŒŒ์•…๊ณผ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์— ์œ ๋ฆฌํ•œ ๋ฐ˜๋ฉด, ์šฉ๋Ÿ‰์ด ๊ฐ€์žฅ ํฌ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

JSON์€ CSV์™€ XML์˜ ๋‹จ์ ์„ ๋ชจ๋‘ ๊ทน๋ณตํ•œ ๋ฐ์ดํ„ฐ ํ˜•์‹์ด๋‹ค.

 

CSV์™€ XML์€ ๋ชจ๋‘ response.text()๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜จ๋‹ค๋Š” ๊ณตํ†ต์ ์ด ์žˆ์ง€๋งŒ,

CSV๋Š” '\n'์™€ \,\๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ , XML์€ DOMParser์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์กด์žฌํ•œ๋‹ค.

JSON์€ response.json()์œผ๋กœ ๋ฐ›์•„์˜จ ๋’ค, JSON ๊ฐ์ฒด์˜ ํ‚ค๋ฅผ ํ†ตํ•ด ๋ฐ”๋กœ value๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

'5๏ธโƒฃ CS > Web' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Web] SSR๊ณผ CSR (feat. MPA์™€ SPA)  (2) 2022.09.29
[Web] ์ฟ ํ‚ค์™€ ์„ธ์…˜  (0) 2022.09.22

๋Œ“๊ธ€