๐Ÿ’ป ์ฝ”๋”ฉ ์ผ๊ธฐ : [React, Spring] 'Spring Boot์—์„œ React๋กœ ๋ฐ์ดํ„ฐ ์‘๋‹ตํ•˜๊ธฐ ' ํŽธ

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

spring

๋ชฉ๋ก ๋ณด๊ธฐ
35/55

๐Ÿ”” 'Spring Boot์—์„œ React๋กœ ๋ฐ์ดํ„ฐ ์‘๋‹ตํ•˜๊ธฐ'์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!


๐Ÿ’Ÿ Spring Boot ์‘๋‹ตํ•˜๊ธฐ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญ์„ ํ•˜๊ณ  ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ตํ•  ๋•Œ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ JSON์œผ๋กœ ๋ณด๋‚ด๋ฉด axios๋Š” ํŒŒ์‹ฑํ•ด์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด ํ™”๋ฉด์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

React(App.jsx)

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

function App(props) {
  const [result, setResult] = useState("");
  
  function handleClick2() {
    axios.get("/api/main42/sub2").then((param) => setResult(param.data));
  }

  return (
    <div>
      <button onClick={handleClick2}>์‘๋‹ต ๋ฐ›๊ธฐ</button>
    </div>
  );
}

export default App;

  • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด handleClick2 ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœํ•˜๊ณ  axios๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๋กœ GET ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • GET ์š”์ฒญ ์ดํ›„, .then() ๋ฉ”์„œ๋“œ๋Š” ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๊ณ  ์‘๋‹ต์ด ๋„์ฐฉํ–ˆ์„ ๋•Œ ์‹คํ–‰๋  ์ฝœ๋ฐฑ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
    then() ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ param์€ ์‘๋‹ต ๊ฐ์ฒด์ด๋ฉฐ param.data๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ˜ํ™˜ํ•œ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Spring Boot(Controller42.java)

@Controller
@RequestMapping("/api/main42")
public class Controller42 {

    @GetMapping("sub2")
    @ResponseBody
    public String method2() {
        double random = Math.random();
        if (random < 1.0 / 3) {
            return "๊ฐ€์œ„";
        } else if (random < 2.0 / 3) {
            return "๋ฐ”์œ„";
        }
        return "๋ณด";
    }
}
  • @ResponseBody ์–ด๋…ธํ…Œ์ด์…˜์ด ์—†๊ณ  return์„ ํ•œ๋‹ค๋ฉด ๋ฐ”๋กœ view๋กœ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์‘๋‹ต ๋ณธ๋ฌธ์œผ๋กœ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด @ResponseBody` ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ /api/main42/sub2 ๊ฒฝ๋กœ๋กœ GET ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ€์œ„, ๋ฐ”์œ„, ๋ณด ๋ฌธ์ž์—ด์„ ๋žœ๋คํ•˜๊ฒŒ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์ด ์‘๋‹ต์€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋‹ค์‹œ ์ „๋‹ฌ๋˜์–ด ํ™”๋ฉด์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’Ÿ Map ์‚ฌ์šฉํ•ด์„œ ๊ฐ์ฒด๋กœ ์‘๋‹ตํ•˜๊ธฐ

์Šคํ”„๋ง์—์„œ map ๊ฐ์ฒด๋กœ ์‘๋‹ตํ•œ ๊ฒƒ์„ JSON์œผ๋กœ ๋ฐ”๊พธ๊ณ  JSON์„ ๊ฐ์ฒด๋กœ ๋ฐ”๊ปด์„œ ํ™”๋ฉด์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

React(App.jsx)

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

function App(props) {

  function handleClick4() {
    axios.get("/api/main42/sub4").then((param)=> console.log(param.data));
  }

  return (
    <div>
        <button onClick={handleClick4}>JSON ์‘๋‹ต ๋ฐ›๊ธฐ</button>
    </div>
  );
}

export default App;
  • handleClick2() : ์„œ๋ฒ„๋กœ GET ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์‘๋‹ต ๋ฐ์ดํ„ฐ(param.data)๋ฅผ JSON ํ˜•์‹์— ๋งž๊ฒŒ ์ฝ˜์†”์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    {
    "name": "ํ™๊ธธ๋™",
    "age": 22,
    "married": false,
    "info": {
    "team": "ํ† ํŠธ๋„˜",
    "location": "๋Ÿฐ๋˜"
    },
    "item": ["์ปดํ“จํ„ฐ", "์Šค๋งˆํŠธํฐ"]
    }


Spring Boot(Controller42.java)

@Controller
@RequestMapping("/api/main42")
public class Controller42 {
    @GetMapping("sub3")
    @ResponseBody
    public Map<String, Object> method3(){
        return Map.of("name", "ํ™๊ธธ๋™", "age", 22,
                "married", false,
                "info", Map.of("team", "ํ† ํŠธ๋„˜", "location", "๋Ÿฐ๋˜"),
                "item", List.of("์ปดํ“จํ„ฐ", "์Šค๋งˆํŠธํฐ"));
    }
}
  • /api/main42/sub3 GET ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , Map ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ JSON ํ˜•์‹์˜ ์‘๋‹ต์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด ์‘๋‹ต์€ "name", "age", "married", "info", "item" ๋“ฑ์˜ ํ‚ค์™€ ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’Ÿ ์ž๋ฐ”๋นˆ ์‚ฌ์šฉํ•ด์„œ ์‘๋‹ตํ•˜๊ธฐ

React(App.jsx)

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

function App(props) {

  function handleClick5() {
    axios.get("/api/main42/sub5").then((param)=> console.log(param.data));
  }

  return (
    <div>
        <button onClick={handleClick5}>JSON ์‘๋‹ต ๋ฐ›๊ธฐ</button>
    </div>
  );
}

export default App;
  • handleClick5() : ์„œ๋ฒ„๋กœ GET ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์‘๋‹ต ๋ฐ์ดํ„ฐ(param.data)๋ฅผ JSON ํ˜•์‹์— ๋งž๊ฒŒ ์ฝ˜์†”์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    {
    "name": "๊ฐ•์ธ",
    "height": 177.7,
    "info": {
    "name": "ํฅ๋ฏผ",
    "age": 55,
    "desc": "ํฅ๋ฏผ๋‹˜์€ 55์‚ด์ž…๋‹ˆ๋‹ค."
    },
    "foods": [
    "๊ฐ์ž",
    "๊ณ ๊ตฌ๋งˆ"
    ],
    "married": false
    }


์ž๋ฐ”๋นˆ(MyBean411.java)

@Data
public class MyBean411 {
    private String name;
    private Integer age;

    public String getDesc(){
        return name + "๋‹˜์€ " + age + "์‚ด์ž…๋‹ˆ๋‹ค.";
    }
}
  • ์ž๋ฐ”๋นˆ์— get ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ํ•ด๋‹น ๋ฉ”์„œ๋“œ์— ์˜ํ•ด ๊ฒฐ์ •๋œ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด JSON์œผ๋กœ ์‘๋‹ต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Spring Boot(Controller42.java)

@Controller
@RequestMapping("/api/main42")
public class Controller42 {
    @GetMapping("sub5")
    @ResponseBody
    public MyBean411 method5(){
        MyBean411 obj = new MyBean411();
        obj.setName("ํ™๊ธธ๋™");
        obj.setAge(22);
        return obj; // JSON์œผ๋กœ ์ง๋ ฌํ™”
    }
}
  • /api/main42/sub3 GET ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , Map ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ JSON ํ˜•์‹์˜ ์‘๋‹ต์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด ์‘๋‹ต์€ "name", "age", "married", "info", "item" ๋“ฑ์˜ ํ‚ค์™€ ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
profile
๊ฐœ๋ฐœ์ž ์ค€๋น„์ƒ~

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