728x90
지금까지 json 을 엄청 나게 많이 사용하고 또 사용할때마다 정리를 했었다. 그런데 이제보니 JSON 이 제대로 무엇이고 JAVA 에서 어떻게 만들 수 있고, 어떻게 전달하고 하는 그런 것들에 대해서 적어놓은 글이 없다는 것을 깨달았다.
또한 JSON 과 함께 많이 쓰이는 XML 에 대해서도 이번 기회에 정리해놓고자 한다.
JSON JavaScript Object Notation
JavaScript Object Notation라는 의미의 축약어로 데이터를 저장하거나 전송할 때 많이 사용되는 경량의 DATA 교환 형식
- JSON 은 참으로 위대한 자료형이다. 만들기 쉽고, 보내기 쉽고, 알기 쉽다!
- JSON 은 기본적으로 { KEY : VALUE } 형식으로 이루어져 있다. 이는 자바에서의 hashmap 과 비슷한 방식이라고 생각하면 된다.
- JSON은 좀 더 쉽게 데이터를 교환하고 저장하기 위하여 만들어진 텍스트 기반의 데이터 교환 표준입니다.
- JSON은 자바스크립트를 기반으로 만들어졌습니다. 자바스크립트에 대한 기초 지식이 있으면 배우기 수월합니다.
- JSON은 XML의 대안으로서 좀 더 쉽게 데이터를 교환하고 저장하기 위하여 고안되었습니다.
- JSON은 텍스트 기반이므로 어떠한 프로그래밍 언어에서도 JSON 데이터를 읽고 사용할 수 있습니다.
- JAVA 에서 json 형식으로 데이터를 주고 받을 때 이러한 json 형태를 만드는 방법은 크게 2가지가 있다. 하나는 직접 데이터 형식 그대로 내가 직접 만들어주는 것이고, 다른 하나는 JSON 관련 라이브러리를 이용해서 쉽게! 만드는 것이다.
1. 직접 만드는 JSON
- 사실 아래 코드는 이번에 학원에서 했던 프로젝트 중 내가 만들었던 채팅 기능을 만들면서 사용한 코드이다. 이때 이상하게 json 라이브러리를 생각하지 못해서 굉장히 무식하게...직접 json 을 만들었다.
- chatList 라는 배열에서 nickName과 detail , time 을 끌어와서 result 라는 JSON 으로 저장한다. 이때 굉장히 무식하게? 내가 직접 json 형태로 만들어서 프론트에 있는 jsp 로 내용을 던지게 만들었다.
- 딱 봐도 복잡하고, 무엇보다 데이터를 추가할때마다 에러가 뿜뿜 미친듯이 터져서 정말 많이 고생했었다.
- 이 채팅 부분에 대해서는 추후 따로 정리할 예정이다.
// 전체 채팅 내역을 조회해온 후 JSON 형태로 묶어서 return 하는 메소드
private String getChatList(int rno) {
StringBuffer result = new StringBuffer("");
result.append("{\"result\":[");
// 여기는 rno 가 들어가야함
ArrayList<ChatVO> chatList = dao.getChatList(rno);
//System.out.println("size : "+chatList.size());
try {
for(int i = 0; i < chatList.size(); i++) {
// 이렇게 직접...만들었습니다ㅠㅠ
result.append("[ {\"value\": \"" + chatList.get(i).getNickname() + "\"},");
result.append("{\"value\": \"" + chatList.get(i).getCdetail() + "\"},");
result.append("{\"value\": \"" + chatList.get(i).getCtime() + "\"}]");
if(i != chatList.size() -1) result.append(",");
}
result.append("], \"last\":\"" + chatList.get(chatList.size() - 1).getCno() + "\"}");
//System.out.println("size : "+chatList.size());
return result.toString();
}catch(Exception e) {
return "";
}
}
// 가장 최신의 채팅 내역만 조회해온 후 JSON 형태로 잘라서 return 하는 메소드
private String getRecentList(int rno, int cno) {
//System.out.println("실행중");
StringBuffer result = new StringBuffer("");
result.append("{\"result\":[");
try {
// 여기는 rno 가 들어가야함
ChatVO chat = dao.getRecentChat(rno, cno);
// 결과를 가져올 수 있다면 JSON 형태로 묶음
if(chat !=null) {
result.append("[ {\"value\": \"" + chat.getNickname() + "\"},");
result.append("{\"value\": \"" + chat.getCdetail() + "\"},");
result.append("{\"value\": \"" + chat.getCtime() + "\"}]");
result.append("], \"last\":\"" + chat.getCno() + "\"}");
return result.toString();
}else {
return "";
}
}catch(Exception e) {
e.getMessage();
return "";
}
}
}
2. 스마트하게 JSON 라이브러리 사용하기
- json 관련 라이브러리가 많은 것으로 알고 있는데 가장 간편하게 사용할 수 있는 라이브러리는 json-simple 라이브러리이다.
https://code.google.com/archive/p/json-simple/downloads
- 보통 아래 2가지 객체와 메소드를 가장 많이 사용한다.
- JSONArray 의 경우 ArrayList 와 메소드가 비슷하다
클래스 | 메서드명 | 설명 |
JSONObject | put(key, value) | key 와 value 를 이용해 json 형태로 만듦 |
get(key) | key 를 기준으로 value 를 Object 타입으로 return 한다. | |
JSONArray | add(JSONObject) | json 타입의 객체를 배열에 저장함 |
get(index num) | 해당 index 에 맞는 json 객체를 가져온다. |
1) 서버의 역할 jsp : json 파일을 만들어서 묶어서 프론트로 전달
<%@page import="org.json.simple.JSONArray"%>
<%@page import="org.json.simple.JSONObject"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 여기서 반복문을 안써서 그렇지 직접 만드는 것보다 10배는 간단하고 보기 좋다!
// json 배열
JSONArray gameArray = new JSONArray();
// 게임 정보 하나가 들어갈 JSON Object 선언
JSONObject game = new JSONObject();
// json 객체에 key : value 를 넣는다
// 넣을 때는 당연히 put(key, value)
game.put("title", "LoL");
game.put("price", "무료");
game.put("OS", "window, mac");
gameArray.add(game);
// 게임 정보 하나가 들어갈 JSON Object 선언
JSONObject game2 = new JSONObject();
game2.put("title", "HOTS");
game2.put("price", "무료");
game2.put("OS", "window, mac");
gameArray.add(game2);
// 게임 정보 하나가 들어갈 JSON Object 선언
JSONObject game3 = new JSONObject();
game3.put("title", "스타필드");
game3.put("price", "미정");
game3.put("OS", "window");
gameArray.add(game3);
// 게임 정보 하나가 들어갈 JSON Object 선언
JSONObject game4 = new JSONObject();
game4.put("title", "모여봐요 동물의 숲");
game4.put("price", "52000");
game4.put("OS", "Nintendo SWITCH");
gameArray.add(game4);
// 보낼때는 String 으로 보내야함
response.getWriter().write(gameArray.toJSONString());
%>
2) json 데이터를 전달받아 출력할 프론트 jsp
- 전달받은 json 은 당연히 배열 형식이다 => JSONArray 로 전달받았기 때문에
- 프론트에서 출력할때 for 문을 사용하는데 기존의 for 문과 약간의 차이가 있다.
- 마치 java 에서의 향상된 for 문처럼 for(임의의 변수 : 반복할 객체) 으로 선언 후 사용한다. 이때 임의의 변수는 객체의 길이 즉 length 가 되고 따라서 객체[임의의변수] 를 넣어서 배열의 요소를 꺼내 올 수 있다.
- 배열객체[임의의변수].key 를 사용하면 key 기준으로 value 를 가져올 수 있다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
$(function(){
$("input").on("click", function(){
$.ajax({
url: "server05.jsp",
type : "GET",
dataType : "JSON",
success : function(data){
// JSONArray.toJSONString() 로 날아오면 java 의 배열로 온다고 생각하면됨
console.log(data)
// for 문을 돌리면서 data 에서 요소를 꺼내옴
// 이때 꺼내온 요소는 json 형태가 될꺼고, json 형태에서 다시 각 key 를 기준으로 value 를 가져옴
// key : dname, loc, deptno
for(num in data){
console.log(data[num].title)
console.log(data[num].price)
console.log(data[num].OS)
$("ul").append(
"<li>"+
data[num].title +
" : "+
data[num].price+
" : "+
data[num].OS+
"</li>"
)
}
}
})
})
})
</script>
</head>
<body>
<input type="button" value="출력" />
<div>
<ul>
<li>내용 출력</li>
</ul>
</div>
</body>
</html>
- JS 에서의 for문은 아래와 같은 문법으로도 사용 가능하다.
// key : value 의 json 형태
// JS에서 json 을 만들고
var list2 = {"a":"AAAA", "b":"BBBB", "c":"CCCC"};
console.log(list2["a"])
// 이쪽이 진짜 향상된 for 문
// for 문을 사용해서 임의의 변수 key 를 사용해서 list2 배열안의 값을 key 기준으로 가져온다
for(key in list2){
console.log(key+" : "+list2[key]);
} */
XML : eXtensible Markup Language
- XML은 데이터를 저장하고 전달할 목적으로 만들어졌으며, 저장되는 데이터의 구조를 기술하기 위한 언어입니다.
- XML은 EXtensible Markup Language의 약자로, 수많은 응용 분야에서 데이터를 저장하고 전달하는 중요한 역할을 맡고 있습니다.
- XML를 배우기 전에 HTML, 자바스크립트 등의 기초 지식이 필요합니다.
- 난 별로 안 좋아한다 -> 일단 만들기가 어렵다(가장 중요), 사용하는 것도 설정파일에서 많이 사용하고 보통 다른 곳에서는 json 을 더 많이 사용하는 듯 하다.
1. xml 전달 & 전달받기
- 웹에서 xml 의 값을 가져오기 위해서는 jquery 에서 아래 문법을 사용한다.
- jquery 의 each 문법을 사용해 넘어온 결과에 대해서 반복문을 돌린다 ⇒ java 의 향상된 for 문 느낌?
- xml 을 받아온 데이터를 find.(xml태그명)과 find.(xml태그명).text() 를 사용해 태그명을 기준으로 값을 가져올 수 있다.
- $(data).find("game")
- var price = $(this).find("price").text();
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
// 1. 출력 버튼을 클릭하면 콘솔에 메시지 출력
// 2. server02.xml 에서 게임 정보 가져와서 출력
$(function(){
$("input").on("click", function(){
$.ajax({
url : "server02.xml",
type : "GET",
dataType : "XML",
success : function(data){
// 받아온 결과값 data
// data 에 대해서 반복문 돌리기 => 이때 gamelist 태그 찾아서 해당 태그에 대해서 반복
$(data).find("game").each(function(){
// 아래에서 this 는 현재 반복되는 객체를 의미
var title = $(this).find("title").text();
var price = $(this).find("price").text();
var os = $(this).find("OS").text();
// 반복되는 값을 하나로 묶어서 text 변수에 저장
var text = "<li>" + title +" : "+ price +" : "+ os +"</li>";
// ul 밑 li 에 출력
$("ul").append(text);
})
}
})
})
})
2) 전달되는 xml 파일 구조
<?xml version="1.0" encoding="UTF-8"?>
<gamelist>
<game>
<title>LOL</title>
<price>무료</price>
<OS>window, mac</OS>
</game>
<game>
<title>HOTS</title>
<price>무료</price>
<OS>window, mac</OS>
</game>
<game>
<title>스타필드</title>
<price>미정</price>
<OS>Window</OS>
</game>
<game>
<title>모여봐요 동물의 숲</title>
<price>52000</price>
<OS>Nintendo SWITCH</OS>
</game>
</gamelist>
JSON 과 XML 의 공통점과 차이점
공통점
- 둘 다 데이터를 저장하고 전달하기 위해 만들어졌다
- 둘 다 기계뿐만 아니라 사람도 쉽게 읽을 수 있따 -> 사람이 쉽게 만들 수 있다
- 둘 다 계층적인 데이터 구조를 가집니다.
- 둘 다 다양한 프로그래밍 언어에 의해 파싱될 수 있습니다 => 대표적으로 JAVA 와 JS , Python 에서 등등 모두 사용 가능하다
- 둘 다 XMLHttpRequest 객체를 이용하여 서버로부터 데이터를 전송받을 수 있다
- 둘다 key : value 느낌을 갖는다 => json 은 보여지는 것도 key : value 형태고, xml 역시 태그가 key, 안에 있는 내용이 value 로 보면 비슷하다
차이점
JSON은 종료 태그를 사용하지 않는다 => 대신 중간중간 , 와 { } 처럼 열고 닫기가 필수이다.
JSON의 구문이 XML의 구문보다 더 짧다 => 만들기 더 쉽다
JSON 데이터가 XML 데이터보다 더 빨리 읽고 쓸 수 있다
XML은 배열을 사용할 수 없지만, JSON은 배열을 사용할 수 있다 => 데이터를 가져올 때도 xml 은 배열로 가져오지 못하지만 json 은 배열로 가져 올 수 있다
XML은 XML 파서로 파싱되며, JSON은 자바스크립트 표준 함수인 eval() 함수로 파싱된다
Reference
https://derveljunit.tistory.com/214
댓글