ํ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค๊ฐ ์คํ๋ง๋ถํธ์ React๋ฅผ ์ฐ๋ํด์ผ ํ๋ ์ํฉ์ ๋ง์ฃผํ๋ค.
๋ฐฑ์๋์ ์ฐ๋ํ ๋ CORS ์ด์์ ๋ํ ๋ด์ฉ์ Express.js ์ฐ๋ํ ๋ ์ด๋ฏธ ํ๋ฒ ๊ฒช์ด ๋ณด์๊ณ , ์ธํฐ๋ท์ ํตํด์ ์ธ์ง๋ฅผ ํ๊ณ ์์์ง๋ง, ๋ง์ ๋ง์ฃผํ๋๊น ํผ๋์ค๋ฌ์ ๋ค.
ํ์ง๋ง ๋ฐฑ์๋์ ํ๋ก ํธ์๋๋จ์ด ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์์ผํ๊ณ CORS ์ด์๊ฐ ์ ๋ฐ์ํ๋์ง์ ๋ํด ์์ธํ๋ ์๋๋๋ผ๋ ๋์ถฉ์ ์๊ณ ์์๋ค!
CORS์ ๋ํด์๋ ๊ณต๋ถํ๊ณ ๋์ค์ ๊ธฐ๋กํด๋์์ผ๊ฒ ๋ค.
๊ทธ๋์ ์ค๋์ ์ด ์ด์๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ์์ฑํด๋ณด๋ ค๊ณ ํ๋ค.
ํด๊ฒฐ ๊ณผ์
์ฒซ ๋ฒ์งธ ํด๊ฒฐ
์ฐ์ ์ฒ์์ ๋ฆฌ์กํธ์ ์คํ๋ง๋ถํธ๋ฅผ ์ฐ๋ํ๊ธฐ ์ํด์ ์ฒซ๋ฒ์งธ๋ก ์๋ํ ๋ฐฉ๋ฒ์ ๋ฆฌ์กํธ ํ๋ก์ ํธ ํด๋์ package.json์ proxy๋ฅผ ์ถ๊ฐํ๋๊ฒ์ด์๋ค.
๋ฆฌ์กํธ๋ localhost:3000์์ ๋์ํ๊ณ , ์๋ฒ(์คํ๋ง๋ถํธ)๋ localhost:8082 ์์์ ๋์ํ๋ค.
๋ฆฌ์กํธ์์ localhost:8082 ๋ก ์์ฒญํ์ ๋, ์๋ต์ ๋ฐ์์ผํ๋๋ฐ ๋ฐ๋ก ์ค์ ์์ด๋ ๋ฐ์ง ๋ชปํ๋ค.
๊ทธ๋์ ๋ฐ๋ก ์ค์ ์ ํด์ค์ผํ๋๋ฐ, ๋๋ฆฌ ์๋ ค์ง ๋ฐฉ๋ฒ์ด package.json ์ proxy๋ฅผ ์ค์ ํด์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด๋ฐ์์ผ๋ก ์ค์ ํด์ค๋ค.
๊ทผ๋ฐ ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ๋ด ๊ฐ์ธ ๋ ธํธ๋ถ์์๋ ๋ฌธ์ ์์ด ์๋์ด ๋ฌ๋๋ฐ, ํ์ ์ปดํจํฐ์์๋ ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ์ถ๋ ฅ๋๋ฉด์ ๋ฆฌ์กํธ ์ฑ์ด ์คํ์กฐ์ฐจ ๋์ง ์์๋ค.
Invalid options object. Dev Server has been initialized using an options object that does not match the API schema.
- options.allowedHosts[0] should be a non-empty string.
ํด๊ฒฐ์ ํ๋ ค๊ณ ๊ตฌ๊ธ๋ง์ ํ๋๋ฐ, ๋ด๊ฐ ๊ฒช์ ์ํฉ๊ณผ ๋๊ฐ์ ์ํฉ์ ๊ฒช์ ๋ถ์ด ๊ณ์
จ๋ค.
https://velog.io/@yunso/%EB%A6%AC%EC%95%A1%ED%8A%B8-%ED%94%84%EB%A1%9D%EC%8B%9C-%EC%97%90%EB%9F%AC
์ด ๋ถ์ ์ ์ ๋ ๋์ ํซ์คํ์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ์ง๋ง, ์ฐ๋ฆฌ๋ ๊ทธ๋ด ์ ์๋ ํ๊ฒฝ์ด ์๋์๋ค.
๊ทธ๋ฐ๋ฐ ๋ฆฌ์กํธ์์ ํ๋ก์ ์ค์ ์ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค๋ ๊ฑธ ์๊ฒ๋์๋ค.
http-proxy-middleware ๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ค.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด, package.json ์ proxy ๋ฅผ ์ถ๊ฐํ๋๊ฒ ๋์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก proxy ๋ฅผ ์ค์ ํ๋ค.
proxy ์ค์ ๊ณผ์
- npm i http-proxy-middleware ๋ฅผ ํฐ๋ฏธ๋์ ์ ๋ ฅํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
- src ํด๋ ๋ด๋ถ์ setProxy.js ํ์ผ ์์ฑ
- ํ์ผ ๋ด๋ถ๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ
const { createProxyMiddleware } = require("http-proxy-middleware");
module.exports = function (app) {
app.use(
createProxyMiddleware("/api/v1", {
target: "http://localhost:8082",
changeOrigin: true,
})
);
};
ํ๋ก์๋ฅผ ์ ๋ฐฉ๋ฒ์ผ๋ก ์ค์ ํด์ฃผ๋๊น ๋ฆฌ์กํธ๋ฅผ ์คํํ๋๋ฐ์์ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์๋ค!
๋๋ฒ์งธ ํด๊ฒฐ
์ด์ ๋ฆฌ์กํธ์์ ๋ฐฑ์๋์ ์์ฒญ์ ๋ณด๋ด์ผํ๋ค.
๊ทธ๋ฐ๋ฐ ์ญ์ ์์๋๋ก ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
Access to XMLHttpRequest at 'http://localhost:8082/Join.do' from origin 'http://localhost:3000' has been blocked by CORS policy : Response to preflight request doesn't pass access control check: 'Access-Control-Allow-Origin' header is present on the requested resouce.
์์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๊ทธ๋์ ์์๋ณด๋๊น, ์คํ๋ง๋ถํธ์ชฝ์์๋ CORS ๊ด๋ จํ์ฌ ์ค์ ํด์ฃผ๋ ์ฝ๋๋ฅผ ์์ฑํด์ผํ๋ค๊ณ ํ๋ค.
์ค์ ๊ณผ์
- ์์ ๊ฐ์ด WebMvcConfig ํด๋์คํ์ผ์ ์์ฑํ๋ค.
- ํด๋์ค ํ์ผ ๋ด๋ถ๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
++
์ฌ๋ฌ ๋ธ๋ก๊ทธ๋ฅผ ์ดํด๋ดค์ง๋ง, ์ด ๋ถ๋ถ์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ค์ํ๋ค.
๋๋ https://devlog-wjdrbs96.tistory.com/429 ์ด ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ฑํ๋ค.
์ด๋ ๊ฒ ์ค์ ํด์ฃผ์๋๋
Access to XMLHttpRequest at 'http://localhost:8082/Join.do' from origin 'http://localhost:3000' has been blocked by CORS policy : Response to preflight request doesn't pass access control check: 'Access-Control-Allow-Origin' header is present on the requested resouce.
์ ์๋ฌ๋ฉ์์ง๋ ๋ ์ด์ ์ถ๋ ฅ๋์ง ์์๋ค.
์ธ๋ฒ์งธ ํด๊ฒฐ
ํ์ง๋ง ์์ง ๋๋๊ฒ ์๋์๋ค.
์ด๋ฒ์ ๋ค๋ฅธ ์๋ฌ๋ฅผ ๋ณผ ์ ์์๋ค.
๊ทธ๋์ ๋ญ๊ฐ ๋ฌธ์ ์ธ๊ฐ ๊ณ ๋ฏผ์ ๋ง์ดํ๋ค.
์๋ ๋ถ๋ช ์ค์ ํ ๊ฑด ๋ค ์ค์ ํ ๊ฒ ๊ฐ์๋ฐ..? ์ฐ๋ฆฌ ํ๋ก์ ํธ๋ ์์ง ์คํ๋ง ์ํ๋ฆฌํฐ ์ ์ฉ๋ ํ์ง ์์๋๋ฐ..?
์ด๊ฑด ๋ญ์ง?? ์ถ์๋ค.
์๋ฌ๋ฉ์์ง๋ฅผ ์ฝ๊ณ ์ถ์ธกํด๋ณด๋ ํ๋ก ํธ์์ HTTP ok status๋ฅผ ๋ชป๋ฐ๋๋ค๋ ์๋ฌ ๊ฐ์๋ค.
๊ทธ๋์ ๋ ์๊ฐํด๋ดค๋ค.
ํ ์คํธ์ฉ์ผ๋ก http://localhost:8082/Join.do ์ฃผ์์ ์์ฒญ์ ๋ณด๋์๋ ์๋ฒ์์ "success" ๋ผ๋ ๋ฌธ์์ด์ ๋ฆฌํดํ๋๋ก ์ปจํธ๋กค๋ฌ์ ์ฝ๋๋ฅผ ์์ฑํด๋จ๋๋ฐ, ํน์ HTTP ์ํ ์ฝ๋๋ฅผ ๋ฆฌํดํด์ผํ๋ ์ถ์๋ค.
๊ทธ๋์ ResponseEntity ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , HttpStatus.OK ์ ๋ฆฌํดํ๋๋ก ๋ฉ์๋๋ฅผ ์์ ํ๋๋ฐ๋ ๊ฐ์ ์ค๋ฅ๊ฐ ์ถ๋ ฅ๋๋ค.
๊ทธ๋์ ์ฝ๋๋ฅผ ๋ค์ํ๋ฒ ์ดํด๋ดค๋๋, ๋ฐฑ์๋์์ ๋งตํํ๋ ๊ฒฝ๋ก๊ฐ http://localhost:8082/Join.do ์ด ์๋๋ผ http://localhost:8082/join.do ์ด์๋ค...
๋ด๊ฐ ๋์ผ๋ก ํ์ธํ์ด์ผํ๋๋ฐ! ๊ทธ๋๋ก ์ฝ๋๋ฅผ ์ ๋ฌ๋ฐ๊ณ ๊ธํ๊ฒ ์ฐ๋ํ๋๋ผ ํ์ธ์ ์ ๋๋ก ๋ชปํ๋ค ใ ใ ใ ..
๊ทธ๋์ ๋ฐฑ์๋ ๋งตํ ์ค์ ์ join.do ๋ก ๋ฐ๊พธ๊ณ ์์ฒญ์ ๋ณด๋๋๋...
๋๋ค! ํ๋ก ํธ๋ ๋ฐฑ์๋๋ ํต์ ์ด ๋๋ค๊ณ !
๊ฐ๊ฒฉ์ค๋ฌ์ด ์๊ฐ์ด์๋ค.
์ด์ ์ด๋ ๊ฒ ๋ง๋ฌด๋ฆฌํ๊ณ ๊น์ PUSH ํ๋ค!
๋ค๋ฒ์งธ ํด๊ฒฐ
์ด๋ ๊ฒ ์ ๋ง๋ฌด๋ฆฌ ๋๋์ค ์์์ผ๋, ํ ๊ฐ์ง ๊ณ ๋ คํ์ง ๋ชปํ์ ์ด ๋ ์์๋ค.
์ด๊ฑด ๋ด๊ฐ ์์ธ์ ์๋ ๋ถ๋ถ์ด๋ผ ํด๊ฒฐํ๋๋ฐ ์ด๋ ค์์ด ์์๋ค.
์ฐ์ ๋ด๊ฐ ๋ฐฑ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋๊ธธ๋, JSON.stringify ๋ก JSON ์ ๋ฌธ์์ด๋ก ๋ฐ๊ฟ์ ๋ณด๋์ด์ผํ๋๋ฐ ์ด๊ฑธ ๊น๋นกํ๋ค.
์ด๋ ๊ฒ ๋ณด๋์ด์ผํ๋๋ฐ, data๋ฅผ ๊ทธ๋ฅ ์ฉ์ผ๋ก ๋ณด๋ด๋ฒ๋ ธ๋๊ฒ..
๊ทธ๋ฆฌ๊ณ ์คํ๋ง๋ถํธ์์ ์ด๋ ๊ฒ ์ ๋ฌ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์๋, ๋ฌธ์์ด๋ก ๋ณด๋์ผ๋๊น String์ผ๋ก ๋ฐ์ผ๋ฉด ๋๊ฒ ์ง? ๋ผ๊ณ ์๊ฐํ์ง๋ง ์ด๊ฑด Wrong Think ์๋ค.
์ ๋ ๊ฒ JSON ์ ๋ฌธ์์ด๋ก ๋ฐ๊พธ๊ณ ๋ณด๋๋๋ฐ ์ ์๋ผ์ง? ๋ง๋๋ฐ ์ ์๋ผ? ๋ฅผ ์ฐ๋ฌ์ ์ธ์น ๋ด๊ฐ ๋ถ๋๋ฌ์ ๋ค.
์ ํ ๋ง๋๊ฒ ์๋์๋ค.
์คํ๋ง์์ JSON ์ ๋ฐ์๋ String์ด ์๋๋ผ HashMap ์๋ฃํ์ผ๋ก ๋ฐ์์ผํ๋ค.. ใ
์คํ๋ง์์ ํด๋น ๋ฉ์๋์ ๋งค๊ฐ๋ณ์ ํ์ ์ HashMap ์ผ๋ก ๋ฐ๊พธ๊ณ ๋ฐ์ผ๋๊น ์์ฃผ ์ ๋ฐ์์ง๋ค!