- νμ¬
Front-EndμBack-endλ λ€λ₯Έ νκ²½μμ κ°λ°νκ³ μμ - Proxy λ₯Ό μ¬μ©νμ§ μμ
μλ μ°λ νμκ°μ Form μ μμ νλ Internal Server Error 500 κ° λ¬λ€.
function App() {
// const { data, isLoading, refetch } = useQuery("userData", getData, {
// onSuccess: (data) => {
// console.log(data);
// },
// onError: (error) => {
// console.log(error);
// },
// }); // 2023.05.02 νμ¬ GET μμ²λΆλΆμ΄ μμΌλ―λ‘ μ£Όμμ²λ¦¬
const { mutate } = OnPostData();ν΄λΉ μ¬μ λ₯Ό μκ³ λ³΄λ Back-End μμ GET μμ²μ λ°λ λΆλΆμ μμ§ λ§λ€μ§ μμ μκΈ΄ λ¬Έμ
κ°λ¨νκ² GET μμ²μ μ£Όμμ²λ¦¬ νμ¬ ν΄κ²° ν¨
λ‘κ·ΈμΈ μμ²μ μ λλ‘ λ°μμ€λμ§ νμΈνκΈ° μν΄ Form μ μ±μ POST μμ²μ ν¨
ν΄λΉνλ λ°μ΄ν° κ°μ΄ μ‘΄μ¬νμ§ μμ μ failMsg λ₯Ό ν΅ν΄ "λ‘κ·ΈμΈ μ λ³΄κ° μΌμΉνμ§ μμ΅λλ€." λΌλ λ©μΈμ§λ₯Ό λ°μ
Database μ μΌμΉνλ λ°μ΄ν°λ₯Ό λ£κ³ λ€μ POST μμ²
μΌμΉνλ λ°μ΄ν°κ° μμ κ²½μ° ν΄λΉ μμ΄λ λΉλ°λ²νΈ λΏλ§ μλλΌ λ€λ₯Έ μ 보λ μ μμ μΌλ‘ 보μ΄λ κ²μ νμΈ
μΆν ν ν°ν μμ
- κΈ°μ‘΄μ
localhostλ http λ₯Ό κΈ°λ°μΌλ‘ λμνλλ°, http λ₯Ό μ¬μ©νλ©΄ μΏ ν€ μ¬μ©μ λ²κ±°λ‘μμ΄ μμΌλ―λ‘ λ³κ²½ - https λ‘ λ³κ²½νκΈ° μν΄
windowλchoco,macμbrewλ₯Ό μ¬μ©ν΄mksertλ₯Ό μ¬μ© - μ°Έκ³ μλ£ 1 μ°Έκ³ μλ£ 2
"scripts": {
"start": "set HTTPS=true&&react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
} // λ¨μν set HTTPS λ₯Ό μ΄μ©ν΄ https λ₯Ό λ§λ€ μ μλ€.νμ§λ§ μΈμ¦μκ° μμ΄μ μννλ€λ κ²½κ³ λ©μΈμ§κ° μΆλ ₯
κ°λ°νλλ°μλ μ§μ₯μ΄ μμ§λ§ ν΄κ²°ν΄λ³΄λλ‘ νμ
choco install mkcert // choco λ₯Ό μ¬μ©ν΄ mkcert λ₯Ό μ€μΉ
mkcert -install // μΈμ¦μ λ°κΈμ μν΄ ν΄λΉ νλ‘μ νΈμ μ΅μμ λλ ν λ¦¬λ‘ μ΄λ ν μ€μΉ
ν΄λΉνλ key μ cert νμΌμ μμ±ν΄ μ£Όμ΄μΌ νλ―λ‘
mkcert -key-file ./key.pem -cert-file ./cert.pem "localhost"
κ·Έ μ΄ν SSL_CRT_FILE κ³Ό SSL_KEY_FILE μ κ°κ° cert.pem, key.pem μΌλ‘ λ§€μΉ μμΌμ€
"scripts": {
"start": "set HTTPS=true&&set SSL_CRT_FILE=cert.pem&&set SSL_KEY_FILE=key.pem&&react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},npm start
κ²½κ³ μ°½μ΄ μ¬λΌμ§κ³ localhost κ° https λ‘ μ μ μΆλ ₯ λλ κ²μ λ³Ό μ μμ
Back-end μμ header μ Authorization μ λ΄μ μ£ΌκΈ° μν΄ ν
μ€νΈ.
ν
μ€νΈ url μ POST μμ²μ 보λμΌλ©° request:200 μ΄ μ μμ μΌλ‘ λ¨λ κ²μ νμΈ
μλ΅μΌλ‘ λ°μ result μ Bearer + TOKEN κ°μ΄ μ λλ‘ λ΄κ²¨ μ¨ κ²μ νμΈ ν μ μμ
μ΄μ ν΄λΉ ν
μ€νΈ url μ΄ μλ κΈ°μ‘΄μ μ¬μ©νλ api/user/login url μ μ°κ²°
λ³Έ url μΈ api/user/login url μ request-header μ authorization μ΄ μ λλ‘ λ΄κΈ΄ κ²μ νμΈ ν μ μμ
μ΄μ ν΄λΉνλ TOKEN κ°μ localStorage μ λ΄μ μ¬μ© ν κ²
localStorageλ λΈλΌμ°μ λ΄ token μ μ μ₯ν΄ λ€μ μΌλ ν΄λΉ κ°μ μ¬μ©νκΈ° μν¨ (login, logout)- μλ΅μ header (response.header) λ
JSONνμμ΄λ―λ‘ κ·Έλ₯ μ κ·Όνλ©΄ null or undefined μ€λ₯κ° λλ―λ‘JSON.stringifyλ‘ μμ ν΄ μ κ·Όν΄μΌ ν¨
// api.ts
export const postData = async (data: IFormData) => {
return await axios.post(API_URL, data).then((response) => {
if (response.status === 200) {
axios
.post(API_URL, data)
.then((response) => {
console.log(response);
let ACCESS_TOKEN = JSON.stringify(response.headers["authorization"]);
// JSON νμμ΄λ―λ‘ JSON.stringify λ₯Ό μ¬μ©ν΄ μ£Όμ΄μΌ νλ€. (*λμλ¬Έμ μ£Όμ*)
// ACCESS_TOKEN μΌλ‘ μ΄κΈ°ν
console.log(ACCESS_TOKEN);
localStorage.setItem("loginToken", ACCESS_TOKEN);
console.log(localStorage.getItem("loginToken"));
// localStorage μ μ λλ‘ κ°μ΄ λ΄κ²Όλμ§ νμΈνκΈ° μν΄ μ¬μ©
})
.catch((error) => {
console.log(error);
});
}
});
};F12 > application > local storage λ₯Ό νμΈν΄λ³΄λ©΄ ν΄λΉ localStorage μ μ μμ μΌλ‘ Token κ°μ΄ μ μ¬ λ κ²μ λ³Ό μ μμ
//api.ts
// Header μ κ° λ£μ΄μ£Όλ λ°©λ² 1.
export async function getData() {
const request: HeadersInit = new Headers();
// Headers λ‘ μ§μ ν€λλ₯Ό μμ±
let token = await JSON.parse(localStorage.getItem("loginToken") || "{}");
// μ Header μ λ°μμ JSON νμμΌλ‘ λ°κΏ μ¬μ©
// JSON.parse λ ts λ΄μμ || λ‘ λΉ {} κ°μ 보λ΄μ£Όμ΄μΌ type errorκ° λμ§μμ
if (!token) {
throw new Error("error");
} else {
request.set("authorization", token);
// header μ authorization μΌλ‘ κ°μ μΈν
ν
}
return await fetch(BOARD_URL, {
method: "GET",
headers: request, // λ£μ΄μ€
}).then((response) => {
...
// Header μ κ° λ£μ΄μ£Όλ λ°©λ² 2
export const axiosPostData = async (data: IBoardData) => {
return await axios.post(BOARD_URL, data, {
headers: {
Authorization: await JSON.parse(
localStorage.getItem("loginToken") || "{}"
),
},
});
};- κ²μκΈ μμμ 보μΈ
boardλ₯Ό κ°μ Έμ€κΈ° μν΄axiosλ₯Ό μ¬μ© header > AuthorizationμlocalStorageλ₯Ό μ μ¬ν΄ μμ²νλ κ²μ΄ κ΄κ±΄- header μ ν ν°μ΄ μ‘΄μ¬νμ§ μμ μ μμ²μ κ±°λΆν¨
export async function axiosGetData() {
const request: HeadersInit = new Headers();
let token = await JSON.parse(localStorage.getItem("loginToken") || "{}");
// μ Header μ λ°μμ JSON νμμΌλ‘ λ°κΏ μ¬μ©
// JSON.parse λ ts λ΄μμ || λ‘ λΉ {} κ°μ 보λ΄μ£Όμ΄μΌ type errorκ° λμ§μμ
if (!token) {
throw new Error("error");
} else {
request.set("authorization", token);
}
return axios.get(BOARD_URL, {
headers: {
Authorization: token,
},
});
}- κ²μκΈμ μμ±νκΈ° μν΄ μμ
formμ μμ± - μλ μ¬μ©νλ λ‘κ·ΈμΈμ
useQueryμ κ²ΉμΉλ―λ‘renameνμ localStorageμ λ΄κΈ΄ ν ν°μ΄ λ€λ₯΄λ©΄ κΈ μμ± μ Back-End μμ κ΅μ μ΄ λ°λκ² μ€μ
//api.ts
export const OnAxiosPostData = () => {
return useMutation(axiosPostData);
};
export const axiosPostData = async (data: IBoardData) => {
return await axios.post(BOARD_URL, data, {
headers: {
Authorization: await JSON.parse(
localStorage.getItem("loginToken") || "{}"
),
},
});
};
//App.tsx
const {
register: boardReg,
handleSubmit: boardHandle,
setError: boardSetError,
formState: { errors: boardErrors },
} = useForm<IBoardData>();
...
return (
)λ€λ₯Έ ν ν°μΌλ‘ λ‘κ·ΈμΈ ν κΈμ μμ± μ μ μμ μΌλ‘ κ΅μ μ΄ λ°λλ λͺ¨μ΅













