JSON

์ง€๋‚œ ๋ฒˆ ํฌ์ŠคํŒ…์—์„œ Restful API๊ด€ํ•˜์—ฌ ์ž์„ธํžˆ ์•Œ์•„๋ณด๋‹ค๊ฐ€ ๊ณต๊ฐœ๋œ OPEN API ๋Œ€๋ถ€๋ถ„ JSON์„ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค. ์œ„ ํฌ์ŠคํŒ…์—์„œ๋Š” JSON์˜ ๊ฐœ๋…๊ณผ ์–ด๋– ํ•œ ํ˜•์‹์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ณ  JSON์— ๊ด€๋ จ๋œ Library๊ฐ€ ๋ฌด์—‡์ด ์žˆ๋Š”์ง€ ์•Œ์•„๋ณธ๋‹ค.

1. JSON(JavaScript Object Notation)์ด๋ž€?

  • JSON์€ ๊ฒฝ๋Ÿ‰(Lightweight)์˜ DATA-๊ตํ™˜ ํ˜•์‹
  • Javascript์—์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ‘œํ˜„์‹์„ ์˜๋ฏธํ•œ๋‹ค.
  • JSON ํ‘œํ˜„์‹์€ ์‚ฌ๋žŒ๊ณผ ๊ธฐ๊ณ„ ๋ชจ๋‘ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ ์šฉ๋Ÿ‰์ด ์ž‘์•„์„œ, ์ตœ๊ทผ์—๋Š” JSON์ด XML์„ ๋Œ€์ฒดํ•ด์„œ ๋ฐ์ดํ„ฐ ์ „์†ก ๋“ฑ์— ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.
  • ํŠน์ • ์–ธ์–ด์— ์ข…์†๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ JSON ํฌ๋งท์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ธ๋“ค๋ง ํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

2. JSON(JavaScript Object Notation) ํ˜•์‹

2.1 Name-value ํ˜•์‹์˜ ์Œ(pair)

  • ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์–ธ๋“ค์—์„œ object, hashtable, struct๋กœ ์‹คํ˜„๋˜์—ˆ๋‹ค.
  • { String key : String Value}
{
  "firstName": "Kwon",
  "lastName": "YoungJae",
  "email": "kyoje11@gmail.com"
}

2.2 ๊ฐ’๋“ค์˜ ์ˆœ์„œํ™”๋œ ๋ฆฌ์ŠคํŠธ ํ˜•์‹

  • ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์–ธ์–ด๋“ค์—์„œ ๋ฐฐ์—ด(Array), ๋ฆฌ์ŠคํŠธ(List)๋กœ ์‹คํ˜„๋˜์—ˆ๋‹ค.
  • [ value1, value2, โ€ฆ ]
{
  "firstName": "Kwon",
  "lastName": "YoungJae",
  "email": "kyoje11@gmail.com",
  "hobby": ["puzzles","swimming"]
}

3. JSON Library - Jackson(Java) ์ ์šฉํ•˜๊ธฐ

  • JSON์€ ์‰ฝ๊ฒŒ ๊ฐ์ฒด(Object)๋กœ ๋ฐ”๊ฟ”์ฃผ๊ฑฐ๋‚˜ ๊ฐ์ฒด(Object)๋ฅผ JSON์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” Library๊ฐ€ ๋Œ€๋ถ€๋ถ„ ์–ธ์–ด์—์„œ ์กด์žฌํ•œ๋‹ค.
  • Jackson : https://github.com/FasterXML/jackson
  • Spring Framework ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ด๊ฒ ๋‹ค.

3.1 Maven์˜ pom.xml์˜ ์ถ”๊ฐ€ํ•˜๊ธฐ

  • Jackson์ด๋ผ๊ณ  ์น˜๋ฉด ๊ฐ€์žฅ ์œ„์— ๋ณด์ด๋Š” Jackson Databind๋ฅผ ์„ ํƒํ•œ๋‹ค.

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.1</version>
</dependency>

3.2 @ResponseBody๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JSONํ˜•ํƒœ๋กœ ์‘๋‹ตํ•˜๊ธฐ

  • Controller๋ฅผ ํ†ตํ•ด View๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ(JSON OR XML)๋ฅผ ๋„˜๊ฒจ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

  • Spring 3.1์—์„œ๋ถ€ํ„ฐ mvc:annotation-driven</mvc:annotation-driven>์„ ์‚ฌ์šฉํ•˜๋ฉด HttpMessageConverter๊ฐ€ ์ž๋™์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค.

  • @ResponseBody : Return ๊ฐ’์€ View๋ฅผ ํ†ตํ•ด์„œ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ HTTP Response Body์— ์ง์ ‘์“ฐ์—ฌ์ง„๋‹ค.

  • annotation-driven ํ™œ์„ฑํ™” ํ•˜๊ธฐ

<mvc:annotation-driven></mvc:annotation-driven>
  • RestfulController์˜ getUserList ์ฝ”๋“œ
@RequestMapping(value = "/users", method = RequestMethod.GET)
@ResponseBody
public Map getUserList(){
  List<Offer> userList = offersService.getCurrent(); // DB์— ๋“ฑ๋ก๋œ User List๋ฅผ ๋ฐ›์•„์˜จ๋‹ค.
  Map result = new HashMap();
 
  result.put("result",Boolean.TRUE);
  result.put("data",userList);
 
  return result;
}

3.3 ์„œ๋ฒ„๋ฅผ ์ž‘๋™์‹œ์ผœ ํ™•์ธํ•ด๋ณด๊ธฐ.

  • RequestMapping๋œ ์ฃผ์†Œ์ธ http://localhost:8080/users ํ™•์ธํ•ด๋ณด์ž.

  • ๊ฒฐ๊ณผ ๋ชจ์Šต : ์ž˜ ๋„์ฐฉํ–ˆ์ง€๋งŒ ๋ณด๊ธฐ๊ฐ€ ๋ถˆํŽธํ•˜๋‹ค.

3.4 PostMan์„ ํ†ตํ•ด ์˜ˆ์˜๊ฒŒ ๋ณด์ž.

  • Postman์ด๋ผ๋Š” ํฌ๋กฌ ์•ฑ์„ ํ†ตํ•ด ์˜ˆ์˜๊ฒŒ ๋ณผ ์ˆ˜๋„ ์žˆ๊ณ  ๋‹ค์–‘ํ•œ ํ…Œ์ŠคํŠธ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Download : https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop
  • ๊ฒฐ๊ณผ ๋ชจ์Šต : ์˜ˆ์œ ๋ชจ์Šต์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Reference