์ฐ๋ฆฌ fisa 2๊ธฐ 'ํด๋ผ์ฐ๋ ์๋น์ค ๊ฐ๋ฐ' 21์ฃผ์ฐจ
25 - 21 4์ฃผ์ฐจ ??
์ด์ 4์ฃผ๋ฐ์ ์ ๋จ์ ๊ฑด๊ฐ ?
ใ ใ ์ง์ง ์๊ฐ ๋ญ๋ฐ !!
์ง๊ธ ์ด๊ฑฐ ์์ฑํ๋ ์ผ์์ผ ์์นจ
์ด์ ์ง์ง ๋ฐ๋ปํ๋ค ๋ชจ๋ ๊ณณ์ด ใ ใ ..
์ผ์ ์๊ธฐ
์ด๋ฒ ์ฃผ๋ ์ด๋ฒ ์ฃผ ์์๋ถํฐ ์ฝ๋ฉํ ์คํธ๊ฐ ์์ด์ ๊ฐ์ฐ์ ์๋ ํ ๊ธฐ์ ์ ๊ฐ๋ค์๋ค
์์ฆ์ ์ด๋ ฅ์๋ฅผ ํ ๋ฒ์ฉ ๋ฃ๊ณ ์๋๋ฐ ์ด๋ ๊ฒ ๋์๊ฒ ๊ธฐํ๋ฅผ ์ฃผ๋ ํ์ฌ๋ค์ด ํ๋ ๋ ์ฉ ์๊ฒจ๋๊ธฐ ์์ํ๋ค.
์ด๋ฒ ๊ธฐ์ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ฝ๋ฉํ ์คํธ๊ฐ ์กฐ๊ธ ํน์ด ํ๋ค.
์ผ๋ฐ ์๊ณ ๋ฆฌ์ฆ ๊ฐ์ ์ฝ๋ฉํ ์คํธ๊ฐ ์๋๋ผ, ๊ณผ์ ํ์์ด์๋ค.
๊ณผ์ ๋ oracleDB์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ค์ spring์ผ๋ก ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ผ์ฐ์ ์ ๋์ฐ๋ ๊ณผ์ ์๋ค.
์ผ๋จ ใ ใ ๋๋ mysql๋ง ์ฐ๊ณ ์์๋ ํฐ๋ผ oracleDB๋ ๋๋ฌด ํท๊ฐ๋ ธ๋ค ใ ใ
(๋ฌผ๋ก ๊ธฐ์ด๊ฐ ์กฐ๊ธ ๋ถ์กฑํ ํ์ ์ด๋ค ์ํฉ์์๋ ๋์ฒ๋ฅผ ํ ์ ์์ง ๋ชปํ ๊ฒ๋ ๋ฌธ์ ๊ธด ํ๋ค ใ )
๊ฒ๋ค๊ฐ ๋ ๋ค๋ฅธ ์ด์๊ฐ ์์๋ค๋ฉด, ๋๋ Mac์ ์ฌ์ฉํ๋ ์ฌ๋์ผ๋ก์ Window ์ปดํจํฐ๋ ๋งค์ฐ ๋ฏ์ค์๋ค ใ ใ
์ ๋ฌผ๋ก ๊ธ๋ฐฉ ์ ์์ ํ์ง๋ง, ์๊ฐ์ ํ์ด ์๊ณ oracleDB๋ฅผ ์ฐ๋ฉฐ, db์ ์ ๊ทผํ๋ ๋ฐฉ์์ด ์กฐ๊ธ์ ๋ค๋ฅธ ๋ถ๋ถ์ด ์๋ค๋ณด๋ ์ข ํฉ์ ์ผ๋ก ํท๊ฐ๋ ธ๋ ๊ฒ ๊ฐ๋ค.
์๋ฌดํผ ์ข์ ๊ฒฝํ์ด์๊ณ ์ด ๊ฒฝํ์ผ๋ก DB์ฐ๊ฒฐํ๋ ๋ฒ์ ๋ ๋ฐฐ์ฐ๊ณ ๋์๋ค ใ ใ ใ
์ฐ๋ฆฌfisa์์ ์๊ฒฉ์ฆ ์์๋ฃ ์ง์ํด์ค ์ํ์ด์๋ค !!
์ด๊ฑฐ ์ง์ํ ๋ ๋จ์ด์ง๋ฉด ์์๋ฃ ํ๋ถํ์ธ์ฌ ~ ๋ผ๋ฉด์ ๋งค๋์ ๋์ด ์ฅ๋ ์น์ จ๋๋ฐ ใ ใ 1ํธ์ ๋ฐ๋ก ํฉ๊ฒฉ์ฑ๊ณตํ๋ฐ ใ ใ !!
์ฌ์ค ์ ๋ฒ์ sqld ํฉ๊ฒฉ์ ํ๋ค๊ณ ํ์ง๋ง, ๊ทธ๋๋ ํฉ๊ฒฉ์์ ์ด๋ผ ์์ ํฉ๊ฒฉ์ด ์๋๋ผ ์ฆ๋ช ์๋ ์ถ๋ ฅ์ด ๋ถ๊ฐ๋ฅํ๋ค.
์ด์ ๋ ์ด๋ ๊ฒ ์ถ๋ ฅ ํด๋ณด์๋ค ใ ใ ๋ฌผ๋ก ํฌ๊ฒ ์์ฉํ ์๊ฒฉ์ฆ์ ์๋์ง๋ง, ํ ์ค์ ๊ฐ๋ฅํด์ก๋ค๋๊ฑฐ๋ค ~
ํ์ฌ ์งํํ๊ณ ์๋ ํ๋ก์ ํธ์์ ์นด๋๊ฒ์์ ํ๊ณ ์์ธํ ๋ณด๊ธฐ ํ๋ฉด ์นด๋๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ์ด์ง๊ฐ ์๋ค.
๋๋ ์ด ์นด๋๋ฆฌ์คํธ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ๋ฉด์ ๊ฐ๋ฐํ๋ค!
์ด์ ์๋ ๊ณ์ํด์ ๋ฐ์ํ์ผ๋ก ๋ง๋ค๊ณ ์์๋๋ฐ, ์ด๋ฒ์๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋์ด ๋ ์น๋ฐํ๊ฒ ๋ง๋ค์๋ค.
์์ ์ฌ์ง๊ณผ ๋ฐ์ ์ฌ์ง์ ๋ณด๋ฉด ํ์ฐํ ์ฐจ์ด๊ฐ ์๋ค.
๋ฐ๋ก ์ด๋ ๊ฒ ๋ชจ๋ฐ์ผ ์ผ ๊ฒฝ์ฐ ์ฐํ๋น๋ฅผ ์กฐ์ ํ๋ ๋ฒํผ์ด ์ ๋ณด์ด๊ณ ๊ตฌ์กฐ๋ ์ฝ๊ฐ ๋ค๋ฅด๋ค.
๋์ ์ฐํ๋น๋ฅผ ์กฐ์ ํ๋ ๋ฒํผ์ ๋ฐ ํ๋จ์ ์ค์ ํ ์ ์๋ ๋ฒํผ์ ๋ง๋ค์ด๋จ๋ค.
์ด ๋ฒํผ์ ๋๋ฅด๋ฉด
์ด๋ ๊ฒ ์๋์ฒ๋ผ ์กฐ์ ํ ์ ์๋ ํ์ด์ง๊ฐ ๋์จ๋ค!!
ใ ใ ใ ๋ฐ์ํ์ ๊ณ์ ํ๋ค๋ณด๋ ๋๋ฆ ๊ณ ๊ธ ๊ธฐ์ ??(์์ฐฌใ ) ์ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค ใ ใ
์ดํ, ์ด๋ฅผ ๋ฐฑ์ค๋ ์๋ฐ์ ์ฐ๊ฒฐ์ ํด๋ณด๋ ์๊ฐ๊น์ง ๊ฐ์ก๋ค.
๋ด๊ฐ ์ง์ controller, service, repo๋ฅผ ๋ง๋ค์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ ๋ฐ์ดํฐ๋ค์ ์ถ์ถํ๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ํ๋ฉด์ ๋๋๋งํ๋ ๊ฒ๊น์ง ์ฑ๊ณต์ ํ ์ ์์๋ค.
๊ทผ๋ฐ ์์ง ํ๋๊ฐ ๋จ์๋ค ์ฐํ๋น ์ ์์ค์ ์ผ๋ก ๋ ํ ๋ฒ ํํฐ๋ง์ด ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ ๋ค์ ์ฃผ ์์ ์ฆ, ๋ด์ผ ์ถ๊ทผํด์ ๋ง๋ฌด๋ฆฌํ ์์ ์ด๋ค !!
์ด ๋ฒ ํ ์ฃผ๋ ๋ ์ฐ๋ฆฌ ํ์ ์๊น์ ์ํด ์ด๋ป๊ฒ ํด์ผํ๋์ง ์์ฒญ ์ด๋ ํ ๋ก ์ ์งํํ๋ค
๊ทธ๋์ ๋ ๋ค์ ์ค๋์ ์ํด ํผ๊ทธ๋ง๋ฅผ ๊ทธ๋ฆฌ๋ฉด์ ์ด์ฌํ ์งํํ๊ณ ์๋ค ใ ใ
์์ธํ ๋ด์ฉ์ ์์ง ๋ ธ์ถ ์ํฌ ์ ์์ง๋ง ~!
์ฐ๋ฆฌ ์ดํ์ ๋ชฐ๋ฆฌ๊ฒ ๋๋ ์ด์ ๋ฅผ ๋ง๋ค์ด๋ณด์ ~
๊ทธ ๋ค์ ๋ฑ๊ธ์ ๋ฅผ ๋ฃ์ด์ ๊ณ ๊ฐ์ ๊ณ์ ์ ์งํ ์ ์๊ฒํ๋ ํจ๊ณผ๋ฅผ ๋ณด์ ~
์ด๋ฐ์์ ์ฃผ์ฅ์ ํ๋ฉด์ ํ์๋ค์ ์ค๋ํ๊ณ ์๋ค ใ ใ
๋๋ ๋ด๊ฐ ์ํ ์ฐ๋ฆฌํ ์ ๋ง ์ต์ ์ ๋คํด ๋์ ๋ชจ๋ ๊ฒ์ ์์ ๋ถ๊ณ ์ถ๋ค.
์ฐ๋ฆฌํ์ด ์ ๋๋ ์ผ์ด๋ผ๋ฉด ์ด๋ป๊ฒ๋ ์ค๋์์ผ ๋ณํ์์ผ ๋๊ฐ ์๊ฐ์ด๋ค !!
๊ณต๋ถ ์๊ธฐ
1. ์ด๋ฒ ์ฃผ ๋ฐฐ์ด ๊ฒ
์ด๋ฒ ์ฃผ๋ React์ Spring์ ์ฐ๊ฒฐํ๋ฉด์ ์ฌ๋ฌ๊ฐ์ง๋ฅผ ๊ณต๋ถํ ์ ์์๋ค.
๋ ๊ฐ์ง ์ ๋๊ฐ ์๋ค.
์ฒซ์งธ, spring๊ณผ react ์ ์ฐ๊ฒฐํ๊ธฐ ์ํ ์ ์ฒด์ ์ธ ํ๋ฆ
๋์งธ, react์์ spring ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ ๋น๋๊ธฐ ํจ์ axios์ fetch์ด๋ค.
React ์ Spring ์ฐ๊ฒฐํ๊ธฐ
axios ๋ฅผ ํ์ฉํ์ฌ spring ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ ๊ณผ์ ๊ฐ ์์๋ค.
axios๋ fetch ํจ์์ ๋ค๋ฅด๊ฒ json ํ์ผ๋ก ๋ฐ๊ฟ ํจ์๊ฐ ํ์ ์๋ค. ์๋์ผ๋ก ๋ฐ๊ฟ์ค๋ค !!
ํ๋ก ํธ(React)
import React, { useEffect, useState } from 'react'; // useEffect๋ฅผ import ํด์ผ ํฉ๋๋ค.
import DesktopCardDetail from '../components/card/detail/SelectDetail/DesktopCardDetail';
import MobileCardDetail from '../components/card/detail/SelectDetail/MobileCardDetail';
import CardList from '../components/card/detail/list/CardList';
import { useLocation } from 'react-router-dom';
import axios from 'axios';
function CardDetailList() {
const [cardDetails, setCardDetails] = useState([]);
const location = useLocation();
const { cardId } = location.state || {}; // state๊ฐ undefined์ผ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ ๊ธฐ๋ณธ๊ฐ ์ค์
console.log(cardId); // cardId๋ Object
useEffect(() => {
// useEffect ๋ด๋ถ์์ ๋น๋๊ธฐ ํจ์๋ฅผ ์ ์ํ๊ณ ํธ์ถํฉ๋๋ค.
const getData = async () => {
try {
const response = await axios.post('http://localhost:8080/api/carddetail', cardId, {
headers: {
'Content-Type': 'application/json'
}
});
console.log(response);
setCardDetails(response.data);
} catch (error) {
console.error(error);
}
};
getData(); // ๋น๋๊ธฐ ํจ์ ํธ์ถ
}, [cardId]); // cardId๋ฅผ ์์กด์ฑ ๋ฐฐ์ด์ ์ถ๊ฐํฉ๋๋ค.
return (
<div>
<div className='relative flex justify-center items-center bg-gray-100 w-screen h-[100px] md:h-[400px] mt-[90px] md:mt-[90px]'>
<DesktopCardDetail />
<MobileCardDetail />
</div>
<div className='flex justify-center min-h-screen bg-gray-100'>
<CardList cardDetails={cardDetails} />
</div>
</div>
);
}
export default CardDetailList;
๋ณด๋ด๋ฉด response๋ฅผ ๋ฐํํ๋๋ฐ axios๋ response์ ๋ชจ๋ ์ ๋ณด๊ฐ ์๊ณ ํ์ํ ์ ๋ณด๋ data์ ์๊ธฐ ๋๋ฌธ์ response.data๋ฅผ ํด์ค์ผ๋ก์จ ๊ฐ์ ์ ๋๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค.
๋ฐฑ์ค๋(Spring)
package project.local.controller.carddetail;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import project.local.dto.CardDetailDTO.CardDetailDTO;
import project.local.dto.CardDetailDTO.CardDetailRequestDTO;
import project.local.service.carddetail.CardDetailService;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@RequiredArgsConstructor
@RestController
public class CardDetailController {
private final CardDetailService cardDetailService;
@CrossOrigin(origins = "http://localhost:5173")
@PostMapping("/api/carddetail")
public List<CardDetailDTO> processCardDetail(@RequestBody CardDetailRequestDTO[] cardDetailRequestDTOS) {
ArrayList<CardDetailDTO> list = new ArrayList<>();
for (CardDetailRequestDTO x : cardDetailRequestDTOS) list.add(cardDetailService.findById(x.getCardId()));
return list;
}
}
์ด๊ฑฐ๋ react์์ ๋ณด๋ธ ์์ฒญ์ spring์์ ์ฒ๋ฆฌํ๋ ์ฝ๋์ด๋ค.
@RequestBody๋ ํ๋ก ํธ์์ ์ค๋ json ํ์ผ์ ์๋์ผ๋ก ์๋ ํํ๋ก ๋ณํ์์ผ์ค๋ค.
์ด๋ CROS๋ผ๋ ์๋ฌ๋ฅผ ํด๊ฒฐํด์ฃผ๊ธฐ ์ํด @CrossOrigin ์ด๋ ธํ ์ด์ ์ ์ ์ฉํด์ค๋ค.
์ด๋ฅผ ์ ์ฉํ๋ฉด http://localhost:5173 ์์ ์ค๋ ์์ฒญ์ ํ์ฉํ๋ค๋ ์๋ฏธ๊ฐ ๋๋ฉฐ CORS ์๋ฌ๋ ํด๊ฒฐ์ด ๋๋ค.
CORS์๋ฌ๊ฐ ์๊ธฐ๋ ๊ฒฝ์ฐ
1. ์ถ์ฒ๊ฐ ๋ค๋ฅธ ๋๋ฉ์ธ ๋๋ ํฌํธ๋ก ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋
CORS ์ ์ฑ
์ ๋ฐ๋ผ, ์ถ์ฒ๊ฐ ๋ค๋ฅธ ๋๋ฉ์ธ์ด๋ ํฌํธ์์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ ๊ฒฝ์ฐ์๋ ๋ธ๋ผ์ฐ์ ์์ CORS ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์ด ๊ฒฝ์ฐ์๋ ์๋ฒ ์ธก์์ Access-Control-Allow-Origin ํค๋๋ฅผ ์ค์ ํ์ฌ ์์ฒญ์ ํ์ฉํด์ผ ํ๋ค. ์ด๋ ์ฌ์ฉํ๋ ์ด๋
ธํ
์ด์
์ด CrossOrigin์ด๋ค.
์ถ๊ฐ์ ์ธ ์ด์ ๋ ์์ง๋ง, ๋ฐ๋ก ์์ฑํ๊ธฐ์๋ ์ ๋๋ก๋ ๊ณต๋ถ๊ฐ ์๋๊ณ ํ์ธ๋ ์ ๋๋ก ๋์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋์ค์ ์กฐ๊ธ ๋ ๊ณต๋ถํ๋ฉด์ ์ถ๊ฐ ์์ฑํ ์์ ์ด๋ค.
axios vs fetch
"fetch ์ axios๋ ๋ชจ๋ HTTP ์์ฒญ์ ๋ณด๋ด๋ ๋ฐ ์ฌ์ฉ๋๋ ๋๊ตฌ์ด๋ค."
fetch
ES6 ๋ถํฐ ๋ค์ด์จ JavaScript ๋ด์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
Promise ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ axios์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ์ดํฐ ๋ค๋ฃจ๊ธฐ๊ฐ ์ฝ๊ณ , ๋ด์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆด๋ผ๋ ์ฅ์ ์ผ๋ก
์๋นํ ํธ๋ฆฌํ๋ค.
fetch("https://localhost:8080/user/post", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
id: "jiho",
description: "hello jiho",
}),
}).then((response) => console.log(response));
fetch์ ์ฅ์
1. ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ด์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฏ๋ก ๋ณ๋๋ก importํ ํ์๊ฐ ์๋ค.
2. Promise ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ๋ค๋ฃจ๊ธฐ๊ฐ ํธ๋ฆฌํ๋ค.
3. ๋ด์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ์ ๋ฐ์ดํธ์ ๋ฐ๋ฅธ ์๋ฌ ๋ฐฉ์ง๊ฐ ๊ฐ๋ฅํ๋ค.
fetch์ ๋จ์
1. ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์กด์ฌํ๋ค.
2. ๋คํธ์ํฌ ์๋ฌ ๋ฐ์ ์ response timeout์ด ์์ด ๊ธฐ๋ค๋ ค์ผ ํ๋ค. -> ๊ทธ๋ ๋ค๊ณ ๋จ์ ์ด๋ผ๊ณ ํ๊ธฐ์๋
AbortController ์ธํฐํ์ด์ค๋ฅผ ํตํด์ ์ ์ด๊ฐ ๊ฐ๋ฅํ๋ค. -> ๊ท์ฐฎ์์ง๊ฒ์ ๋ง๋ค. ใ ใ
const url = "https://jsonplaceholder.typicode.com/todos";
const controller = new AbortController();
const signal = controller.signal;
setTimeout(() => controller.abort(), 4000);
fetch(url, {
signal: signal,
})
.then((response) => response.json())
.then(console.log)
.catch((err) => {
console.error(err.message);
});
3. JSON์ผ๋ก ๋ณํํด์ฃผ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
4. ์๋์ ์ผ๋ก axios์ ๋นํด ๊ธฐ๋ฅ์ด ๋ถ์กฑํ๋ค.
axios
axios๋ Node.js์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํ Promise API๋ฅผ ํ์ฉํ๋ HTTP ํต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
๋น๋๊ธฐ๋ก HTTP ํต์ ์ ํ ์ ์์ผ๋ฉฐ, return์ Promise ๊ฐ์ฒด๋ก ํด์ฃผ๊ธฐ ๋๋ฌธ์ response ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ฝ๋ค.
axios({
method: 'post',
url: 'https://localhost:8080/user',
data: {
userName: 'jiho',
userId: 'jiho112'
}
}).then((response) => console.log(response));
axios์ ์ฅ์
1. response timout (fetch์๋ AbortController) ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ด ์์ด ์๋ฒ ๋ฏธ์๋ต์ ์ค์ ์ด ๊ฐ๋จํ๋ค.
2. Promise ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ๋ค๋ฃจ๊ธฐ ํธ๋ฆฌํ๋ค.
3. ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง ์ต์ ํ๋ก ๋ธ๋ผ์ฐ์ ํธํ์ฑ(๊ตฌํ ๋ธ๋ผ์ฐ์ ์ง์)์ด ๋ฐ์ด๋๋ค.
axios ๋จ์
1. ์ฌ์ฉ์ ์ํ ๋ชจ๋ ์ค์น๊ฐ ํ์ํ๋ค.
npm์ ์ฌ์ฉํ์ฌ ์ค์น
npm install axios
yarn์ ์ฌ์ฉํ์ฌ ์ค์น
yarn add axios
์ดํ, ํ๋ก์ ํธ์์ import ์์ฑ
import axios from "axios";
์ฑ๋ฅ
์์์ ํ์ธํ ์ ์๋ฏ์ด native fetch๊ฐ axios ๋ณด๋ค ์ด์ง ๋น ๋ฅด๋ค. ๋ ํด๋ผ์ด์ธํธ ๋ชจ๋ ๋น๋๊ธฐ ์ด๊ธฐ ๋๋ฌธ์ ํฌ๊ฒ ์ค์ํ์ง ์๋ค.
ํ์ง๋ง ๋ถ๋ฌ์ค๋ ๋ฐ์ดํฐ๊ฐ ๋ฌด๊ฒ๋ค๋ฉด ๋น๋๊ธฐ๋ผ๊ณ ํด๋ ์๋ ์ฐจ์ด๊ฐ ์์ ์๊ฐ ์๋ค๋ ์ ์ ๊ณ ๋ คํด์ผ ํ๋ค.
๊ฒฐ๋ก
๊ฒฐ๊ตญ, ์ด๋ค ํ๋ก์ ํธ๋ฅผ ํ๋๋ ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์์ ์ฑํฅ ๋ฑ์ ์ข ํฉ์ ์ผ๋ก ๊ณ ๋ คํ์ฌ ๋ ๊ฐ์ง ์ค ์ ํํด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
2. ์ด๋ฒ ์ฃผ ์ํ์ฐฉ์ค
[์ค๋์ ๊ณ ์ถฉ]
์ฐ๋ฆฌ ์ธ๊ฐ์ ์ฌํ์ ์ธ ๋๋ฌผ๋ก์ ์ฌ๋๋ค๊ณผ ์ํต์ ํ๋ฉฐ ์ง๋ด๊ฒ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด๋ค ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ๊ธฐ ์ํด์๋ ์ฌ๋๋ค๊ณผ์ ์ํต์ด ์๊ฒ ๋๋๋ฐ ๊ทธ ์ํต์ ํ๋ฉด์ ์๊ธฐ๋ ์๋ก ๋ค๋ฅธ ์๊ฐ๋ค์ ์ถฉ๋์ด ์์ ์๊ฐ ์๋ค.
์ด๋ฒ ์ํ์ฐฉ์ค๋ผ๊ณ ํ๋ค๋ฉด ๋ฐ๋ก ์ด๋ฐ ๋ถ๋ถ์ด ์๋๊ฐ ์ถ๋ค. ์ฌ๋๋ค์ ๊ฐ์ ์ด์์จ ํ๊ฒฝ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ด์ฉ ์ ์์ด ์๊ฒฌ์ ์ถฉ๋์ด ์๊ธด๋ค.
๋๋ ์ด๋ฒ ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ์๊น์ ์์ด์ ์ ๋ง ๊ณ ์ฌ์ด ๋ง์๋ค. ๊ทธ๋์ ์๊น์ ์ ๋๋ก ์ ํ๊ธฐ ์ํด ์์ฅ์ฑ ๊ฒฝ์ ์ฑ ๋ฑ์ ๊ณ ๋ คํด์ ํ์๊ฒ ์ฃผ์ฅํ๊ณ ์ค๋ํ๊ณ ์๋ค. ํ์ง๋ง ์ญ์๋ ์ค๋์ด ์ฝ์ง๊ฐ ์๋ค.
ใ ใ ๊ฐ๋ ๋ต๋ตํ๊ณ ํ๋ค๋๋ ์์ง๋ง, ๊ฒฐ๊ตญ ์ค๋ํ๋ ๊ณผ์ ์ญ์ ํฅํ ์ฌํ์ ๋๊ฐ์ ํ์ํ ๊ณผ์ ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๋น๋ก ์ง๊ธ์ ๋ต๋ตํ๊ณ ํ๋ค์ง๋ผ๋ ๋์ ์ฃผ์ฅ์ ์ ์ดํํด์ ํ์๋ค์ ํ๋์ฉ ์ค๋ํ ์์ ์ด๋ค.
3. ์์ผ๋ก ์ด๋์ ์ ์ฉ
-react์ spring-
react์ spring์ ๊ฐ๊ฐ ๊ฐ๋ฐํ๊ณ ์ฐ๊ฒฐํ๋ ๊ณผ์ ์์ ํ๋ก ํธ์์๋ ์ด๋ฌํ ๋ฐ์ดํฐ๊ฐ ํ์ํด์ ์๋ฐ์์๋ ์ด๋ค ๋ฆฌ์์ค๋ก api ์์ฒญ์ ๋ณด๋ด์ผ ํ๋์ง ๋ฐฑ์ค๋์์๋ ํ๋ก ํธ์์ ์๊ตฌํ๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ ๊ณตํ ๊ฒ์ธ์ง์ ๋ํ ์ ์ฒด์ ์ธ ํ๋ฆ์ด ์กํ๋ค. ๊ทธ ๊ฒฐ๊ณผ๋ก ํฅํ ๋ด๊ฐ ๊ฐ๋ฐ์๊ฐ ๋์ด์ ํ๋ก ํธ์ค๋ ํน์ ๋ฐฑ์ค๋ ๊ฐ๋ฐ์์์ ์ํต์ด ์ํํ๊ฒ ๋ ๊ฒ์ ๋ถ๋ช ํด ๋ณด์ธ๋ค.
๋ํ ํ์ฌ ์์ ํ์คํ์ด ๊ฐ์กฐ๋๊ณ ์๋๋ฐ ์ด๋ฌํ ์ ์ฒด์ ์ธ ํ๋ฆ์ ํ์ ์ ํ์คํ์ด ๋๊ธฐ ์ํ ํ ๊ฑธ์์ด๋ผ๊ณ ์๊ฐํ๋ค.
-axios vs fetch-
์ด๋ฒ๊ณ๊ธฐ์ axios๋ fetch๋ณด๋ค ์ด์ ์ ๋์ด์๋ ๋ถ๊ตฌํ๊ณ ์์ง ๊ฑด์ฌํ ์ด์ ์ ๋ํด์ ์๊ฒ ๋๋ ๊ณ๊ธฐ๊ฐ ๋์๋ค. ์ ํํ ๋งํ์๋ฉด
์ํฉ์ ๋ฐ๋ผ ๊ฐ์ธ์ ์ทจํฅ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค๊ณ ๋ณผ ์ ์๋ค. ๋๋ค ์ ์ฉํ ๊ฒ์ ๋ถ๋ช ํ๋ค. ๋๋ ์ด๊ฒ์ ๋ํด ๊ณต๋ถ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ํฅํ, ์ด๋ค ํ๋ก์ ํธ๊ณ ํ์๋ค์ ์ด๋ค ์ฑํฅ์ ๊ฐ์ง๊ณ ์๋๋์ ๋ฐ๋ผ ๋ ๊ฐ๋ค ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์์ ์ด๋ค.
4. ํ์ฌ๊น์ง์ ํ์ต ํ๊ฐ ๋ฐ ๋ค์ ํ์ต์ ์ํ ๋ค์ง/๋ชฉํ
-ํ๋ก ํธ-
์์ฆ ํ๋ก์ ํธ๋ก ๊ณต๋ถ ์์ฒญํ๊ณ ์๋ค ใ ใ ใ ๋ฐ์ํ๋ถํฐ axios fetch ๊ทธ๋ฆฌ๊ณ props , hook ๋ฑ๋ฑ ์ข ํฉ์ ์ธ ๋ณต์ต์ด ๋๊ณ ์๋ ์ํฉ์ด๋ฉด์ ์ค๋ ฅ์ด ์์ฒญ ๋๊ณ ์๋ค. ๊ทธ๋ฌ๋ค๋ณด๋ ์๋ ํ๊ณ ์๋ ๊ฐ์ธ ํ๋ก ํธ ๊ณต๋ถ๋ ์กฐ๊ธ ์ํํ ํ๊ณ ์๋ ๊ฒ ๊ฐ๋ค. ์กฐ๊ธ ๋ ๋ ธ๋ ฅํด๋ณด์
-๋ฐฑ์ค๋-
ํ๋ก์ ํธ์์ ๋ฐฑ์ค๋๋ ๋ด๊ฐ ๋งก์ ๋ถ๋ถ์ด ์๋ค๋ณด๋ spring boot ์ฑ ๋ณต์ต๊ณผ ๊ฐ์ด ๊ณต๋ถ๋ฅผ ์งํํ๊ณ ์๋ค. ์ด์ jwt, test๊ฐ ๋ค์ ์ฃผ ๋ถํฐ ์งํ์ด ๋ ๊ฒ์ด๋ค. ์ด ๋ถ๋ถ ์ญ์ ๋ณต์ต ์ฒ ์ ํ ํ๋ฉด์ ๋ด๊ฒ์ผ๋ก ๋ง๋๋ ์๊ฐ์ ๊ฐ์ง์
-์ ์ฒ๊ธฐ-
์ค๊ธฐ๊ฐ 2์ฃผ๋ก ๋ค๊ฐ์๋ฐ ใ ใ ใ ์ด์ ๊ธฐ์ถ์ ํธ๋๋ฐ ์ ์ค๋นํด์ ํ ๋ฒ์ ํฉ๊ฒฉํ ์ ์๋๋ก ์ต์ ์ ๋คํ๊ฒ ๋ค.
-์ด๋ ฅ์-
์ด๋ ฅ์ ์์ฑํ๊ณ ์ทจ์ ์๋ด์๋ํํ ์ ๋ฌํด์ผํ๋ค. ์ค๋ ์ ์ฒด์ ์ธ ์ค๊ณฝ์ ์ก๊ณ ๋ค์ ํ ๋ฒ ๋ณด๋ด๋ ค๊ณ ํ๋ค!! ๊ทธ๋ฆฌ๊ณ ๋ด ์ด๋ ฅ์๋ ์ต์ ํ๋ฅผ ํ ์์ ์ด๋ค.
-ํ์ -
์ ๋ง ์ด์ฌํ ๋น ๋ฅด๊ณ ์ ํํ๊ฒ ํ๊ณ ์๋๋ฐ, ํ์ ์ ์๊น์ ์ํด ๋ค ์ ํ ๋ฒ ๋ถ๋ชํ๊ณ ์๋ค. ์ ์ค๋ํด์ ์ฐ๋ฆฌํ์ด ํ ๋จ ๊ณ ์ ๊ทธ๋ ์ด๋ ๋ ์ ์๋๋ก ์ต์ ์ ๋ค ํ ์์ ์ด๋ค.
-๋ธ๋ก๊ทธ ,ํผ๊ทธ๋ง-
๊ธฐ์ ๋ธ๋ก๊ทธ๋ ํ ์ฃผ์ 2๊ฐ์ฉ ์ ์ํํ๊ณ ์๋ค. ์์ผ๋ก๋ ๊ณ์ ๊พธ์คํ ์งํํ์. ๊ทธ๋ฆฌ๊ณ ํผ๊ทธ๋ง ์ญ์ ์ด ๋ฒ ์ฃผ์๋ ์ ๋๋ก 1์ฐจ์ ์ธ ์์ฑ์ ํด๋ณด์
-์ฝํ -
ํ ์ฃผ์ 2๊ฐ ๋ก ๋๋ฌด ์ค์ด๋ค์๋ค ใ ใ ์ด๋ฒ์ฃผ๋ ์ต์ 4๊ฐ๋ ํ์!!
22์ฃผ์ฐจ๋ ํ์ดํ ์ด๋ค โ๏ธ