ํ๋ก์ ํธ๋ฅผ ํ๋ ๋ด๋ด
then ๋ฐฉ์์ผ๋ก Spring์ ์์ฒญ์ ๋ณด๋๋ค.
๊ทธ๋ฌ๋ค ๋ค๋ฅธ ๊ธฐ๋ฅ์ ๋ง๋ค๋ฉด์ ์ฝ๋๋ฅผ ์ฐพ์๋ณด๋
async ๋ฐฉ์์ผ๋ก ๋ณด๋ด๋ ๋ฐฉ๋ฒ์ ์๊ฒ๋๋ค.
๋๋ฐฉ๋ฒ์ ์ฐจ์ด๊ฐ ๋ญ๊น?
1. ์ํฉ์ค๋ช

๊ณ ๊ฐ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ค ํ๋ค. ๊ณ ๊ฐ ์ ๋ณด๋ body์ ๋ฃ์ด POST ๋ฐฉ์์ผ๋ก Spring์ ๋ณด๋ด์ง ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด Spring์ React์ ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ ๊ฒ์ด๋ค. ์ด๋ ์กฐ๊ฑด์ด ์๋ค. ๊ณ ๊ฐ ์ ๋ณด์ ๋ค์ด๊ฐ๋ ์ด๋ ์ฝ๋ ๋ฒํธ๊ฐ ์ค๋ณต๋์ด์ ์๋๋ ๊ฒ์ด๋ค. ๋ง์ฝ ์ด๋ ์ฝ๋๊ฐ ์ค๋ณต์ผ ๊ฒฝ์ฐ Spring์์ React๋ก 409๋ฅผ ๋ณด๋ผ ๊ฒ์ด๋ค. React๋ 409๋ฅผ Spring์ผ๋ก๋ถํฐ ๋ฐ์ผ๋ฉด "์ด๋์ฝ๋๊ฐ ์ค๋ณต๋์์ต๋๋ค. ๋ค๋ฅธ ์ฝ๋๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์." ๋ฌธ๊ตฌ๊ฐ ์ฌ์ฉ์ ํ๋ฉด์ alert ๋ ๊ฒ์ด๋ค.
- POST ๋ฐฉ์์ผ๋ก ๋ณด๋ธ๋ค.
- ์ํ ์ฝ๋๊ฐ 409์ธ ๊ฒฝ์ฐ, "์ด๋์ฝ๋๊ฐ ์ค๋ณต๋์์ต๋๋ค. ๋ค๋ฅธ ์ฝ๋๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์." alert
- ok๊ฐ ๋ชป์ค๋ฉด "์ ์ฅ์ ์คํจํ์ต๋๋ค."
2. then ๋ฐฉ์
const handleSubmit = () => {
// ๋ฐฑ์๋๋ก POST ์์ฒญ
fetch("/api/customers", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(form),
})
.then((response) => {
// 409 ์ค๋ณต ์ฝ๋ ์ค๋ฅ ์ฒ๋ฆฌ
if (response.status === 409) {
alert("์ด๋์ฝ๋๊ฐ ์ค๋ณต๋์์ต๋๋ค. ๋ค๋ฅธ ์ฝ๋๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.");
// ๋ค์ then์ผ๋ก ๊ฐ์ง ์๊ณ catch๋ก ๋๊น
throw new Error("DUPLICATE_CODE");
}
// ๋๋จธ์ง ์๋ต ์ค๋ฅ ์ฒ๋ฆฌ
if (!response.ok) {
alert("์ ์ฅ ์คํจ");
throw new Error("SAVE_FAILED");
}
// ๋ค์ then์ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ค
return response.json();
})
...
then ๋ฐฉ์์ ๋น๋๊ธฐํจ์์ด๋ค. ๋งจ ์ฒ์ then์ ๋ณด๊ณ ๋ฌธ์ ์์ผ๋ฉด ๋ค์ then์ผ๋ก ๋์ด๊ฐ๋ ์ฒด์ด๋ ๋ฐฉ์์ผ๋ก, ์ฝ๋์์ ์ฒ๋ฆฌํ ๊ธฐ๋ฅ์ด ์ ์ ๋ ์ฌ์ฉํ๊ธฐ ์ข๋ค. ๊ทธ๋ฌ๋ ๋ก์ง์ด ๋ณต์กํด์ง๋ฉด ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๊ฑฐ๋ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ์ค๊ฐ ์ค๊ฐ์ ํ๊ธฐ ์ด๋ ค์์ง๋ค๋ ๋จ์ ์ด ์๋ค. ๋ฌผ๋ก ๋จ์ ์๋ฌ๋ .catch( )์์ ํ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋ค.
3. async ๋ฐฉ์
try {
// ๋ฐฑ์๋๋ก POST ์์ฒญ
const response = await fetch("/api/customers", {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify(form),
});
// 409 ์ค๋ณต ์ฝ๋ ์ค๋ฅ ์ฒ๋ฆฌ
if (response.status === 409) {
alert("์ด๋์ฝ๋๊ฐ ์ค๋ณต๋์์ต๋๋ค. ๋ค๋ฅธ ์ฝ๋๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.");
return;
}
// ๋๋จธ์ง ์๋ฌ ์ฒ๋ฆฌ
if (!response.ok) {
alert("์ ์ฅ ์คํจ");
return;
}
const savedCustomer = await response.json();
...
} catch (error) {
console.error(error);
alert("์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค."); // ํน์ ๋ชจ๋ฅผ ๋ค๋ฅธ ์๋ฌ๋ค ์ฌ๊ธฐ์ ์ฒ๋ฆฌํ๋๋ก ํจ
}
};
async ๋ฐฉ์์ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๋๊ธฐ์ ์ธ ์ฝ๋์ฒ๋ผ ๋ณด์ด๋๋ก ํด์ค๋ค. ์ด ๋ง์ด ์ดํด๊ฐ ์ ์๋ ์ ์๋ค. ์ฝ๊ฒ ๋งํด์ ์์ฃผ์๊ฐ ํ ์ผ์ ๋ค ๋๋ด์ผ๋ง ๋ค์ ์ฃผ์๊ฐ ์ผ์ ํ ์ ์๋๋ฐ (๋น๋๊ธฐ), async ๋ฐฉ์์ ์ด์ฉํ๋ฉด ์์ฃผ์๊ฐ ํ ์ผ์ ๋ค ๋๋ด์ง ๋ชปํด๋ ๋ค์ ์ฃผ์๊ฐ ์ผ์ ํ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋๋ก ํด์ค๋ค(๋๊ธฐ).
์ฌ๊ธฐ์ ์ค์ ๋ก ๊ทธ๋ ๊ฒ ํ๋ค๋ ๊ฒ์ ์๋๋ค. ๋ง์น์ง ๋ชปํ ์ผ์ ์ ๊น ์ผ์์ ์ง ํด๋๊ณ ๋ค๋ฅธ ์ผ์ ํ๊ณ ๋ ๋ค, ๋ง์น์ง ๋ชปํ๋ ์ผ์ ํ ์ ์๋ ์กฐ๊ฑด์ด ๋์์ ๋ ๋ค์ ์คํํด์ ๋๋ด๋ ๋ฐฉ์์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
๋ณดํต async ๋ฐฉ์์ try-catch์ ํจ๊ป ๋ง์ด ์ด๋ค. ์๋๋ฉด async๋ ์๋ฌ๋ฅผ ๋ฐ๋ ๊ตฌ๋ฌธ์ด ๋ฐ๋ก ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ๊ฒ try-catch ๊ตฌ๋ฌธ๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ ๋ณต์กํ ๋ก์ง๊ณผ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ์ง๊ด์ ์ด๊ฒ ์์ฑํ ์ ์๋๋ก ํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ๋ ๋ง์ด ์ฌ์ฉํ๋ ๋ฐฉ์์ด async ๋ฐฉ์์ด๋ผ๊ณ ํ๋ค.