๐Ÿ’ป ์ฝ”๋”ฉ ์ผ๊ธฐ : [React, Spring] 'JSON ํ˜•์‹ ๋ฐ์ดํ„ฐ ์š”์ฒญํ•˜๊ธฐ' ํŽธ

ybkยท2024๋…„ 5์›” 16์ผ

spring

๋ชฉ๋ก ๋ณด๊ธฐ
34/55
post-thumbnail

๐Ÿ””'JSON ํ˜•์‹ ๋ฐ์ดํ„ฐ ์š”์ฒญํ•˜๊ธฐ'์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!


๐Ÿ’Ÿ JSON(JavaScript Object Notation)

Javascript ๊ฐ์ฒด(Object) ๋ฌธ๋ฒ•์œผ๋กœ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. Javascript ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ๋ฒ•์„ ๋”ฐ๋ฅด๋ฉฐ Javascript์˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ธ ๋ฌธ์ž์—ด, ์ˆซ์ž, ๋ฐฐ์—ด, ๋ถˆ๋ฆฌ์–ธ, ๊ฐ์ฒด๊ฐ€ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. JSON์˜ ํ”„๋กœํผํ‹ฐ๋ช…์€ ํฐ ํƒ€์˜ดํ‘œ๋กœ ๋ฌถ์–ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ง๋ ฌํ™”(serializtion, stringify, encoding) : ๊ฐ์ฒด๊ฐ€ JSON(text)์œผ๋กœ ๋ฐ”๋€” ๋•Œ
  • ์—ญ์ง๋ ฌํ™”(parsing, deserialization, decoding) : JSON(text)์ด ๊ฐ์ฒด๋กœ ๋ฐ”๋€” ๋•Œ

JSON์€ GET, POST ๋ฐฉ์‹์ผ ๋•Œ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ GET ์š”์ฒญ์€ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  POST ์š”์ฒญ์€ ์š”์ฒญ ๋ณธ๋ฌธ์— JSON ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— POST ์š”์ฒญ์ผ ๋•Œ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


์ง๋ ฌํ™”์™€ ์—ญ์ง๋ ฌํ™” ์˜ˆ์ œ


React(App.jsx)

import React from "react";
import axios from "axios";

function App(props) {
  function handleClick1() {
    const obj1 = { name: "son", age: 44 };
    // const json1 = JSON.stringify(obj1);

    axios.post("/api/main41/sub1", obj1);
  }

  return (
    <div>
      <button onClick={handleClick1}>์š”์ฒญ(Json ๋ฐ์ดํ„ฐ ํฌํ•จ)</button>
    </div>
  );
}

export default App;
  • axios๊ฐ€ ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๊ฐ์ฒด๋ฉด ์ž๋™์œผ๋กœ ์ง๋ ฌํ™” ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„๋กœ JSON.stringify() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • axios๋ฅผ ์‚ฌ์šฉํ•ด์„œ POST ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์ž์—ด๋กœ ์ง๋ ฌํ™”ํ•˜์—ฌ ์š”์ฒญ ๋ณธ๋ฌธ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

Spring Boot(Controller41.java)

@Controller
@RequestMapping("/api/main41")
public class Controller41 {

    @PostMapping("sub1")
    public void sub1(@RequestBody Map<String, Object> map) {
        // ์—ญ์ง๋ ฌํ™”(JSON -> Map)
        System.out.println("map = " + map);
    }
}
  • @RequestBody Map<String, Object> map : ์š”์ฒญ ๋ณธ๋ฌธ์— ํฌํ•จ๋œ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ํŒŒ์‹ฑํ•ด์„œ Map์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ›์Šต๋‹ˆ๋‹ค.

๐Ÿ’Ÿ React์—์„œ ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ JSON ํ˜•์‹์œผ๋กœ Spring Boot ์„œ๋ฒ„๋กœ ์ „์†ก


React(App.jsx)

import React, { useState } from "react";
import axios from "axios";

function App(props) {
  const [name, setName] = useState("");
  const [city, setCity] = useState("");

  function handleClick3() {
    // const data = {
    //   name : name,
    //   city : city
    // }

    // const data = {
    //   name,
    //   city
    // };

    axios.post("/api/main41/sub3", { name, city });
  }

  return (
    <div>
      <div>
        <input type="text" onChange={(e) => setName(e.target.value)} />
        <br />
        <input type="text" onChange={(e) => setCity(e.target.value)} />
        <br />
        <button onClick={handleClick3}>์š”์ฒญ</button>
      </div>
    </div>
  );
}

export default App;
  • input์— name๊ณผ city๋ฅผ ์ž…๋ ฅํ•˜๋ฉด onChange๋ฅผ ํ†ตํ•ด setXXX ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  handleClick3() ํ•จ์ˆ˜์—์„œ input์— ์ž…๋ ฅํ•œ ๊ฐ’์„ axios๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ POST ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์š”์ฒญ ๋ณธ๋ฌธ์— { name, city } ๊ฐ์ฒด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

Spring Boot(Controller41.java)

@Controller
@RequestMapping("/api/main41")
public class Controller41 {
    @PostMapping("sub3")
    public void sub3(@RequestBody Map<String, Object> map){
        System.out.println("map = " + map);
    }
}
  • POST ์š”์ฒญ์„ ๋ฐ›๊ณ  @RequestBody๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ ๋ณธ๋ฌธ์— ํฌํ•จ๋œ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ Map ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ›์Šต๋‹ˆ๋‹ค.

๐Ÿ’Ÿ JSON ๋ฐ์ดํ„ฐ ํƒ€์ž…


React(App.jsx)

import React from "react";
import axios from "axios";

function App(props) {
  // json ๋ฐ์ดํ„ฐ ํƒ€์ž… : ๋ฌธ์ž์—ด,์ˆ˜, ๋ถˆ๋ฆฌ์–ธ, ๊ฐ์ฒด, ๋ฐฐ์—ด, null

  function handleClick1() {
    const data = {
      name: "son",
      age: 33,
      married: false,
      team: {
        location: "london",
        name: "ํ† ํŠธ๋„˜",
      },
      item: ["phone", "shoes", "shirts"],
      address: null,
    };
    axios.post("/api/main41/sub5", data);
    //   {"name":"son","age":33,"married":false,
    //  "team":{"location":"london","name":"ํ† ํŠธ๋„˜"},
    //  "item":["phone","shoes","shirts"],"address":null}
  }

  return (
    <div>
      <button onClick={handleClick1}>json ๋ฐ์ดํ„ฐ์™€ ์š”์ฒญ</button>
    </div>
  );
}

export default App;
  • ๋ณธ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ : {"name":"son","age":33,"married":false, "team":{"location":"london","name":"ํ† ํŠธ๋„˜"}, "item":["phone","shoes","shirts"],"address":null}

Spring Boot(Controller41.java)

@PostMapping("sub5")
public void sub5(@RequestBody Map<String, Object> map){
    System.out.println("map = " + map);
}
  • JSON ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ํ•ด๋‹น ํƒ€์ž…์œผ๋กœ ํŒŒ์‹ฑ๋ฉ๋‹ˆ๋‹ค.

    map = {name=son, age=33, married=false, team={location=london, name=ํ† ํŠธ๋„˜}, item=[phone, shoes, shirts], address=null}
    name.getClass() = class java.lang.String
    age.getClass() = class java.lang.Integer
    item.getClass() = class java.util.ArrayList
    married.getClass() = class java.lang.Boolean
    team.getClass() = class java.util.LinkedHashMap


๐Ÿ’Ÿ ์ „์†ก ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฐ”๋นˆ์œผ๋กœ ๋‹ด์•„ ์š”์ฒญ


React(App.jsx)

import React from "react";
import axios from "axios";

function App(props) {

  function handleClick3() {
    axios.post("/api/main41/sub7", {
      name: "lee",
      height: 170.5,
      info: {
        address: "korea",
        city: "seoul",
      },
      foods: ["pizza", "pasta"],
      married: false,
    });
  }

  return (
    <div>
      <button onClick={handleClick3}>json ๋ฐ์ดํ„ฐ์™€ ์š”์ฒญ</button>
    </div>
  );
}

export default App;
  • handleClick3() ๋ฉ”์„œ๋“œ์—์„œ /api/main41/sub7 ๊ฒฝ๋กœ์— POST ์š”์ฒญ ๋ณด๋‚ด๊ณ  ์š”์ฒญ ๋ณธ๋ฌธ์— {name, height, info{address, city}, foods, married} ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

Spring Boot(MyBean412.java)

@Data
public class MyBean412 {
    private String name;
    private Double height;
    private Map<String, Object> info;
    private List<String> foods;
    private boolean married;
}
  • React์—์„œ ์ „์†กํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ์ž๋ฐ”๋นˆ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Spring Boot(Controller41.java)

@Controller
@RequestMapping("/api/main41")
public class Controller41 {

    @PostMapping("sub7")
    public void sub7(@RequestBody MyBean412 bean412){
        System.out.println("bean412 = " + bean412);
    }
}
  • React์—์„œ ์ „์†กํ•œ ๊ฐ์ฒด๋ฅผ ์ž๋ฐ”๋นˆ(MyBean412)์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ›์Šต๋‹ˆ๋‹ค.
profile
๊ฐœ๋ฐœ์ž ์ค€๋น„์ƒ~

0๊ฐœ์˜ ๋Œ“๊ธ€