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

์ „์ฒด ๊ธ€

(33)
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 ( ์นด์šฐ์น˜ ์ฝ”๋”ฉ ) - ํŒ€ ํ”„๋กœ์ ํŠธ ์ฐธ๊ฐ€ [๊ธฐํš] ์ง€์›ํ•œ ์ด์œ  ๋ฉด์ ‘ ๊ด‘ํƒˆ, ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ด‘ํƒˆ ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ด์œ ๋กœ ์ž์‹ ๊ฐ์ด ๊ฒฐ์—ฌ๋œ ์ƒํƒœ์˜€๋‹ค. ์‚ฌ์‹ค ์ž…์‚ฌ ์ง€์›์„ ํ•˜๋ฉด์„œ ๋ถ™์–ด๋„ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค ํ•™๋ถ€ ๋•Œ๋Š” ์ž„๋ฒ ๋””๋“œ๋ฅผ ์ „๊ณตํ–ˆ์ง€๋งŒ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ฒ ๋‹ค๊ณ  ๋งˆ์Œ๋จน๊ณ  ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•œ ํ„ฐ๋ผ ํ”„๋ก ํŠธ์—”๋“œ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ๊ธฐ, ๊ทธ๋ฆฌ๊ณ  ํ˜‘์—…์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ์ •๋ง ๋งŽ์ด ๋ถ€์กฑํ•˜๋‹ค๊ณ  ๋А๋ผ๊ณ  ์žˆ์—ˆ๋‹ค. ์นด์šฐ์น˜ ์ฝ”๋”ฉ์— ์ฐธ์—ฌํ•˜๋ฉด์„œ ๊ฐ™์€ ๊ธธ์„ ๊ฑธ์–ด๋‚˜๊ฐ€๋Š” ๋™๋ฃŒ๋“ค๊ณผ ํ˜‘์—…์„ ํ•˜๋Š” ๊ฒฝํ—˜๋„ ์Œ“๊ณ  ๋‚ด ์ฝ”๋“œ๊ฐ€ ์˜ณ์€ ์ฝ”๋“œ์ธ์ง€ ๋ด์ฃผ์‹œ๋Š” ๋ฉ˜ํ† ๋‹˜์ด ์žˆ์œผ๋‹ˆ ์ด๊ฑด ๊ธฐํšŒ๋‹ค ! ์ƒ๊ฐํ•˜๊ณ  ๊ณ ๋ฏผ์—†์ด ์ฐธ๊ฐ€ํ–ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๊ฒฐ๊ณผ๋Š” ๋งค์šฐ๋งŒ์กฑ ๐Ÿ‘ ์นด์šฐ์น˜์ฝ”๋”ฉ์— ๋Œ€ํ•ด ์งง๊ฒŒ ์†Œ๊ฐœํ•˜๊ณ  ์šฐ๋ฆฌํŒ€์ด ์นด์šฐ์น˜ ์ฝ”๋”ฉ์—์„œ ๊ธฐํš์„ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰ํ–ˆ๋Š”์ง€ ์†Œ๊ฐœํ•˜๊ณ ์ž ํ•œ๋‹ค . ์นด์šฐ์น˜์ฝ”๋”ฉ ์†Œ๊ฐœ ์นด์šฐ์น˜์ฝ”๋”ฉ ๋‚ด์—์„œ ์ˆ˜์—…์„ ์†Œ๊ฐœํ•˜๋Š” ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์ „๋ฌธ ๋ฉ˜ํ†  ๊ฐœ๋ฐœ์ž..
HTTP ์‘๋‹ต ์ฝ”๋“œ 401(Unauthorized) vs 403(Forbidden) ์ฐจ์ด์  4xx ๋Œ€ ์—๋Ÿฌ๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ž˜๋ชป๋œ ์š”์ฒญ(request)์„ ๋ณด๋ƒˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋‹ค. ๊ทธ ์ค‘ 401 ์—๋Ÿฌ์™€ 403 ์—๋Ÿฌ๋Š” ๋ชจ๋‘ ์ธ์ฆ์ด ์•ˆ๋์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ๋‘ ์—๋Ÿฌ์— ๋Œ€ํ•œ ์ฐจ์ด์ ์„ ์•Œ์•„๋ณด์ž ! 401 ์—๋Ÿฌ 401 (Unauthorized) ํด๋ผ์ด์–ธํŠธ ์˜ค๋ฅ˜ ์ƒํƒœ ์‘๋‹ต ์ฝ”๋“œ๋Š” ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ์œ ํšจํ•œ ์ธ์ฆ ์ž๊ฒฉ ์ฆ๋ช…์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ์ด ์ ์šฉ๋˜์ง€ ์•Š์•˜์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฆ‰ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ๋Œ€์ฒด๋กœ ๋กœ๊ทธ์ธ ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๊ธ€์„ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ๋งˆ์ดํŽ˜์ด์ง€๋ฅผ ์กฐํšŒํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์„œ๋ฒ„๋Š” 401 ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 403 ์—๋Ÿฌ 403 (Forbidden) ํด๋ผ์ด์–ธํŠธ ์˜ค๋ฅ˜ ์ƒํƒœ ์‘๋‹ต ์ฝ”๋“œ๋Š” ์„œ๋ฒ„์— ์š”์ฒญ์ด ์ „๋‹ฌ๋˜์—ˆ์ง€๋งŒ, ๊ถŒํ•œ ๋•Œ๋ฌธ์— ๊ฑฐ์ ˆ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰ ๋กœ๊ทธ์ธ์€ ํ–ˆ์ง€..
๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ์›๋ฆฌ ( Critical Rendering Path ) ๋ Œ๋”๋ง์ด๋ž€ ์›น์‚ฌ์ดํŠธ์— url๋กœ ์ ‘๊ทผํ–ˆ์„ ๋•Œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ( HTML,CSS, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ) ๋“ฑ์˜ ์‘๋‹ต์„ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด๋‹ค ๋ธŒ๋ผ์šฐ์ € ์—”์ง„ ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ Œ๋”๋ง ์—”์ง„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ์—”์ง„ ํŒŒ์ด์–ด ํญ์Šค ๊ฒŒ์ฝ” ์—”์ง„ ์‚ฌํŒŒ๋ฆฌ, ํฌ๋กฌ ์›นํ‚ท ์—”์ง„ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง (Critical Rendering Path) ๊ณผ์ • Critical Rendering Path(CRP)๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML ์‘๋‹ต์„ ๋ฐ›์•„ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. DOM ํŠธ๋ฆฌ ๋งŒ๋“ค๊ธฐ CSSOM ํŠธ๋ฆฌ ๋งŒ๋“ค๊ธฐ Render ํŠธ๋ฆฌ ๋งŒ๋“ค๊ธฐ ๋ ˆ์ด์•„์›ƒ ์ƒ์„ฑํ•˜๊ธฐ ํŽ˜์ธํŒ… ์ด์ œ ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž DOM ํŠธ๋ฆฌ ์ƒ์„ฑ HTML ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑ ํ•˜์—ฌ DOM(Document Object Model) ํŠธ๋ฆฌ๋ฅผ ..