ํ”„๋ก ํŠธ์—”๋“œ/ํฌํŠธํด๋ฆฌ์˜ค ์ œ์ž‘ ๊ณผ์ •

[ํฌํŠธํด๋ฆฌ์˜ค ์ œ์ž‘ ๊ณผ์ •] ํ™˜๊ฒฝ ์„ค์ •(React์™€ TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ )

1eehyunji 2023. 12. 4. 19:16

๋จผ์ €, ๋‚˜๋Š” React, TypeScript๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ CSS ์Šคํƒ€์ผ๋ง์€ Styled-Component๋ฅผ ์“ฐ๊ณ , ๊ฒŒ์‹œํŒ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” Firebase๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•ด๋ดค๋˜ React๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ํŽธํ•ด์„œ๋„ ์žˆ์ง€๋งŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์šฉ์ดํ•˜๋‹ค.
    • ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋Šฅ๊ณผ ์—ญํ• ์„ ๊ตฌ๋ถ„ํ•ด์„œ ์œ ์ง€๋ณด์ˆ˜์™€ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•˜๊ณ , ๋ฐ˜๋ณต ์‚ฌ์šฉ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ ๋ถ„๋ฆฌํ•ด์„œ ์ €์žฅํ•ด๋‘๊ณ  ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Virtual DOM์„ ์ด์šฉํ•ด์„œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • Virtual DOM์€ ์‹ค์ œ DOM์˜ ๋ณต์‚ฌ๋ณธ์œผ๋กœ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณ€ํ™”๋ฅผ ์ฃผ๊ณ  ์‹ถ์€ ๋ถ€๋ถ„๋งŒ Virtual DOM์„ ๋ณ€๊ฒฝํ•œ ๋’ค์— ์‹ค์ œ DOM๊ณผ ๋น„๊ตํ•ด์„œ ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚œ ๋ถ€๋ถ„ ์ฆ‰, ์‹ค์ œ DOM๊ณผ Virtual DOM์˜ ์ฐจ์ด์ ๋งŒ DOM์— ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋งŒ์•ฝ Virtual DOM์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ์œ ์ €์˜ ์ธํ„ฐ๋ž™์…˜์— ๋”ฐ๋ผ ์–ด๋–ค ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๋ Œํ„ฐ ํŠธ๋ฆฌ ์žฌ์ƒ์„ฑ, ์š”์†Œ์˜ ์Šคํƒ€์ผ ๊ณ„์‚ฐ, ํŒจ์ธํŒ… ๋“ฑ์„ ๋‹ค์‹œ ํ•ด์ฃผ์–ด์•ผ ํ•˜๊ณ , ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋ฉด ์‹œ์Šคํ…œ์ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์—ฐ์‚ฐ์ด ๋งค์šฐ ๋งŽ์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค. 
  • ๊ฑฐ๋Œ€ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์›
  • JSX ๋ฌธ๋ฒ• ์ง€์›
    • JSX๋Š” JavaScript + XML์„ ์˜๋ฏธํ•˜๊ณ , ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ™•์žฅ ๋ฌธ๋ฒ•์ด๋‹ค. 
    • ์•„๋ž˜์™€ ๊ฐ™์ด return()๋ฌธ์„ ์ด์šฉํ•ด์„œ HTML์„ ์ปดํฌ๋„ŒํŠธํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.
    • ์ดํ›„ Babel์—์„œ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค.
import React from "react";

const App = () => {
  return (
    <div className="App">
        Hello
    </div>
  );
};

export default App;

 

 

๋™์  ํƒ€์ž… ์–ธ์–ด์ธ JavaScript์— ์ •์  ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•œ TypeScript๋Š” ๋‹ค์Œ ์ด์œ ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ, Type ์ฆ‰, ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ๋ณ€์ˆ˜์— ๊ฐ’์ด ๋“ค์–ด๊ฐˆ ๋•Œ ์–ด๋–ค ํƒ€์ž…์˜ ๊ฐ’์ด ๋“ค์–ด๊ฐˆ์ง€ ์„ ์–ธํ•ด์ฃผ๋Š”๋ฐ, ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ๋งž์ง€ ์•Š์€ ํƒ€์ž…์ด ๋“ค์–ด๊ฐ€๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์†์‰ฝ๊ฒŒ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ง๊ด€์ ์ธ ์ฝ”๋“œ
    • Javascript๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ๊ฐ์ฒด์˜ ํ•„๋“œ๋‚˜ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ’์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ์‚ดํŽด์•ผ ํ–ˆ์ง€๋งŒ TypeScript๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ณ€์ˆ˜์˜ ์ด๋ฆ„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ทธ ๋ฐ์ดํ„ฐ์˜ ์ž๋ฃŒํ˜•๊นŒ์ง€ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
    • ๊ทธ๋ž˜์„œ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์‰ฝ๊ณ  ์ง๊ด€์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฒˆ์™ธ๋กœ, JavaScript๋Š” ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„ ํ•œ ์ค„ ํ•ด์„ํ•˜๋ฉด์„œ ๋ฐ”๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” '์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด'์ด๊ณ , TypeScript๋Š” ์†Œ์Šค ์ฝ”๋“œ ์ „์ฒด๋ฅผ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผ ํ•œ ๋’ค์— ์‹คํ–‰ํ•˜๋Š” '์ปดํŒŒ์ผ ์–ธ์–ด'์ด๋‹ค. 

์ปดํŒŒ์ผ ์–ธ์–ด๋Š” ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” ๋ณ€ํ™˜ ๊ณผ์ •์ด ๋”ฐ๋กœ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด๋ณด๋‹ค๋Š” ๋А๋ฆฌ์ง€๋งŒ, ๋Ÿฐํƒ€์ž„ ์ƒํ™ฉ์—์„œ๋Š” ๋ชจ๋“  ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ๋ณ€ํ™˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

 

React+TypeScript ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

npx create-react-app project-name --template typescript

 

  • npx๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋ชจ๋“ˆ์ธ npm(node package module)์˜ ์ผ์ข…์˜ ์‹คํ–‰ ๋„๊ตฌ์ด๋‹ค.
  • npm๊ณผ ๋‹ฌ๋ฆฌ ๋ชจ๋“ˆ์„ ๋กœ์ปฌ์— ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ๋งค๋ฒˆ ์ตœ์‹  ๋ฒ„์ „์˜ ํŒŒ์ผ๋งŒ์„ ๋ถˆ๋Ÿฌ์™€์„œ ์ž„์‹œ๋กœ ๋ถˆ๋Ÿฌ์™€์„œ ์‹คํ–‰ํ•œ ๋’ค์— ๋‹ค์‹œ ๊ทธ ํŒŒ์ผ์ด ์—†์–ด์ง€๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“ˆ์ด ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋‹ค.
  • CRA์™€ ๊ฐ™์€ ๋ชจ๋“ˆ์˜ ๋ณ€๊ฒฝ์ด ์žฆ์€ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ์˜ ๊ฒฝ์šฐ ๋ฒ„๊ทธ๋‚˜ ๊ธฐ๋Šฅ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์‹  ๋ฒ„์ „์„ ์œ ์ง€ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์€๋ฐ, ์ด๋ฅผ ์œ„ํ•ด npx๋ฅผ ์ด์šฉํ•ด์„œ ์‹คํ–‰ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

Styled-Components ์„ค์น˜

// styled-components ์„ค์น˜
npm i styled-components
// typescript ํƒ€์ž… ์ •์˜ ๋ฐ›๊ธฐ
npm i -D @types/styled-components

npm i ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ์ด ๊ธ€์„ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

 

Global Style ์ ์šฉ

import { createGlobalStyle } from 'styled-components';

export const GlobalStyle = createGlobalStyle`
    *{
        margin:0;
        padding:0;
        box-sizing:border-box;
    }
`
import { GlobalStyle } from './GlobalStyle';

const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);
root.render(
  <>
    <GlobalStyle/>
    <App/>
  </>

);

src ํด๋” ๋ฐ‘์— GlobalStyle.tsx ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์„œ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ ์šฉํ•  Global Style์„ ์„ ์–ธํ•ด์คฌ๋‹ค.

 

Firebase + React + TypeScript ์—ฐ๋™

https://velog.io/@song961003/react์™€-firebase-์—ฐ๋™ํ•˜๊ธฐ-with-Typescriptใ…‡

 

firebase์— react ํ˜ธ์ŠคํŒ…ํ•˜๊ธฐ with firestore

๋ฆฌ์•กํŠธ์™€ ํŒŒ์ด์–ด๋ฒ ์ด์Šค๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์ž!!

velog.io

์œ„ ๊ธ€์„ ๋”ฐ๋ผํ•˜๋ฉด์„œ ์—ฐ๋™์„ ์™„๋ฃŒํ–ˆ๋‹ค!

ํŒŒ์ด์–ด๋ฒ ์ด์Šค ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๊ณผ์ •์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ API_KEY, ๊ถŒํ•œ ์•„์ด๋”” ๋“ฑ์€ .env ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ์ €์žฅํ•ด๋‘๊ณ  gitignore ํŒŒ์ผ์— ํฌํ•จํ•ด๋’€๋‹ค.