์ํฐ๋ ํ๋ฆฌ์จ๋ณด๋ฉ ํ๋ก ํธ์๋ ์ฝ์ค 1์ฃผ์ฐจ ํ๊ณ (2)
์ฒซ ๋ฒ์งธ ๊ณผ์ ๋ ๊ฐ๋จํ ํ์จ ๊ณ์ฐ๊ธฐ๋ฅผ ๊ตฌํํ๋ ๊ณผ์ ์๋ค.
์ฐ๋ฆฌ ํ์ ๋ค ๋ช ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๊ณ ์ด๋ฒ ๊ณผ์ ๋ ๋ ๋ช ์ฉ ๋๋์ด ํ๋์ ๊ณ์ฐ๊ธฐ๋ฅผ ๊ตฌํํ๋ ๊ณผ์ ์๋ค. ๋ด๊ฐ ๋งก์ ๋ถ๋ถ์ ์์ทจ ๊ตญ๊ฐ๋ฅผ ์ ํํ๊ณ ์ก๊ธ์ก์ ์ ๋ ฅํ๋ฉด ๋ฒํผ ํ๋จ์ ์์ทจ๊ธ์ก์ด ์์ทจ๊ตญ๊ฐ์ ๋ง๋ ํ์จ๋ก ๋ณํ๋์ด ์ถ๋ ฅ๋๋ ๊ณ์ฐ๊ธฐ์๋ค.
์ง๊ธ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ฐธ ์์ฑํ๋ค. ๊ฐ์ด ํ๋ฆฌ์จ๋ณด๋ฉ ์ฝ์ค๋ฅผ ์ฐธ์ฌํ๋ ์ฌ๋๋ค์ ๋ณด๋ฉด ์ด๋ฐ์ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํ๋ ์์ํฌ๋ฅผ ๋ค๋ฃฐ ์ค ์๋ ๋ถ๋ค์ด ๋ง์ด ๊ณ์ ๋ฐ ๋๋ ์ด๋ป๊ฒ ํฉ๊ฒฉ์ ํด์ ๋ฐฐ์ฐ๊ณ ์๋ ์ถ์ ์ ๋๋ค. ๋ด๊ฐ ๋ฌธ ๋ซ๊ณ ๋ค์ด์จ ๊ฒ ์๋๊ฐ ์ถ๋ค.
1. API ํธ์ถ
ํ์จ ์ ๋ณด๋ฅผ ๋ฐ์ ์ค๊ธฐ ์ํด API๋ฅผ ํธ์ถํด์ผ ํ๋ค. ๊ตฌํํด์ผ ํ๋ ๊ณ์ฐ๊ธฐ๊ฐ ๋ ๊ฐ์ง์ธ๋ฐ, ๊ฐ์ ํ์จ API ์ ๋ณด๋ฅผ ์ฐ๊ธฐ ๋๋ฌธ์ redux toolkit
์ ์ฌ์ฉํด ํ์จ ์ ๋ณด๋ ์ ์ญ ์ํ ๊ด๋ฆฌ๋ฅผ ํ๋ค. ์ด ๋ถ๋ถ์ ์ฐ๋ฆฌ ํ ์ข
์ ๋๊ป์ ์์ฑํ์
จ๋ค.
// store/index.js
import { configureStore, createSlice } from "@reduxjs/toolkit";
const exchangeRateSlice = createSlice({
name: "currency",
initialState: { exchangeRate: "" },
reducers: {
getExchangeRate(state, action) {
state.exchangeRate = action.payload;
},
},
});
const store = configureStore({
reducer: {
rate: exchangeRateSlice.reducer,
},
});
export const exchangeRateActions = exchangeRateSlice.actions;
export default store;
๊ทธ๋ฆฌ๊ณ App.js์์ fetch๋ฅผ ์ด์ฉํด json ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ , ํ์จ ์ ๋ณด๋ฅผ exchangeRate์ ์ ์ฅํ๋ค.
// App.js
import { useEffect } from "react";
import { useDispatch } from "react-redux";
import { exchangeRateActions } from "./store";
function App() {
const dispatch = useDispatch();
const getCurrency = async () => {
const json = await (
await fetch(
`http://api.currencylayer.com/live?access_key=${apiKey}&format=1`
)
).json();
dispatch(exchangeRateActions.getExchangeRate(json.quotes));
};
useEffect(() => {
getCurrency();
}, [dispatch]);
return (
// ์๋ต
);
}
export default App;
2. ํ์จ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
select ๋ฐ์ค๋ก ๊ตญ๊ฐ๋ฅผ ์ ํํ ๋๋ง๋ค ํด๋นํ๋ ๊ตญ๊ฐ์ ํ์จ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค.
<select className={styles.textBox} onChange={handleChangeCountry}>
<option value="KRW" select="true">ํ๊ตญ(KRW)</option>
<option value="JPY">์ผ๋ณธ(JPY)</option>
<option value="PHP">ํ๋ฆฌํ(PHP)</option>
</select>
const [nation, setNation] = useState("KRW");
const handleChangeCountry = (event) => {
setNation(event.target.value);
};
onChange ์ด๋ฒคํธ์ handleChangeCountry ํจ์๋ฅผ ์ฐ๊ฒฐํด ์ ํ ํญ๋ชฉ์ด ๋ฐ๋ ๋๋ง๋ค nation์ ๋ณ๊ฒฝํด ์ค๋ค.
const exchangeRate = useSelector((s) => s.rate.exchangeRate);
const saveRate = exchangeRate["USD" + nation];
๊ทธ๋ฆฌ๊ณ useSelector๋ก ํ์จ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ ๋ค์, saveRate์ ํ์ฌ ์ ํํ ๊ตญ๊ฐ์ ํ์จ ๊ฐ์ ์ ์ฅํ๋ค.
API์ ๊ฐ์ด USDKRW์ฒ๋ผ USD + ๊ตญ๊ฐ ํ์์ผ๋ก ๋์ด ์๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ด ํ์จ ๊ฐ์ ๋ฐ์์จ๋ค.
<p>
ํ์จ:{" "}
{saveRate?.toLocaleString(undefined, {
maximumFractionDigits: 2,
minimumFractionDigits: 2,
})}{" "}
{nation}/USD
</p>
๊ทธ๋ฆฌ๊ณ ํ๋ฉด์๋ saveRate
์ nation
์ ์ด์ฉํด 1,193.88 KRW/USD์ ๊ฐ์ ํํ๋ก ํ์จ์ ์ถ๋ ฅํ๋ฉด ๋๋ค.
toLocaleString()
์ ์ซ์์ 3์๋ฆฌ๋ง๋ค ์ฝค๋ง๋ฅผ ์ฐ์ด ์ฃผ๋ ํจ์์ธ๋ฐ, ์์์ ๋ ์๋ฆฌ๊น์ง ์ถ๋ ฅํ๊ธฐ ์ํด ์ต์
์ ์คฌ๋ค.
๊ณผ์ ๋ฆฌ๋ทฐ ์๊ฐ์ ์๊ณ ์์ฌ์ ๋ ์ ์, ์ก๊ธ์ก Input์ ์ซ์๊ฐ ์๋ ๊ฐ์ด ์ค๋ฉด ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด ์ฃผ๋ ํญ๋ชฉ์ด ์์๋๋ฐ type="number"
๋ก ์ ํํด ์ซ์ ๊ฐ๋ง ์
๋ ฅํ ์ ์๋๋ก ํ๋ค. ์ด ๋ฐฉ์์ด ์๋ type์ ๊ฒ์ฆํ๊ณ number๊ฐ ์๋๋ผ๋ฉด ์ก๊ธ์ก์ด ๋ฐ๋ฅด์ง ์๋ค๋ ๋ฌธ๊ตฌ๋ฅผ ๋์์ผ ํ๋ค. ๋ฐ๋ผ์ ์๋์ ๊ฐ์ด ์์ ํ๋ค.
{Number(sendMoney) < 0 ||
Number(sendMoney) > 10000 ||
isNaN(Number(sendMoney)) ? (
์ก๊ธ์ก์ด ๋ฐ๋ฅด์ง ์์ต๋๋ค
: (
์์ทจ๊ธ์ก์ ์ผ๋ง์
๋๋ค
)}
์ฒซ ๋ฒ์งธ ํ๋ก์ ํธ๋ฅผ ๋ง์น๋ฉฐ
์ํฐ๋ ํ๋ฆฌ์จ๋ณด๋ฉ ์ฝ์ค์์ ํ ์ฒซ ํ์ !์ด๋ผ๋ ๊ฒ์ ์๋ฏธ๋ฅผ ๋๊ณ ์ถ๋ค. ๋ถ๋ช ์ํฐ ๋ถ๋ถ์ด ํจ์ฌ ๋ง๊ณ , ๋์ค์ ์ฝ๋๋ฅผ ๋ค์ ๋ณด๋ฉด ๋ถ์กฑํ ๋ถ๋ถ์ด ์ฌ์คํ ๋ณด์ผ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ ์ง๋ง ๋ด๊ฐ ์ฑ์ฅํ ์ ์๋ ๋ฐํ์ด ๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ง ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ง์ ๊ฒ์ ๋ฐฐ์ธ ์ ์์๊ณ , ์ด๋ค ๋ถ๋ถ์ด ๋ชจ์๋์ง ๊ทธ๋์ ์ด๋ค ๋ถ๋ถ์ ๋ณด๊ฐํด์ผ ํ ์ง ์๊ฒ ๋์๋ค. ์กธ์ ์ ์น์ฌ ์ธ๋ฉฐ ๊ฒจ์ ๋จน๊ธฐ๋ก ์ฝ๋ฉํ์ ๋์ ๋ค๋ฅด๊ฒ ๊ฐ๋ฐ์๋ผ๋ ๊ธธ๋ก ๋ค์ด์๊ณ ์ถ๋ค๋ ๋ง์์ด ์กฐ๊ธ ๋ ๊ตณ์ด์ง ๊ฒ ๊ฐ๋ค. ์์ผ๋ก๋ ๋๋ ์ด์ฌํ ํด ๋ณด๋ ค๊ณ ํ๋ค~
GitHub - ttaerrim/wanted_pre_onboarding_01: <ํ์จ ๊ณ์ฐ๊ธฐ>
<ํ์จ ๊ณ์ฐ๊ธฐ>. Contribute to ttaerrim/wanted_pre_onboarding_01 development by creating an account on GitHub.
github.com