๐Ÿง‘โ€๐Ÿ’ป ์งง์€ํ˜ธํก/React

์„ธ์˜ค์Šค ๋ฆฌ์•กํŠธ ๋ฉ”์‹ ์ € ๊ณผ์ œ๋ฅผ ์ค€๋น„ํ•˜๋ฉด์„œ 6๊ฐœ์›” ์ „์— ์ œ์ถœํ–ˆ๋˜ ๊ณผ์ œ๋ฅผ ๋‹ค์‹œ ๋ณด์•˜๋‹ค. ์‹œ๊ฐ„์— ์ซ“๊ฒจ๊ฐ€๋ฉด์„œ ํ•˜๋‹ค๋ณด๋‹ˆ, ๊ต‰์žฅํžˆ ๋”๋Ÿฌ์šด ๋ถ€๋ถ„์ด ๊ฝค ์žˆ๋‹ค. ์ด๋Ÿฐ์ €๋Ÿฐ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ ์ด๋Ÿฐ์ €๋Ÿฐ ์˜ต์…˜๊ณผ props๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๊ณ , ๊ทธ๋ ‡๊ฒŒ ๋ชฌ์Šคํ„ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋˜์–ด๊ฐ„๋‹ค. ์Šคํƒ€์ผ๋ง์„ ํ• ๋•Œ๋„ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ ๋•Œ๊นŒ์ง€ ์ˆ˜์ •์— ์ˆ˜์ •์„ ๊ฑฐ๋“ญํ•˜๋‹ค๋ณด๋‹ˆ ๋งค์šฐ ๋ณต์žกํ•ด์กŒ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ ํฌ์ŠคํŒ…์€ 6๊ฐœ์›” ์ „ ๊ณผ์ œ๋ฌผ ๋ฆฌํŒฉํ† ๋ง์˜ ๊ธฐ๋ก! Recoil selectorFamily ์ปค์Šคํ…€ํ›…์„ ์ด์šฉํ•ด ๋กœ์ง ์ถ”์ƒํ™” Funtion as Child Component ํƒ€์ž… ๊ฐ€๋“œ 1. ๋„ค์ด๋ฐ ์ œ์ผ ์‹œ๊ธ‰ํ–ˆ๋‹ค. ๊ณ„์† ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ ๊ธ‰๊ธ‰ํ•˜๊ฒŒ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๊ฐ”๋‹ค. Room, chats, chatList ๋“ฑ์˜ ์ด๋ฆ„์ด ๋ณ„๋‹ค๋ฅธ ๊ธฐ์ค€ ์—†์ด ์‚ฌ์šฉ๋˜๋Š”๊ฒŒ ์Šค์Šค๋กœ๋„ ๊ฐ๋‹นํ•˜๊ธฐ ํž˜๋“ค ์ •๋„์˜€๋‹ค..
์ค‘๊ฐ„๊ณ ์‚ฌ ๊ธฐ๊ฐ„ ์ž˜ ๋ณด๋‚ด์…จ๋‚˜์š”.. ์ „ ๋ชป๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ํ‘ํ‘ ๋‹ค์Œ ํ•™๊ธฐ์—” ๋ฌด์กฐ๊ฑด ๊ธฐ์ˆ™์‚ฌ์— ๋“ค์–ด๊ฐ€๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ํ•ด๋ณด๋ฉด์„œ, ์ด๋ฒˆ์ฃผ WIL์„ ์ ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ํœด์‹๊ธฐ๊ฐ„๋™์•ˆ ์งœ์ž˜์งœ์ž˜ํ•˜๊ฒŒ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฑด๋“œ๋ ค๋ณด์•˜์Šต๋‹ˆ๋‹ค. 1. ์ด์ „์— ์žˆ์—ˆ๋˜, ๋ฐ”ํ…€์‹œํŠธ ๊ด€๋ จ ๋ฌธ์ œ ๊ฐ TodoItem๋งˆ๋‹ค ์žˆ๋˜ ๋ฐ”ํ…€์‹œํŠธ๋ฅผ ๋” ์ƒ์œ„๋กœ ์˜ฌ๋ ค์„œ ๊ด€๋ฆฌํ•˜๋„๋ก ํ–ˆ๋‹ค. ์ด์   ์–ด๋–ค ํˆฌ๋‘์—์„œ ์—ฐ ๋ฐ”ํ…€์‹œํŠธ์ธ์ง€ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์„ ํƒ๋œ ํˆฌ๋‘๋ฅผ ์ „์—ญ์ƒํƒœ๋กœ ๊ด€๋ฆฌํ•˜๋„๋ก ํ–ˆ๋‹ค. useBottomSheet.tsx import { useRecoilState } from 'recoil'; import { ITodoItem } from '../interfaces/ITodoItem'; import { bottomSheetState } from '../sto..
๋งŒ๋“ค์–ด๋‘” ๊ณผ์ œ ์ปค๋ฆฌํ˜๋Ÿผ์„ ์ฐฌ์ฐฌํžˆ ๋‹ค์‹œ ๋ณด๋‹ค๊ฐ€. ์–ด๋ผ ์ด๊ฑฐ ํˆฌ๋‘๋ฉ”์ดํŠธ ์•„๋‹Œ๊ฐ€? ํ•ด์„œ GDSC ์Šคํ„ฐ๋”” ๊ธฐ๊ฐ„ ๋™์•ˆ ํˆฌ๋‘๋ฉ”์ดํŠธ ํด๋ก ์ฝ”๋”ฉ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•ด๋ณด๊ธฐ๋กœ. ํด๋ก ์ฝ”๋”ฉ์ธ ๋งŒํผ ์ตœ๋Œ€ํ•œ ๋˜‘๊ฐ™์ด ์Šคํƒ€์ผ์„ ๋„ฃ์œผ๋ ค ๋…ธ๋ ฅํ–ˆ๋‹ค. ๊ฐ–๊ณ  ์žˆ๋Š” ์‚ฐ์„ธ๋ฆฌํ”„ ๊ธ€๊ผด์„ ๋ช‡๊ฐœ ๋„ฃ์–ด๋ดค๋Š”๋ฐ, ํ”„๋ฆฌํ…๋‹ค๋“œ์˜€๋‹ค. ์ข‹์•„ํ•˜๋Š” ํฐํŠธ์•ผ. ๊ทธ ์™ธ์— ์ด๋ฏธ์ง€๋‚˜ ์•„์ด์ฝ˜ ๋“ฑ์€ ๊ฐœ๋ฐœ์ž๋„๊ตฌ ๋„คํŠธ์›Œํฌํƒญ์—์„œ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ํ”ผ๊ทธ๋งˆ์—์„œ ์ง์ ‘ ๋งŒ๋“ค์–ด svg๋กœ ๋‚ด๋ณด๋‚ด ์‚ฌ์šฉํ–ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์งœ๊ธฐ์— ์•ž์„œ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์งค์ง€์— ๋Œ€ํ•ด์„œ ๊ณ ๋ฏผ์„ ๊ฝค ์˜ค๋ž˜ ํ–ˆ์—ˆ๋‹ค. ์‹ค์ œ ํˆฌ๋‘๋ฉ”์ดํŠธ๋ฅผ ๋ณด๋ฉด ๋“œ๋ž˜๊ทธ์•ค ๋“œ๋ž์œผ๋กœ ํˆฌ๋‘๋ฅผ ์˜ฎ๊ฒจ ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ์žˆ๋‹ค. ์‹ฌ์ง€์–ด ๋‹ค๋ฅธ ์นดํ…Œ๊ณ ๋ฆฌ๋กœ๋„! ํ•˜์ง€๋งŒ - ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํˆฌ๋‘- -์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํˆฌ๋‘- ์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌํ•ด๋†“์œผ๋ฉด ๋‚˜์ค‘์— ๋“œ๋ž˜๊ทธ์•ค๋“œ๋ž์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋‹ค๋ฅธ ์นดํ…Œ..
ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๊ณ  ๋Ž์Šค๊ฐ€ ๊นŠ์–ด์ง€๋ฉด์„œ ํŒŒ์ผ์„ import ํ•ด์˜ฌ๋•Œ๋งˆ๋‹ค ๋ฒˆ๊ฑฐ๋กœ์›Œ์กŒ๋‹ค. ../์ด 4๊ฐœ๋ผ๋‹ˆ. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ฆฌ์•กํŠธ ํ™˜๊ฒฝ์—์„œ ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ธํŒ…์„ ํ•ด๋ณด์•˜๋‹ค. ์ด๋ฒˆ ๊ธ€์€ ๊ทธ ์‚ฝ์งˆ์˜ ๊ธฐ๋ก. import { useAppDispatch } from '../../../../store/app/hooks'; import { dispatchItemName } from '../../../../store/slices/challengePayloadSlice'; import a1 from '../../../../assets/icons/itemName/a1.svg'; 1. Craco๋กœ config ๊ฑด๋“œ๋ฆฌ๊ธฐ ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” webpack์˜ config๋ฅผ ๊ฑด๋“œ๋ ค์•ผ ํ•œ๋‹ค. CRA๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ..
๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ๊นƒํ—ˆ๋ธŒ ์•ก์…˜์„ ํ†ตํ•ด ๋„์ปค ํ—ˆ๋ธŒ์— ํ‘ธ์‰ฌํ•˜๋Š” ๊ณผ์ •๊นŒ์ง€๋Š” ์ด์ „ ๊ธ€์—. ์กฐ์ง ๋‚ด์— deploy์šฉ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ํ•˜๋‚˜ ํŒŒ์„œ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ณณ์—์„  ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ์ด์šฉํ•ด ๋ฐฑ์—”๋“œ, ํด๋ผ์ด์–ธํŠธ, nginx ์„ธ๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›์•„์™€ ์‹คํ–‰ํ•œ๋‹ค. ๋จผ์ € ๊นƒํ—ˆ๋ธŒ ์•ก์…˜๋ถ€ํ„ฐ. prod-deploy.yml name: Deploy to Ec2 on: workflow_dispatch: push: branches: - main jobs: build: name: Build runs-on: ubuntu-latest steps: - name: checkout uses: actions/checkout@master - name: create remote directory uses: appleboy/ssh-action@master wit..
๊นƒํ—ˆ๋ธŒ ์•ก์…˜๊ณผ ๋„์ปค๋ฅผ ์ด์šฉํ•ด ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ ์ž๋™ ๋ฐฐํฌ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด๋ณด๊ธฐ. ๋„์ปค์— ๊ด€ํ•œ ์ธ๊ฐ•์„ ์ „์—ญํ•˜๊ณ  ์–ผ๋งˆ ์•ˆ๋์„๋•Œ ์กฐ๊ธˆ ๋“ฃ๋‹ค ๋ง์•˜๊ณ , ๊ทธ ์ดํ›„๋ก  CI/CD์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์—. ์ด ๊ธฐํšŒ์— ์ •๋ฆฌ๋ฅผ ํ•ด๋†”์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค. ๋‚ด๊ฐ€ ํ•œ ๋ถ€๋ถ„์€ ํ”„๋ก ํŠธ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๊ด€๋ จ ๋ฟ์ด์ง€๋งŒ ํŒ€์—์„œ ๊ตฌ์ถ•ํ•œ ์ „์ฒด์ ์ธ ํ๋ฆ„์„ ์ ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ „์ฒด์ ์ธ ์ฝ”๋“œ๋Š” ์ด์ „์— ๊ณ ์Šค๋ฝ ํ”„๋กœ์ ํŠธ ํ•˜๋ฉด์„œ ์ฐฌ์ง„์ด๊ฐ€ ์„ธํŒ…ํ•œ๊ฑฐ ๋ณด๊ณ  ์—ด์‹ฌํžˆ ๋œฏ์–ด์„œ ๋ฐฐ์›Œ์™”์Œ. ์‚ฌ์šฉํ•  ๊ฒƒ๋“ค Github Actions Docker, Docker Compose Nginx ์ „์ฒด์ ์ธ ํ๋ฆ„ ํ”„๋ก ํŠธ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ main ๋ธŒ๋žœ์น˜์— push Github Actions์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ๋„์ปค ํ—ˆ๋ธŒ๋กœ push ์ƒˆ๋กœ ๋ฐฐํฌ๋ฅผ ์›ํ•  ๋•Œ Deploy ๋ ˆํฌ์ง€..
1. ์Šคํ† ๋ฆฌ๋ถ ์„ค์น˜ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์—์„œ ์‹คํ–‰ .storybook ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— main.js์™€ preview.js๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. # Add Storybook: npx storybook init npm run storybook ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋กœ์ปฌํ˜ธ์ŠคํŠธ 6006๋ฒˆ ํฌํŠธ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. 2. Styled-components ์ ์šฉ preview.js์—์„œ ์„ค์ •์„ ํ•ด์ค€๋‹ค. import React from 'react'; import { ThemeProvider } from 'styled-components'; import { GlobalStyle } from '../src/lib/styles/global-style'; import { theme } from '../src/lib/styles/t..