Library/React

React์™€ Spring ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ ์—ฐ๋™

์„œ๋ฆฌโ˜… 2024. 6. 12. 11:33

๐Ÿš€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
โ–ช  IDE : VScode 1.90.0, STS 3.9.18

โ–ช  JAVA : JDK 11.0.22

โ–ช  Spring : SpringFramework 5.0.2.
โ–ช  WAS : Apache Tomcat v9.0.89

 

์ „์ฒด ํŒŒ์ผ์€ ๋‚˜์ค‘์— ์‹œ๊ฐ„์ด ์ƒ๊ธฐ๋ฉด ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

 

 


 

1. React์—์„œ Spring์œผ๋กœ GET(Query String) ๋ฐฉ์‹์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

 

๐Ÿ“‘ React : Spring.jsx

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

const Spring = () => {
  const [id, setId] = useState("");
  const [pw, setPw] = useState("");

  function tryLoginGet() {
    axios({
      url: `http://localhost:8081/myapp/loginget?id=${id}&pw=${pw}`,
    }).then((res) => {
      console.log(res);
    });
  }
  return (
    <div>
      <h1>React Spring ์—ฐ๊ฒฐ</h1>
      <h3>Login</h3>
      ID : <input onChange={(e) => setId(e.target.value)}></input>
      <br></br>
      PW : <input onChange={(e) => setId(e.target.value)}></input>
      <br></br>
      <button onClick={tryLoginGet}>๋กœ๊ทธ์ธ ์‹œ๋„ (GET)</button>
    </div>
  );
};

export default Spring;

 

 

๐Ÿ“‘ Spring : ReactController.java

package com.smhrd.myapp;

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ReactController {
	
	@RequestMapping(value="/loginget")
	public String loginGet(@RequestParam("id") String id, @RequestParam("pw") String pw) {
		System.out.println("React GET ํ†ต์‹ !");
    	System.out.println("ID : " + map.get("inputId"));
		System.out.println("PW : " + map.get("inputPw"));
		return "SUCCESS";
	}
}

 

 


 

2. React์—์„œ Spring์œผ๋กœ POST ๋ฐฉ์‹์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

 

๐Ÿ“‘ React : Spring.jsx

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

const Spring = () => {
  const [id, setId] = useState("");
  const [pw, setPw] = useState("");

  function tryLoginPost() {
    axios({
      url: "http://localhost:8081/myapp/loginpost",
      method: "post",
      data:
        inputId: id,
        inputPw: pw,
      }),
    }).then((res) => {
      console.log(res);
    });
  }

  return (
    <div>
      <h1>React Spring ์—ฐ๊ฒฐ</h1>
      <h3>Login</h3>
      ID : <input onChange={(e) => setId(e.target.value)}></input>
      <br></br>
      PW : <input onChange={(e) => setPw(e.target.value)}></input>
      <br></br>
      <button onClick={tryLoginPost}>๋กœ๊ทธ์ธ ์‹œ๋„ (POST)</button>
    </div>
  );
};

export default Spring;

 

 

๐Ÿ“‘ Spring : ReactController.java

package com.smhrd.myapp;

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@CrossOrigin
public class ReactController {

	@RequestMapping(value="/loginpost", method = RequestMethod.POST)
	public String loginPost(@RequestBody HashMap<String, Object> map) {
		System.out.println("React POST ํ†ต์‹ ");
		System.out.println("ID : " + map.get("inputId"));
		System.out.println("PW : " + map.get("inputPw"));
		return "SUCCESS";
	}
}

 

 


 

3. Spring์—์„œ React๋กœ POST ๋ฐฉ์‹์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

 

 Spring์˜ ReactController์—์„œ ArrayList ๋ฐ์ดํ„ฐ๋ฅผ React ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ React Server์˜ console์„ ํ™•์ธํ•˜๋ฉด ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“‘ Spring : ReactController.java

package com.smhrd.myapp;

import java.util.ArrayList;
import java.util.HashMap;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.smhrd.myapp.model.SpringMember;

@RestController
@CrossOrigin
public class ReactController {

  @RequestMapping(value="/sendData", method=RequestMethod.POST)
  public ArrayList<SpringMember> sendData() {
    // SpringMember Class ํ•„์š”!!!
  	String[] mArr = new String[3];
  	SpringMember m1 = new SpringMember("Kim", "1234", "010-1234-5678", "๊ด‘์ฃผ");
  	SpringMember m2 = new SpringMember("Lee", "5678", "010-4567-8901", "์ „์ฃผ");
  	SpringMember m3 = new SpringMember("Park", "9012", "010-2345-6789", "๋ถ€์‚ฐ");
  	ArrayList<SpringMember> mArr = new ArrayList<SpringMember>();
  	mArr.add(m1);
  	mArr.add(m2);
  	mArr.add(m3);
  	return mArr;
  }
}

 

 

๐Ÿ“‘ React : Spring.jsx

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

const Spring = () => {

  function getData() {
    axios({
      url: "http://localhost:8081/myapp/sendData",
      method: "POST",
    }).then((res) => {
      console.log(res);
    });
  }

  return (
    <div>
      <h1>React Spring ์—ฐ๊ฒฐ</h1>
      <button onClick={getData}>Spring์—์„œ Data ๊ฐ€์ ธ์˜ค๊ธฐ (POST)</button>
    </div>
  );
};

export default Spring;

 

 


 

4. React์™€ Spring ๋ฐ์ดํ„ฐ ์—ฐ๋™ ์‹œ ๋ฐœ์ƒํ–ˆ๋˜ ์—๋Ÿฌ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

 

๐Ÿ’ฅ CORS(Cross-Origin Resource Sharing) ์ •์ฑ…์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•œ ์—๋Ÿฌ

 

โ— ์—๋Ÿฌ ๋‚ด์šฉ

 

 Access to XMLHttpRequest at 'http://localhost:8081/myapp/loginreact' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

 

๐Ÿ”จ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

 

1. React ํ”„๋กœ์ ํŠธ์˜ package.json ํŒŒ์ผ์— ์•„๋ž˜์ฒ˜๋Ÿผ Spring ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ์ฃผ์†Œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.

 

 

 

2. Spring ํ”„๋กœ์ ํŠธ์˜ Controller ํŒŒ์ผ์—์„œ @RestController ํ•˜๋‹จ์— '@CrossOrigin' ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

 

 


 

๐Ÿ’ฅ Request failed with status code 415

 

โ— ์—๋Ÿฌ ๋‚ด์šฉ

 

ERROR
 Request failed with status code 415 AxiosError: Request failed with status code 415 at settle (http://localhost:3000/static/js/bundle.js:42835:12) at XMLHttpRequest.onloadend (http://localhost:3000/static/js/bundle.js:41501:66) at Axios.request (http://localhost:3000/static/js/bundle.js:41988:41)

 

โ“ ์—๋Ÿฌ ์›์ธ

 

 React์™€ Spring ๋ฐ์ดํ„ฐ ์—ฐ๋™ ์‹œ์— Java์—์„œ JSON ๊ฐ์ฒด๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•ด์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ

 

๐Ÿ”จ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

 

 Java๊ฐ€ JSON ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹น Spring ํ”„๋กœ์ ํŠธ์˜ pom.xml ํŒŒ์ผ์— ์•„๋ž˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

gson์„ ์‚ฌ์šฉํ•˜๋ฉด Java๊ฐ€ JSON ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ณ  ๋˜ํ•œ Spring์—์„œ React๋กœ ArrayList ํ˜•์‹์œผ๋กœ ๋ณด๋‚ผ ๋•Œ ์ž๋™์œผ๋กœ ํ‚ค๊ฐ’์ด ์„ค์ •๋˜์–ด ํŽธ๋ฆฌํ•˜๋‹ค. gson์ด ์—†์œผ๋ฉด ํ‚ค๊ฐ’์„ ์ผ์ผ์ด ๋ถ€์—ฌํ•ด์•ผ ํ•œ๋‹ค.

 

<!-- JSON ๊ฐ์ฒด ์‚ฌ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -->
<!-- React์—์„œ Spring์œผ๋กœ POST ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ ํ•ด๊ฒฐ -->
<dependency>
	<groupId>com.google.code.gson</groupId>
	<artifactId>gson</artifactId>
	<version>2.8.7</version>
</dependency>