๋ชฉ๋ก๐ซถ๐ป console.log(coding) ๐ซถ๐ป (244)
๐ค ์์งlog ๐ค
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bQivBo/btr5HrFGKRY/PZXA3g7PVnjddi80L5ycF0/img.png)
๊ฐ์ธ์ ์ผ๋ก๋ GitHub , ์ฌ์ด๋ํ๋ก์ ํธ ์์๋ Gitea, ํ์ฌ์์๋ GitLab์ ์ฌ์ฉ์ค์ด๋ค. ...๐ซ ๐ GitLab ์ด๋ ๊ฐ์ธ ๋๋ ์กฐ์ง์ด Git ๋ ํฌ์งํ ๋ฆฌ์ ๋ด๋ถ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ Github๋ก, ๋น๊ณต๊ฐ๋ Github ์ด๋ค. ๐ GitLab ์ฌ์ฉ์ด์ ๊น๋ฉ์ ์ค์ ์๋ฒ์์ git ์ ์ฅ์๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ ํฌ์งํ ๋ฆฌ ๋๋ ํ๋ก์ ํธ๋ฅผ ์๋ฒฝํ๊ฒ ์ ์ดํ ์ ์์ผ๋ฉฐ, ๊ณต๊ฐ ๋๋ ๋น๊ณต๊ฐ ์ฌ๋ถ๋ฅผ ๋ฌด๋ฃ๋ก ๊ฒฐ์ ํ ์ ์๋ค. ๐ GitLab (Clone,Checkout, Commit, Push ) ๐ 1. ์์ค ์ฝ๋ Clone ํ๊ธฐ with HTTPS ์์ค์ฝ๋๊ฐ ๋ค์ด์๋ ๋ ํฌ์งํ ๋ฆฌ์์ Clone -> Clone with HTTPS -> ๋ณต์ฌํ๋ค. $ git clone https://gitlab..
๐ ํ๋ก์ ํธ ์ธํ ํ์ํ ๋ํ๋์๋ฅผ ์ค์นํฉ๋๋ค. npm i -D babel-plugin-styled-component ๐ .babelrc ๋จผ์ ๋ฐ๋ฒจ ํ์ผ์ ์์ ํฉ๋๋ค. ์๋ ํ์ผ์ next.js์ ssr๊ณผ ์ฐ๊ด์ด ์๋๋ฐ, ssr์ ์ํด styled-components ์คํ์ผ์ด ์ ์ฉ ์ ์ ํ๋ฉด ๋ ๋๋ง์ด ๋๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํจ์ ๋๋ค. { "presets": ["next/babel"], "plugins": [ [ "babel-plugin-styled-components", { "fileName": true, "displayName": true, "pure": true, "ssr": true } ] ] } NextJS์์ Styled-components ์ฌ์ฉํ๊ธฐ npm i styled-components n..
๐ ํ๋ก์ ํธ ์ธํ next ํ๋ก์ ํธ๋ฅผ ์ค์นํ๊ณ ์ดํ ํ์ํ ๋ํ๋์๋ฅผ ์ค์นํฉ๋๋ค. npx create-next-app my-app cd my-app npm i @emotion/react @emotion/styled @mui/icons-material @mui/material @mui/styles nextjs๋ ์๋ฒ์ฌ์ด๋๋๋๋ง์ ํ๊ธฐ ๋๋ฌธ์ react์์ mui๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์ฒ๋ผ ์์ฝ๊ฒ ๋ฐ์ ๋์ง ์์ต๋๋ค. ๊ทธ๋์ ๋ช๊ฐ์ง ์ฌ์ ์์ ์ ํด์ผํฉ๋๋ค. ๐ _document.tsx _document๋ ์๋ฒ์ฌ์ด๋์ ๊ด์ฌํ๋ ๋ก์ง ๋๋ staticํ ๋ก์ง์ ์ถ๊ฐํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค. (_document๊ฐ ํ๋ ์ผ์ ์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด nextjs ๊ธฐ๋ณธ (opens new window)์ด ํฌ์คํ ์ ์ฐธ์กฐํด์ฃผ์ธ์.) ssr ์ง์์..
Next.js์ getStaticProps์ getStaticPaths api๋ฅผ ์ฌ์ฉํ๋ฉด static ํ์ด์ง๋ฅผ ์์ฑํ ์ ์๋ค. getStaticProps: ๋น๋ ์ ๋ฐ์ดํฐ๋ฅผ fetchํ์ฌ static ํ์ด์ง๋ฅผ ์์ฑ getStaticPaths: pages/**/[id].tsx ํํ์ ๋์ ๋ผ์ฐํ ํ์ด์ง ์ค, ๋น๋ ์์ staticํ๊ฒ ์์ฑํ ํ์ด์ง๋ฅผ ์ ํจ ๐ getStaticProps .tsx์์ export async function getStaticProps(context) ํํ๋ก ์ฌ์ฉ. context.params๋ก ๋์ ๋ผ์ฐํ ์ ๊ฒฝ๋ก ์ด๋ฆ์ ๊ฐ์ ธ์จ๋ค. pages/posts/[id].tsx ํ์ด์ง๋ฅผ /posts/123์ผ๋ก ์ ๊ทผํ๋ค๋ฉด context.params๋ { id: "123" }์ด ๋๋ค. { p..
Warning: Expected server HTML to contain a matching in . ์ด ์๋ฌ๋ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง ์์ html๊ณผ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง ์์ html์ด ์ผ์นํ์ง ์์์ ๋ฐ์ํ๋ ์๋ฌ๋ก ์ถ์ธก๋๋ค. ๊ทธ๋์ ์ค์ ๋ก ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค๋ฅผ ์ญ์ ํ๋ฉด ํด๋น ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ํด๊ฒฐ๋ฐฉ์ ๋ธ๋ผ์ฐ์ ์ฟ ํค ์ญ์ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค๋ฅผ ์ญ์ ํด์ html์ ์์ ์๋กญ๊ฒ ๋ ๋๋งํ๋ฉด ํด๋น ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ๊ธฐ์ตํ๊ณ ์๋ html์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ค๋ง ๊ณ์ ํ ์คํธ๋ฅผ ํ๋ฉด์ ์์ ์ ํ ๋๋ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค๋ฅผ ๊ณ์ ์ญ์ ํ๋ค๋ ๊ฒ ๋ฒ๊ฑฐ๋กญ๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์ถ๊ฐํด ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. useEffect๋ฅผ ์ฌ์ฉํด์ ๋ ๋๋ง ํ ์ํ ์ ๋ฐ์ดํธ use..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cZ6FP5/btrZiPdZQuB/p5yifCNDvIBkRLZRY9OzC1/img.gif)
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ { useState, useCallback, useEffect, useRef } ๋ฅผ ์ฌ์ฉํด์ ์ง์ ๊ตฌํํด๋ณด๊ธฐ๋ก ํ์๋ค ! ๐ฅ ์ฌ์ฉํ๊ธฐ๋ง ํด๋ดค์ง ์ง์ ๊ตฌํํ๋๋ฐ์๋ ๋๋ฌด ์ด๋ ต๊ณ ์ดํด๋ ์ ์๋์์ง๋ง ์ ๋ณด๋ ๋ง์๊ณ , ๋์๋ ๋ฐ์๊ฐ๋ฉฐ ์ด๊ฒ ์ ๊ฒ ์๋ก ์๋ํด๋ณด๋ ์ฌ๋ฏธ๋์์๋ค -๐ ๐ ๊ตฌํ ์ฝ๋ import { useState, useCallback, useEffect, useRef } from "react"; import styled from "styled-components"; import { getPostList, postType } from "datas/postList"; const List = (): JSX.Element => { const [page, setPage] = us..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/DPYfv/btrYRTHvKpV/k3ods3hKKHkQBQMVPLTqb1/img.jpg)
๋ฐ์ํ ์น์ด ์น ๋ ์ด์์์ ๋ง๋๋ ๊ธฐ์ค์ด ๋๋ฉด์ ๋ฐ์ํ ๋ ์ด์์์ ํ์ํ๊ธฐ ์ํ ๋๋ฐ์ด์ค๋ฅผ ๊ตฌ๋ถํ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ๋ค์ด ์ฌ์ฉ๋๊ณ ์์ต๋๋ค. ๋ํ์ ์ผ๋ก CSS ๋ฏธ๋์ด์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค. ์ด๋ค ๊ฒ์ ์ฌ์ฉํ๋๋ผ๋ ๋ฐ์ํ ๋ ์ด์์์ ๋๋ฐ์ด์ค์ ๋ฐ๋ผ ๊ตฌ๋ถํ๋ ๊ธฐ์ค์ ๊ฐ๋ก ๋๋น์ ๋๋ค. ๊ฐ๋ก ๋๋น ๊ฐ์ ๋ฐ๋ผ ๋๋ฐ์ด์ค๋ฅผ ์ธ์ํ๊ณ , ๋ ์ด์์์ ๊ฑฐ๊ธฐ์ ๋ง์ถฐ ๋ณ๊ฒฝํ๋ ๊ฒ์ด CSS ๋ฐ์ํ ๋ ์ด์์์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋๋ค. ๊ฐ๋ก ๋๋น๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ๊ฒ์ ๋ฐ์ํ ๋ ์ด์์์์ ๊ณตํต์ด์ง๋ง, ๋๋ฐ์ด์ค ์ข ๋ฅ๋ณ ๋๋น ๊ฐ ๊ธฐ์ค์ ์ ๊ฐ๊ฐ์ ๋๋ค. ๋ณ๋๋ก ์ ํด์ง ํ์ค์ด๋ผ๋ ๊ฒ์ด ์๊ธฐ ๋๋ฌธ์ ์ ๊ณ์์ ๋ง์ด ์ฌ์ฉํ๋ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ํ๊ธฐ๋ ํ๊ณ , ๋ ์ด์์ ํน์ง์ ๋ง์ถฐ ๊ฐ๋ณ์ ์ธ ๊ฐ์ ์ ํ๊ธฐ๋ ํฉ๋๋ค. ์์ด๋ก๋ ๋๋..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bNGEGX/btrX32HlrlF/K7CEQJnH7BQ3U8HLd7Fxo0/img.gif)
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ { useState ์ useEffect } ๋ฅผ ์ฌ์ฉํด์ ์ง์ ๊ตฌํํด๋ณด๊ธฐ๋ก ํ์๋ค ! ๐ฅ ๊ทธ์ ์๋ react-bootstrap์ผ๋ก๋ง ํด๋ดค๋ํฐ๋ผ,, ์กฐ๊ธ ๊ฑฑ์ ํ๋๋ฐ ์ญ์๋ ์ด๋ ค์ ์ง๋ง ์ ๋ณด๋ ๋ง์๊ณ , ์ด๊ฒ ์ ๊ฒ ์๋ก ์๋ํด๋ณด๋ ์ฌ๋ฏธ๋์์๋ค -๐ ๐ ๊ตฌํ ์ฝ๋ import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; import styled from "styled-components"; import { SLIDE_DATA } from "datas/slide"; const Banner = () => { const [currentSlide, setCurrentSlide] = useState(..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/npoIf/btrX4Zww4lZ/raXfXYPQYfjT4WQQ3UKDxK/img.png)
์ข ์ฐ ๋ก ์นดํ ๊ณ ๋ฆฌ ์ด๋ ๋ฐ ํฐ์น์ฌ๋ผ์ด๋๋ฅผ ๊ตฌํํด์ผ ํ๋ ์ํฉ์ด์๋๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์์ด ์ฒ์๋ถํฐ ๊ตฌํํ๊ณ ์ถ์์ง๋ง ์์ง ๋ด์ค๋ ฅ์ผ๋ก ๋ฌด๋ฆฌ,, ์ใธใ ;,, ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง์์ง๋ง ๋๋ Swiper ์ผ๋ก ๊ตฌํํด๋ณด๊ธฐ๋ก ํ์๋ค ! ๐ Swiper ์ค์น npm install swiper ๐ Swiper ์์ ์ฝ๋ import { Swiper, SwiperSlide } from 'swiper/react'; import { Pagination, Mousewheel, Keyboard } from 'swiper'; import 'swiper/css'; import 'swiper/css/pagination'; function () { return ( { console.log(swiper.activeIndex); }} ..
ํ๋ก๊ทธ๋๋จธ์ค Lv.0 - ์์ด์ค ์๋ฉ๋ฆฌ์นด๋ ธ ๐ ๋ฌธ์ ์ค๋ช ๋จธ์ฑ์ด๋ ์ถ์ด ๋ ์๋ ์์ด์ค ์๋ฉ๋ฆฌ์นด๋ ธ๋ง ๋ง์ญ๋๋ค. ์์ด์ค ์๋ฉ๋ฆฌ์นด๋ ธ๋ ํ์์ 5,500์์ ๋๋ค. ๋จธ์ฑ์ด๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ money๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ๋จธ์ฑ์ด๊ฐ ์ต๋๋ก ๋ง์ค ์ ์๋ ์๋ฉ๋ฆฌ์นด๋ ธ์ ์ ์์ ๋จ๋ ๋์ ์์๋๋ก ๋ด์ ๋ฐฐ์ด์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด๋ณด์ธ์. ๐ ์ ํ์กฐ๊ฑด 0