๐ค ์ค๋์ ์๋ฌ
React Proxy ์ค์ ์ค, ์ค๋์ ์๋์ ๊ฐ์ด ๋ ์๋ฌ๋ฅผ ๋ง๋ฌ๋ค.
GET http://localhost:3001/api/todos 404 (Not Found)
Uncaught (in promise) SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON
๐ง ์ฒ์ ์์ฑํ ์ฝ๋
๋ ํฌ์งํ ๋ฆฌ ์์๋ Bookservice๋ฅผ ์ ๊ณตํ๋ api ํด๋์ Todoservice๋ฅผ ์ ๊ณตํ๋ api2๋ผ๋ ๋ ํด๋๊ฐ ์๋ค. ์ค์ ๋ก ํ๋ก์ ํธ ๋ฐ ์ค๋ฌด๋ฅผ ํ ๋๋ ์ด๋ ๋ฏ ํ๋์ ๋๋ฉ์ธ์ด ์๋ ์ฌ๋ฌ ๊ฐ์ ๋๋ฉ์ธ์์ ์๋ต์ ๋ฐ์์์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์๋ค. ์ด๋ด ๋๋ ์ ์ฐํ๊ฒ proxy๋ฅผ ์ค์ ํ ํ์๊ฐ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก webpack dev server์ ์ ์ญ์ ์ธ proxy ์ค์ ๋์ , http-proxy-middleware์ proxy ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ Bookservice์ Todoservice 2๊ฐ์ ๋๋ฉ์ธ์์ ๋ชจ๋ ์๋ต์ ๋ฐ์์์ผ ํ๋ค.
๋ฐ๋ผ์ BookService.js์๋ api์ ๊ด๋ จ๋ fetch ํจ์๋ฅผ, TodoService.js์๋ api2์ ๊ด๋ จ๋ fetch ํจ์๋ฅผ ๋ง๋ค๊ณ , ์ปดํฌ๋ํธ๋ฅผ ํ๋ ์ด์ ๋ง๋ค์ด 2๊ฐ์ ๋๋ฉ์ธ์์ ๋ชจ๋ ์๋ต์ ๋ฐ์์ค๋์ง ํ ์คํธ ํด๋ณด๊ณ ์ ํ๋ค. webpack dev server proxy๋ฅผ ์ฌ์ฉํ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก, ๊ธฐ์กด์ fetch (ํน์ axios๋ ๊ฐ๋ฅ)๋ฅผ ํตํด ์์ฒญํ๋ ๋ถ๋ถ์์ ๋๋ฉ์ธ ๋ถ๋ถ์ ์ ๊ฑฐํด์ผ ํ๊ธฐ์ ์๋์ ๊ฐ์ด ์ ์ด์ฃผ์๋ค.
// my-app > src > services > BookService.js
export const getAllBooks = async () => {
const response = await fetch("/api/books");
return await response.json();
};
export const createBook = async (data) => {
const response = await fetch("/api/book", {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({book: data})
})
return await response.json();
}
๊ฒฐ๋ก ์ ์ผ๋ก ๋งํ์๋ฉด, ์๋ TodoService.js์์ ์๋ชป๋ API๋ก ์์ฒญํ๊ณ ์์๊ธฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด์๋ค.
// my-app > src > services > TodoService.js
export const getAllTodos = async () => {
const response = await fetch("/api/todos");
return await response.json();
};
export const createTodo = async (data) => {
const response = await fetch("/api/todo", {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({todo: data})
})
return await response.json();
}
๐ก ์๋ฌ ์์ธ ํ์
1. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ > Network ํญ์์ ์ดํด๋ณด๊ธฐ
๋ชจ๋ my-app, api, api2 ๋ชจ๋ ์๋ฒ๋ฅผ ๋ค ์ผ๋์๋ค๋ ์ ์ ํ์, ๋ธ๋ผ์ฐ์ ์์์ ์คํ ํ ๊ฐ๋ฐ์๋๊ตฌ๋ฅผ ์ผ๊ณ 'Network' ํญ์ ์ดํด๋ณด๋ฉด ์ด๋์ ๋ ๋ต์ด ๋์ฌ ๊ฒ์ด๋ค. ์์ ์ฌ์ง์์๋ ๋ณด์ด๋ฏ, ํ์ฌ TodoService.js์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค. todo ๋ฐ์ดํฐ๋ฅผ ์ ์์ ์ผ๋ก ์๋ต๋ฐ์ง ๋ชปํ๊ณ ์๋ค. ์ด๋ฅผ ํด๋ฆญํด๋ณด์.
2. Source ํญ์ ์ฐธ๊ณ ํด ๋๋ฒ๊น ํด๋ณด๊ธฐ
Source ํญ์ ๋๋ฌ๋ณด๋ฉด ์ ํํ ์ด๋ค ๋ถ๋ถ์ผ๋ก ์ธํด ์๋ฌ๊ฐ ๋ฐ์ํ๋์ง ์๋ ค์ค๋ค. ์ด๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ฒ๊น ์ ํฐ ๋์์ด ๋๋ค. ์ด์ด์๊ฒ๋ TodoService๋ api๊ฐ ์๋๋ผ, 'api2'๋ก ๋ฐ์์์ผ ํ๋๋ฐ api๋ก ์จ๋์๊ธฐ ๋๋ฌธ์ด์๋ค. ์ฆ, ์๋ฒ๊ฐ ์ ๊ณตํ๋ API ์๋ํฌ์ธํธ(api2)๊ฐ ์๋, ์๋ชป๋ API(api)๋ก ์์ฒญํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
์๋์ ๊ฐ์ด TodoService.js์์ api๋ฅผ api2๋ก๋ง ์์ ํ๋ฉด ๋์ด๋ค.
// my-app > src > services > TodoService.js
export const getAllTodos = async () => {
const response = await fetch("/api2/todos");
return await response.json();
};
export const createTodo = async (data) => {
const response = await fetch("/api2/todo", {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({todo: data})
})
return await response.json();
}
๊ทธ๋ผ ์๋์ ๊ฐ์ด BookService์ books์ TodoService์ todos๋ฅผ ์ ๋ฐ์์ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค!
๐ Today I learned
์ง๊ธ ๋์๋ณด๋ฉด ๊ต์ฅํ ์ด์ด์๋ ๊ณณ์์ ์ค์๋ฅผ ํ๋ค. ๋ณ์๊ฐ์์ด ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ๋ฅผ ํ ํ์ด๋ค.
๋ญ ์ค์๋ ํ ์ ์์ง๋ง, ์ด๋ ๊ฒ ๋น ๋ฅด๊ฒ ๋๋ฒ๊น ์ ํ๋ฉฐ ๋ฌธ์ ๋ฅผ ํ์ ํ๊ณ ํด๊ฒฐํ๋ฉด ๋๋๊ฑฐ๋๊น!
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ๊ธฐ๋กํด์ ๋ค์์๋ ๊ฐ์ ์ค์๋ฅผ ํ์ง ์๋๋ก!
'๐ ์ฝ์ง ๋ ธํธ > ์๋ฌ ํด๊ฒฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CSS ์ฐ์ ์์] ๋ถํธ์คํธ๋ฉ์ ์ฌ์ฉํ๋๋ฐ ์ ์คํ์ผ ์ ์ฉ์ด ์๋์ง? (0) | 2023.08.24 |
---|---|
gitignore์ node_modules๋ฅผ ์ถ๊ฐํ๋๋ฐ๋ Changes๋ชฉ๋ก์ ๋จ๋ ์ด์ (2) | 2023.06.12 |
<h>์ ๋ฒํผ ์์ฑ์ ๋ถ์ฌํ๋ฉด .. (0) | 2023.05.22 |
Route, Routes๋ฅผ BrowserRouter๋ก ๊ฐ์ธ์ฃผ์ง ์์ผ๋ฉด.. (0) | 2023.05.19 |
ํธ์๊ฐ ์๋ ๋, ์ผ๋จ 'stash'๋ก ์จ๊ธฐ์ (0) | 2023.03.31 |
๋๊ธ