๊ณ ๊ฐ ๋ช ๋จ ํ๋ฉด์ ๋์ฐ๋ฉด DB์ ์ ์ฅ๋ ๋ช ๋จ์ ๊ฐ์ ธ์ ๋ณด์ฌ์ค์ผํ๋ค.
๊ทธ๋ฌ๋ ์๋ก๊ณ ์นจ์ ํ๊ฑฐ๋ ๋ค์ ํญ์ ๋ค์ด์ค๋ฉด
DB์ ์ ๋ณด๊ฐ ์ ์ฅ๋์ด ์์ด๋ ํ๋ฉด์ ๊ฐ์ ธ์ค์ง ๋ชปํ๋ค.
๊ทธ๋์ ์ด ๋ถ๋ถ์ ๊ฐ์ ํด๋ณด๊ณ ์ ํ๋ค.
1. ํ๊ฒฝ์ค์
- ํ๋ก ํธ์๋ = React + Vite +WebStorm
- ๋ฐฑ์๋ = Spring + IntelliJ
- DB = MySQL + MySQLWorkbench
2. ๋ฌธ์ ์
- ํ๋ฉด
sori๋ฅผ ์ถ๊ฐํ์ฌ ์ ์ฅํ๋ค. MySQLWorkbench๋ฅผ ์ดํด๋ณด๋ฉด ์ ๋๋ก ์ ์ฅ๋์ด์๋ค. ์ด์ ๋ค์ ํ๋ฉด์ผ๋ก ๋์๊ฐ์ ์๋ก๊ณ ์นจ์ ํ๋ค. ๋ฑ๋ก๋๋ sori๊ฐ ์ฌ๋ผ์ก๋ค. ํ์ง๋ง ์ฌ์ ํ MySQLWorkbench์๋ ์ ์ ์ฅ๋์ด์๋ ์ํ์๋ค. ์ ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑธ๊น?
- ์๋ ์ฝ๋
// ํ๋ฉด์ ๋ณด์ฌ์ค ๊ณ ๊ฐ ๋ชฉ๋ก
const [rows, setRows] = useState([]);
useState๋ ํ๋ฉด์ ์ ๋ฐ์ดํธ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค. React๋ฅผ ์ค์นํ๋ฉด ๋์ค๋ ์ด๊ธฐ ํ๋ฉด์์๋ useState๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์๋ ๋งํฌ๋ฅผ ํ๊ณ ๋ค์ด๊ฐ๋ฉด ์ฝ๊ฒ ๊ทธ ์๋ฅผ ํ์ธํ ์ ์๋ค.
์ถ๊ฐํ ๊ณ ๊ฐ์ ์ ๋ณด๊ฐ ๋ฐ๋ก ํ๋ฉด์ ๋ฐ์๋๋๋ก ํ๊ธฐ ์ํด useState๋ฅผ ์ฌ์ฉํ๋ค. ๊ทธ๋ฌ๋ฉด ์ ๋ณด๊ฐ ์์์ ์ ์ง๋ ์ค ์์๋๋ฐ, ์๋ก๊ณ ์นจ์ ํ๋ ์ฌ๋ผ์ก๋ค. ์ useState๋ ์๋ก๊ณ ์นจ์ ์ฌ๋ผ์ง๋๊ฑธ๊น?
์ผ๋จ ๊ทธ ์ด์ ๋ฅผ ๋งํ๊ธฐ ์ ์, useState์ ๋ํด ์๋ฉด ๋ ์ข๋ค. useState๋ ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ผ๋ก ๋ง๊ทธ๋๋ก ๋ฐฐ์ด์ ๊ตฌ์กฐ๋ฅผ ๋ถํดํ๋ ํํ๋ฅผ ๋งํ๋ค. [rows, setRows] ์ด๋ฐ ํํ๋ฅผ ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด๋ผ๊ณ ํ๋ค. ๊ทธ๋์ useState๋ ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด๋ฅผ ์ฌ์ฉํ๋ฉด์ [something, setSomething]๊ณผ ๊ฐ์ ๋ณ์์ ์ด๋ฆ์ ์ง์ ํ๋ค. ์ ์ฒด์ ์ผ๋ก ์ด๋ป๊ฒ ์ฐ๋์ง๋ฅผ ์ดํด๋ณด์. const [ํ์ฌ state(์ฒ์์ ์ด๊ธฐ๊ฐ์ด ๋ค์ด์ด), ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ setํจ์] = useState(์ด๊ธฐ๊ฐ); ์ด๋ ๊ฒ ์ ๋๋ค.
useState ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ค. ํ๋ฉด์ ๋ณด์ฌ์ค ๊ณ ๊ฐ ๋ชฉ๋ก์ useState๋ก ๋ฉ๋ชจ๋ฆฌ์ ์๊ฒ ๋ง๋ค์์ผ๋, ๋ฉ๋ชจ๋ฆฌ ํน์ง์ด ์ ์ฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ์ ํน์ง์ ํญ์ ๋ซ๊ฑฐ๋ ์๋ก๊ณ ์นจ์ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ด๊ธฐํ๋๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ์๋ก๊ณ ์นจ์ ํ๋ฉด ์ด๊ธฐ๊ฐ์ธ useState([]);๊ฐ ๋์ด ์๋ฌด๊ฒ๋ ๋ณด์ด์ง ์๊ฒ ๋๋ค. ์ด์ ๋ฌธ์ ๋ฅผ ์๊ฒ ๋๋ค. ๋ฌธ์ ๋ฅผ ์๊ฒ๋๋๊น ์ด๊ฒ ๋น์ฐํ๊ฒ ๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋์ง ์๋ฌธ์ด๋ค! ๊ฐ๋ฐํ๋ค๋ณด๋ฉด ์ธ์ ๋ '์ด๋ฐ ๊ฒ๋ ๊ตฌํํด์ผํ๋๊ฑฐ์๊ตฌ๋...'ํ๊ณ ์๊ฐํ๊ฒ ๋๋ค. ์ด์ ๋ฌธ์ ๋ฅผ ๊ณ ์ณ๋ณด์!
useState – React
The library for web and native user interfaces
ko.react.dev
3. ์ฝ๋ ์์
- ์ด๋ป๊ฒ?
์ฒ์์ ์๊ฐํ์๋ ๋๋์ ์ธ ๊ณต์ฌ๊ฐ ์ด๋ค์ง ๊ฒ ๊ฐ์๋ค. ์ ์ฅ ๋ฒํผ์ ๋๋ ์ ๋๋ถํฐ ๋ค ๋ฏ์ด ๊ณ ์ณ์ผํ๋์ค ์์๋ค.(์ ์ฅ์ ๋๋ฅด๋ฉด useEffect๋ก DB์ ์ ์ฅ๋ ์ ๋ณด๋ฅผ ๋ค๊ณ ์์ผํ๋ค๊ณ ์๊ฐํ๋ค) ๊ทธ๋ฐ๋ฐ ๊ณฐ๊ณฐํ ์๊ฐํด๋ณด๋ ๊ทธ๋ฅ ํ๋ฉด์ด ์ฒ์ ๋ณด์ฌ์ง๋๋ง useEffect๋ก DB์์ ๊ฐ์ ธ์ค๋ฉด ๋๋ ๊ฒ ๊ฐ๋ค. ์ ๋ณด๊ฐ ์ ์ฅ๋๋ฉด useState๋ก ์ ๋ฐ์ดํธ๋ ํ๋ฉด์ ๋ณด์ฌ์ค ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ก๊ณ ์นจํ๊ฑฐ๋ ์๋ก ํญ์ ์ด๋ฉด ๊ทธ๋ useEffect๊ฐ DB์์ ์ ๋ณด๋ฅผ ๊บผ๋ด์ ๋ณด์ฌ์คํ ๋, ๋ฌธ์ ์๊ฒ ๋๋ค. - React - useEffect ์ฝ๋
useEffect(() => {
const effectCustomers = () => {
// ๊ฒฝ๋ก๋ก ๋ณด๋ด์(GET๋ฐฉ์) -> spring์ ์ปจํธ๋กค๋ฌ์์ ์ฒ๋ฆฌ
fetch("/api/customers")
// ์๋ต์ ๋ฐ๊ณ ๋ฐ๋๋ฅผ json์ ํ์ฑํด์ JS๊ฐ์ฒด๋ก ๋ณ๊ฒฝ
.then((response) => {
return response.json();
})
// data์ ๋ด์ ๋ค, useState ์ฝ๋์ ์๋ setRows์ ๋ณด๋ด ํ๋ฉด ์
๋ฐ์ดํธ
.then((data) => {
setRows(data);
})
// ์๋ฌ ๋ฐ์ ์ ์ฒ๋ฆฌํ๊ธฐ
.catch((error) => {
console.error(error);
alert("๊ณ ๊ฐ ๋ชฉ๋ก์ ๋ถ๋ฌ์ค์ง ๋ชปํ์ต๋๋ค.");
});
};
// effectCustomers ์คํ
effectCustomers();
}, []);
useEffect๋ ์ธ๋ถ ์์คํ ๊ณผ ์ปดํฌ๋ํธ๋ฅผ ๋๊ธฐํํ๋ React Hook์ด๋ค. ์ฌ๊ธฐ์ React Hook์ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ ๋๊ตฌํจ ๊ฐ์ ์กด์ฌ์ธ๋ฐ useEffect ๋ง๊ณ ๋ useState๋ Hook ์ค ํ๋์ด๋ค. React Hook์ ๋ํ ๋งํฌ๋ฅผ ์๋์ ๋ฌ์๋๊ฒ ๋ค.
React๋ ์๋ UI๋ฅผ ๊ทธ๋ฆฌ๋ ๊ฒ์ ์ง์คํ์ง๋ง ์ด๋ ๊ฒ ํ๋ก์ ํธ๋ฅผ ํ๋ค๋ณด๋ฉด ๊ทธ๋ฆฌ๋ ๊ฒ ์ธ์ ํ์ํ ๋ถ๋ถ์ด ์๋ค. ์ง๊ธ ํ๊ณ ์๋ ํ๋ก์ ํธ์ฒ๋ผ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๊ฑฐ๋, ๋ก๊ทธ์ธ ์ํ๋ฅผ ํ์ธํ๊ฑฐ๋, ์๋ฆผ ํน์ ํ์ด๋จธ๊ฐ์ ๊ธฐ๋ฅ๋ useEffect๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
// ๊ฐ์ ์ฝ๋ ๋ ๊น๋ํ ๋ฒ์ - GPT
useEffect(() => {
// useEffect ์์์๋ ์ง์ async๋ฅผ ์ธ ์ ์๋ค.
// ๋ด๋ถ์ async ํจ์๋ฅผ ํ๋ ๋ง๋ค๊ณ ํธ์ถํ๋ ํจํด์ ์ฌ์ฉํ๋ค.
// ๋ณดํต์ async ํจ์๊ฐ ์ธ๋ถ์ ์๋ค.
const effectCustomers = async () => {
try {
// GET ์์ฒญ
const response = await fetch("/api/customers");
// ์๋ต ๋ฐ๋๋ฅผ JS ๊ฐ์ฒด๋ก ๋ณํ
const data = await response.json();
// useState์ setRows์ data๋ฅผ ๋ฃ์ด ํ๋ฉด ์
๋ฐ์ดํธ
setRows(data);
} catch (error) {
console.error(error);
alert("๊ณ ๊ฐ ๋ชฉ๋ก์ ๋ถ๋ฌ์ค์ง ๋ชปํ์ต๋๋ค.");
}
};
// effectCustomers ์คํ
effectCustomers();
}, []);
๋ด์ฅ React Hook – React
The library for web and native user interfaces
ko.react.dev
- useEffect์ sideEffect์ ์ฐจ์ด์
[React] useEffect์ sideEffect
useEffect๋? React์์ ์ ๊ณตํ๋ useEffect()๋ sideEffect๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค๊ณ ํ๋ค. ๋ฆฌ์กํธ์ ์์ํ ํจ์์ ์ธ ์ธ๊ณ์์ ๋ช ๋ น์ ์ธ ์ธ๊ณ๋ก์ ํ์ถ๊ตฌ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ์ฆ, ๋ ๋๋ง ์ด์ธ์ ์ผ์ผ
voyage-dev.tistory.com
[React] SpringBoot ์ React ์ฐ๋ํ๊ธฐ - vite build
Thymeleaf์ ๊ฐ์ ํ ํ๋ฆฟ ์์ง ๊ธฐ๋ฅ ์์ด SpringBoot๋ฅผ API ์๋ฒ๋ก๋ง ํ์ฉํ๊ณ React์ ๊ฐ์ ๋ณ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํด UI๋ฅผ ์ ๊ณตํ ์ ์๋ค. ๋ฐฑ์๋์ ํ๋ฐํธ์๋ ๊ธฐ์ ์คํ์ ๊ฐ๊ฐ SpringBoot์ React๋ก ๊ฒฐ
margin1103.tistory.com
- Spring - Controller
@GetMapping
public List<Customer> effectCustomers() {
return customerRepository.findAll();
}
GET ๋ฐฉ์์ผ๋ก ํ๋ก ํธ์์ ์์ฒญ์ ๋ณด๋์ผ๋, ์ปจํธ๋กค๋ฌ์์๋ GET ๋ฐฉ์์ผ๋ก ๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐํ ํ์ ์ List<Customer>๋ก ํ๋ค. ์๋ํ๋ฉด ์ด ๋ฉ์๋๋ ์ฌ๋ฌ ๊ณ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค. Customer๋ ์ํฐํฐ์ผ๋ก ์ค์ ํ์ผ๋ฉฐ ์ํฐํฐ๋, ํ ์ด๋ธ์ ๊ด๋ฆฌํ ๋ ํ์ํ ๋ฐ์ดํฐ์ ์งํฉ์ด๋ค. Customer์๋ name, grade, phone, code, note๊ฐ ์๋ค.(์ด๊ฑธ ๊บผ๋ด์ค๋ ๊ฒ!) ๋ ํฌ์งํ ๋ฆฌ์์ ์ ๋ณด๋ฅผ ๊บผ๋ด๋๋ฐ ์ด๋ findAll๋ก ๋ชจ๋ ๊ณ ๊ฐ์ ์กฐํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌ์คํธ๋ก ๋ฐํํ๋ค.
- ์์ ํ ํ๋ฉด