๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Couch Coding

(8)
Couch Coding ( ์นด์šฐ์น˜ ์ฝ”๋”ฉ ) - CampUs ํ”„๋กœ์ ํŠธ ํšŒ๊ณ  ์นด์šฐ์น˜์ฝ”๋”ฉ์—์„œ ์ง„ํ–‰ํ•˜๋Š” 6์ฃผ๊ฐ„์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋์ด ๋‚ฌ๋‹ค. 6์ฃผ๊ฐ„ ํŒ€์› ๋ชจ๋‘๊ฐ€ ์—ด์ •์ ์œผ๋กœ ์ž„ํ•ด์ฃผ์–ด์„œ ๋งˆ๋ฌด๋ฆฌ๊ฐ€ ์ž˜ ๋œ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค ์ƒˆ๋ฒฝ๊นŒ์ง€ ๋‚จ์•„ ๊ฐœ๋ฐœํ•˜๋ฉฐ ํŒ€์œผ๋กœ ์ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์ •๋ง ๋ฉ‹์ง„ ์ผ์ด๋ผ๋Š” ๊ฒƒ์„ ๋А๋ผ๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ๋А๋ผ๊ณ  ๋ฐฐ์› ๋˜ ๊ฒƒ๋“ค์„ ๊ธฐ๋กํ–ˆ์—ˆ๊ณ , ์ด์ œ๋Š” ํšŒ๊ณ ๋ฅผ ์จ๋ณด์ž ํ•œ๋‹ค. CampUs ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์ด ๋‹ค์–‘ํ•œ ์•„์ด๋””์–ด๋ฅผ ๋ƒˆ์—ˆ๋Š”๋ฐ, ์†”์งํžˆ ๋ง‰ ๋Œ๋ฆฐ๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ์•„์ด๋””์–ด๋Š” ์—†์—ˆ๋‹ค. ๊ทธ ๋‹น์‹œ๋งŒ ํ•ด๋„ ๋‚ด ์ž์‹ ๊ฐ์ด ๋ฐ”๋‹ฅ์„ ๊ธฐ์–ด ๋‹ค๋‹ ๋•Œ์—ฌ์„œ ์–ด๋”œ ๊ฐ€๋“  1์ธ๋ถ„๋งŒ ํ•˜๋ฉด ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค ์–ด๋А ํŒ€, ์–ด๋–ค ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋“  ํŒ€์› ๋ถ„๋งŒ ์ž˜ ๋งŒ๋‚˜๋ฉด ์ข‹๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์บ ํ•‘์žฅ์„ ์ถ”์ฒœ ์„œ๋น„์Šค ํŒ€์— ์ฐธ์—ฌํ•˜๊ฒŒ ๋˜์—ˆ๊ณ  ํŒ€์›๋ถ„๋“ค๊ณผ ์งง์€ ๋Œ€ํ™”๋ฅผ ๋‚˜..
Couch Coding ( ์นด์šฐ์น˜ ์ฝ”๋”ฉ ) - ReactKakaoMapSDK ์ด์šฉํ•˜์—ฌ ๋งˆ์ปค, ์ปค์Šคํ…€ ์˜ค๋ฒ„๋ ˆ์ด ์ƒ์„ฑํ•˜๊ธฐ (์นด์นด์˜ค๋งต) ์šฐ๋ฆฌ ํŒ€์ด ํ˜„์žฌ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋Š” CampUs ์„œ๋น„์Šค๋Š” ์ง€๋„๋ฅผ ํ†ตํ•ด ์บ ํ•‘์žฅ์˜ ์ขŒํ‘œ๋ฅผ ํ™•์ธํ•˜๊ณ  ์บ ํ•‘์žฅ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค์ด๋‹ค ์œ„ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์บ ํ•‘์žฅ์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅธ ์ขŒํ‘œ๊ฐ€ ์ง€๋„์— ๋“ฑ๋ก๋˜๊ณ  ๋งˆ์ปค๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ์‚ฌ์ง„๊ณผ ๊ฐ™์•„ '์ปค์Šคํ…€ ์˜ค๋ฒ„๋ ˆ์ด'๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง ํ•œ๋‹ค. ์ด์ „์— kakaoMap API๋ฅผ ํ†ตํ•ด ๋ฆฌ์•กํŠธ์—์„œ ๊ฐœ๋ฐœ์„ ํ–ˆ์„ ๋•Œ ๋ฆฌ์•กํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์กฐ๊ธˆ ๋ถˆํŽธํ•˜๋‹ค๊ณ  ๋А๋‚€์ ์ด ์žˆ์–ด์„œ ํŽธ๋ฆฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†์„๊นŒ ์ฐพ์•„๋ณด๋‹ค๊ฐ€ https://github.com/JaeSeoKim/react-kakao-maps-sdk GitHub - JaeSeoKim/react-kakao-maps-sdk: React components for using kakao map api React components for ..
Couch Coding ( ์นด์šฐ์น˜ ์ฝ”๋”ฉ ) - AntDesign ์ด์šฉํ•˜์—ฌ ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ตฌํ˜„ํ•˜๊ธฐ Ant Design์€ ์•Œ๋ฆฌ๋ฐ”๋ฐ” ๊ทธ๋ฃน์—์„œ ๊ฐœ๋ฐœํ•œ UI ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค . Button, Slide, Input, Form ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค Ant Design์„ ์ด์šฉํ•˜์—ฌ ์†์‰ฝ๊ฒŒ ์Šฌ๋ผ์ด๋“œ์™€ ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž ! ๐Ÿ“„ Pagination ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž ์œ„ ํŽ˜์ด์ง€๋„ค์ด์…˜ Example์„ ์‚ฌ์šฉํ•ด๋ณด์ž! // Pagination import { Pagination } from 'antd'; const [currentPage, setCurrentPage] = useState(); // ํ˜„์žฌ ํŽ˜์ด์ง€ State // Ant Design์˜ Pagination ์ปดํฌ๋„ŒํŠธ { changePage(value); // ํŽ˜์ด์ง€์˜ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด changePage ํ•จ..
Couch Coding ( ์นด์šฐ์น˜ ์ฝ”๋”ฉ ) - Geolocation API ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ํ˜„์žฌ์œ„์น˜ ๊ฐ€์ ธ์˜ค๊ธฐ ์ด ํฌ์ŠคํŠธ์—์„œ๋Š” geolocation API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ ํ•ด ๋ณผ ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ ํŒ€์ด ์นด์šฐ์น˜์ฝ”๋”ฉ์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋Š” CampUs ์„œ๋น„์Šค๋Š” ๋ฉ”์ธํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ์ž์˜ ์œ„์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž ์ฃผ๋ณ€ ์บ ํ•‘์žฅ์„ ์ถ”์ฒœํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ ์žˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฉ”์ธํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€์ž๋งˆ์ž ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ์œ„์น˜๋ฅผ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค ! ํ˜„์žฌ์œ„์น˜๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” navigator ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. navigator.geolocation.getCurrentPosition(์œ„์น˜๋ฅผ ๋ฐ›์€ ๋‹ค์Œ ์‹คํ–‰ํ•  ํ•จ์ˆ˜, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ ํ–ˆ์„ ๋•Œ ์‹คํ–‰ํ•  ํ•จ์ˆ˜); navigator ๊ฐ์ฒด๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ณต๊ธ‰์ž ๋ฐ ๋ฒ„์ „ ์ •๋ณด ๋“ฑ์„ ํฌํ•จํ•œ ๋ธŒ๋ผ์šฐ์ €์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค . getCurre..
Couch Coding ( ์นด์šฐ์น˜ ์ฝ”๋”ฉ ) - ๊ธ€๋กœ๋ฒŒ axios ๊ธฐ๋ณธ(defaults) ์„ค์ • ์ด๋ฒˆ ๊ธ€์€ axios๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž axios์˜ default๋ฅผ ์„ค์ •ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด axiosInstance๋ผ๋Š” ํŒŒ์ผ๋‚ด์—์„œ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•˜์ž ์šฐ๋ฆฌ ํŒ€์€ ์œ„ ์ฒ˜๋Ÿผ commonํด๋”์—์„œ ๊ด€๋ฆฌ๋ฅผ ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ด์ œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž // axiosInstance.js import axios from 'axios'; const axiosInstance = axios.create({ baseURL: 'https://api.example.com' }); axiosInstance.defaults.headers.common['Authorization'] = 'FIREBASE AUTH TOKEN'; export default axiosInstance; ์œ„ ์ฝ”๋“œ๋Š” ๋ฉ˜ํ† ๋‹˜์ด ์ฒ˜์Œ ์ฃผ์‹  ์˜ˆ์‹œ ์ฝ”๋“œ์ด๋‹ค. ax..
Couch Coding ( ์นด์šฐ์น˜ ์ฝ”๋”ฉ ) - Frontend์—์„œ CORS ํ•ด๊ฒฐํ•˜๊ธฐ .. ๋ฌธ์ œ์˜ ์‹œ์ž‘ โ˜ ๏ธ ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…์„ ์œ„ํ•ด FIrebase๋กœ Google oAuth๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  Firebase ๋‚ด์— ํ† ํฐ์„ ๊ฐ€์ง€๊ณ  ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ–ˆ์—ˆ๋‹ค. ์•ˆ ๋˜๋”๋ผ .. ๐Ÿšจ Access to fetch at ‘https://api.lubycon.com/me’ from origin ‘http://localhost:3000’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch th..
Couch Coding ( ์นด์šฐ์น˜ ์ฝ”๋”ฉ ) - json-server ๋ฅผ ์ด์šฉํ•œ Mock ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ๊ธฐํš ๋‹จ๊ณ„๊ฐ€ ์ง€๋‚˜๊ฐ€๊ณ  ์‹ค์ œ๋กœ ํŒ€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹œ์ž‘์ด ๋˜์—ˆ๋‹ค. ๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์˜ ์†๋„ ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฑ์—”๋“œ API ๊ฐ€ ์™„์„ฑ ๋  ๋•Œ ๊นŒ์ง€ ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋ฌด์—‡์„ ํ•ด์•ผํ• ๊นŒ ? ๋ฐ”๋กœ ๋ฐฑ์—”๋“œํŒ€์—์„œ API ๊ฐœ๋ฐœ ์™„๋ฃŒ๋ ๋•Œ๊นŒ์ง€ json - server๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ€์ƒ์˜ ๋ฐ์ดํ„ฐ, api ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‹ค์ œ API๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๋‹ค๊ฐ€ ์ถ”ํ›„ ์‹ค์ œ API๋ฅผ ์—ฐ๋™ํ•˜๋ฉด ๋˜๊ฒ ๋‹ค. ์„ค์น˜ ๋ฐฉ๋ฒ• npm install -g json-server ์„ค์น˜๊ฐ€ ์™„๋ฃŒ ๋˜์—ˆ๋‹ค๋ฉด ์œ„์™€ ๊ฐ™์ด ํ”„๋กœ์ ํŠธ ํด๋” ๋‚ด๋ถ€ ์ตœ์ƒ์œ„์— json-server๋ผ๋Š” ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ์•ˆ์— db.json์ด๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค์ž. ์ด์ œ ์‹ค์ œ ๊ฐœ๋ฐœ ๋  API ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ db.json ํŒŒ์ผ์•ˆ์— mock ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋˜๊ฒ ๋‹ค. ์•„๋ž˜๋Š” ์‹ค์ œ ๊ฐœ๋ฐœ..
Couch Coding ( ์นด์šฐ์น˜ ์ฝ”๋”ฉ ) - ํŒ€ ํ”„๋กœ์ ํŠธ ์ฐธ๊ฐ€ [๊ธฐํš] ์ง€์›ํ•œ ์ด์œ  ๋ฉด์ ‘ ๊ด‘ํƒˆ, ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ด‘ํƒˆ ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ด์œ ๋กœ ์ž์‹ ๊ฐ์ด ๊ฒฐ์—ฌ๋œ ์ƒํƒœ์˜€๋‹ค. ์‚ฌ์‹ค ์ž…์‚ฌ ์ง€์›์„ ํ•˜๋ฉด์„œ ๋ถ™์–ด๋„ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค ํ•™๋ถ€ ๋•Œ๋Š” ์ž„๋ฒ ๋””๋“œ๋ฅผ ์ „๊ณตํ–ˆ์ง€๋งŒ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ฒ ๋‹ค๊ณ  ๋งˆ์Œ๋จน๊ณ  ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•œ ํ„ฐ๋ผ ํ”„๋ก ํŠธ์—”๋“œ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ๊ธฐ, ๊ทธ๋ฆฌ๊ณ  ํ˜‘์—…์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ์ •๋ง ๋งŽ์ด ๋ถ€์กฑํ•˜๋‹ค๊ณ  ๋А๋ผ๊ณ  ์žˆ์—ˆ๋‹ค. ์นด์šฐ์น˜ ์ฝ”๋”ฉ์— ์ฐธ์—ฌํ•˜๋ฉด์„œ ๊ฐ™์€ ๊ธธ์„ ๊ฑธ์–ด๋‚˜๊ฐ€๋Š” ๋™๋ฃŒ๋“ค๊ณผ ํ˜‘์—…์„ ํ•˜๋Š” ๊ฒฝํ—˜๋„ ์Œ“๊ณ  ๋‚ด ์ฝ”๋“œ๊ฐ€ ์˜ณ์€ ์ฝ”๋“œ์ธ์ง€ ๋ด์ฃผ์‹œ๋Š” ๋ฉ˜ํ† ๋‹˜์ด ์žˆ์œผ๋‹ˆ ์ด๊ฑด ๊ธฐํšŒ๋‹ค ! ์ƒ๊ฐํ•˜๊ณ  ๊ณ ๋ฏผ์—†์ด ์ฐธ๊ฐ€ํ–ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๊ฒฐ๊ณผ๋Š” ๋งค์šฐ๋งŒ์กฑ ๐Ÿ‘ ์นด์šฐ์น˜์ฝ”๋”ฉ์— ๋Œ€ํ•ด ์งง๊ฒŒ ์†Œ๊ฐœํ•˜๊ณ  ์šฐ๋ฆฌํŒ€์ด ์นด์šฐ์น˜ ์ฝ”๋”ฉ์—์„œ ๊ธฐํš์„ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰ํ–ˆ๋Š”์ง€ ์†Œ๊ฐœํ•˜๊ณ ์ž ํ•œ๋‹ค . ์นด์šฐ์น˜์ฝ”๋”ฉ ์†Œ๊ฐœ ์นด์šฐ์น˜์ฝ”๋”ฉ ๋‚ด์—์„œ ์ˆ˜์—…์„ ์†Œ๊ฐœํ•˜๋Š” ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์ „๋ฌธ ๋ฉ˜ํ†  ๊ฐœ๋ฐœ์ž..