๋‚˜์˜ ๋‹ค์ง,๊ธฐ๋ก,์ผ์ƒ/์šฐ๋ฆฌFISA2๊ธฐ_์„ฑ์žฅ๊ธฐ๋ก

์šฐ๋ฆฌ fisa 2๊ธฐ 'ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ๊ฐœ๋ฐœ' 21์ฃผ์ฐจ

์‹œํ๋ฆฌํ‹ฐ์ง€ํ˜ธ 2024. 4. 14. 11:10

25 - 21 4์ฃผ์ฐจ ??

 

์ด์ œ 4์ฃผ๋ฐ–์— ์•ˆ ๋‚จ์€ ๊ฑด๊ฐ€ ? 

 

ใ…‹ใ…‹ ์ง„์งœ ์‹œ๊ฐ„ ๋ญ”๋ฐ !!

 

์ง€๊ธˆ ์ด๊ฑฐ ์ž‘์„ฑํ•˜๋Š” ์ผ์š”์ผ ์•„์นจ 

 

์ด์ œ ์ง„์งœ ๋”ฐ๋œปํ•˜๋‹ค ๋ชจ๋“  ๊ณณ์ด ใ…Žใ…Ž..

 


์ผ์ƒ ์–˜๊ธฐ

 

 

์ด๋ฒˆ ์ฃผ๋Š” ์ด๋ฒˆ ์ฃผ ์‹œ์ž‘๋ถ€ํ„ฐ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์–ด์„œ ๊ฐ€์‚ฐ์— ์žˆ๋Š” ํ•œ ๊ธฐ์—…์— ๊ฐ”๋‹ค์™”๋‹ค 

 

์š”์ฆˆ์Œ ์ด๋ ฅ์„œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ๋„ฃ๊ณ  ์žˆ๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๋‚˜์—๊ฒŒ ๊ธฐํšŒ๋ฅผ ์ฃผ๋Š” ํšŒ์‚ฌ๋“ค์ด ํ•˜๋‚˜ ๋‘˜ ์”ฉ ์ƒ๊ฒจ๋‚˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

 

์ด๋ฒˆ ๊ธฐ์—… ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๊ฐ€ ์กฐ๊ธˆ ํŠน์ด ํ–ˆ๋‹ค.

 

์ผ๋ฐ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ™์€ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ, ๊ณผ์ œ ํ˜•์‹์ด์—ˆ๋‹ค.

 

๊ณผ์ œ๋Š” oracleDB์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ ๋’ค์— spring์œผ๋กœ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์— ๋„์šฐ๋Š” ๊ณผ์ œ์˜€๋‹ค.

 

์ผ๋‹จ ใ…‹ใ…‹ ๋‚˜๋Š” mysql๋งŒ ์“ฐ๊ณ  ์žˆ์—ˆ๋˜ ํ„ฐ๋ผ oracleDB๋Š” ๋„ˆ๋ฌด ํ—ท๊ฐˆ๋ ธ๋‹ค ใ…‹ใ…‹

 

(๋ฌผ๋ก  ๊ธฐ์ดˆ๊ฐ€ ์กฐ๊ธˆ ๋ถ€์กฑํ•œ ํƒ“์— ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋„ ๋Œ€์ฒ˜๋ฅผ ํ•  ์ˆ˜ ์žˆ์ง€ ๋ชปํ•œ ๊ฒƒ๋„ ๋ฌธ์ œ๊ธด ํ–ˆ๋‹ค ใ…Ž)

 

๊ฒŒ๋‹ค๊ฐ€ ๋˜ ๋‹ค๋ฅธ ์ด์Šˆ๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด, ๋‚˜๋Š” Mac์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์œผ๋กœ์„œ Window ์ปดํ“จํ„ฐ๋Š” ๋งค์šฐ ๋‚ฏ์„ค์—ˆ๋‹ค ใ…‹ใ…‹

 

์•„ ๋ฌผ๋ก  ๊ธˆ๋ฐฉ ์ ์‘์€ ํ–ˆ์ง€๋งŒ, ์‹œ๊ฐ„์ œํ•œ์ด ์žˆ๊ณ  oracleDB๋ฅผ ์“ฐ๋ฉฐ, db์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์ด ์กฐ๊ธˆ์€ ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ณด๋‹ˆ ์ข…ํ•ฉ์ ์œผ๋กœ ํ—ท๊ฐˆ๋ ธ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

 

์•„๋ฌดํŠผ ์ข‹์€ ๊ฒฝํ—˜์ด์—ˆ๊ณ  ์ด ๊ฒฝํ—˜์œผ๋กœ DB์—ฐ๊ฒฐํ•˜๋Š” ๋ฒ•์„ ๋˜ ๋ฐฐ์šฐ๊ณ  ๋‚˜์™”๋‹ค ใ…‹ใ…‹ใ…‹ 

 

 

 

 

์šฐ๋ฆฌfisa์—์„œ ์ง€์›ํ•ด์ฃผ๋Š” ์ž๊ฒฉ์ฆ ์‹œํ—˜

 

์šฐ๋ฆฌ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์ฃผ์ฐจ๋„ ํ™”์ดํŒ…์ด๋‹ค โ˜€๏ธ