Skip to content

Latest commit

Β 

History

History
256 lines (186 loc) Β· 7.58 KB

File metadata and controls

256 lines (186 loc) Β· 7.58 KB

μš°μ•„ν•œ ν…Œν¬λŸ¬λ‹ React&Typescript 1회차

2020λ…„ 09μ›” 01일 ν™”μš”μΌ

Table of Contents
  • κ°•μ˜ λͺ©ν‘œ πŸ”—
  • κ°•μ˜μ—μ„œ 주둜 λ‹€λ£° ν‚€μ›Œλ“œ πŸ”—
  • Typescriptμ—μ„œ νƒ€μž…μ„ μ§€μ •ν•˜λŠ” 방법 πŸ”—
  • νƒ€μž… 별칭 πŸ”—
  • 객체 νƒ€μž… πŸ”—
  • Typescript&React ν”„λ‘œμ νŠΈ μƒμ„±ν•˜κΈ° πŸ”—
  • κ°„λ‹¨ν•œ React μ»΄ν¬λ„ŒνŠΈ λ§Œλ“€κΈ° πŸ”—
  • Babel을 ν†΅ν•œ React μ»΄ν¬λ„ŒνŠΈ λ³€ν™˜ πŸ”—
  • μž‘μ„±ν•œ App μ»΄ν¬λ„ŒνŠΈμ˜ ν™•μž₯ πŸ”—
  • 전역적인 μƒνƒœκ΄€λ¦¬ πŸ”—

κ°•μ˜ λͺ©ν‘œ

  1. λ‚˜λŠ” 잘 ν•˜κ³  μžˆλ‚˜?
  2. λ„€νŠΈμ›Œν‚Ή
  3. μ½”λ“œ ν’ˆμ§ˆ, μ•„ν‚€ν…μ²˜, 적정 기술

λ§Žμ€ 도ꡬ듀이 생겨 생산성이 ν–₯상 λ˜μ—ˆλ‹€.
졜근의 ν”„λ‘œκ·Έλž˜λ° ν•™μŠ΅ 방법은 도ꡬλ₯Ό ν•™μŠ΅ν•˜λŠ” μ‹œκ°„μ΄ λ§Žλ‹€.
React, Typescript λ“±μ˜ 도ꡬλ₯Ό μ‚¬μš©ν•˜λŠ” 방법을 ν•™μŠ΅ν•œλ‹€.

κ°•μ˜μ—μ„œ 주둜 λ‹€λ£° ν‚€μ›Œλ“œ

  • μƒνƒœ (State) : μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 즉 μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ” 것이 μ£Ό λͺ©ν‘œ
  • ν™˜κ²½ (Env) : λ§Žμ€ ν™˜κ²½μ— λŒ€ν•œ λŒ€μ‘ 및 개발 ν™˜κ²½μ— λŒ€ν•œ 관심
  • μ œν’ˆ (Product) : κ°œλ°œμ„ ν•˜λŠ” κ²ƒλΏλ§Œ μ•„λ‹ˆλΌ μ œν’ˆμ μΈ 츑면으둜 생각
  • λͺ©ν‘œ (Mission) : λ§Žμ€ 도ꡬλ₯Ό μ‘°ν•©ν•΄ λ§Œλ“œλŠ” μ œν’ˆμ΄ ν•΄κ²°ν•  λ―Έμ…˜
  • μ½”λ“œ (Quality) : μ½”λ“œμ˜ 퀄리티λ₯Ό 높일 수 μžˆλŠ” 방법
  • μƒλŒ€μ  (E=mc^2) : μœ„μ— μžˆλŠ” λͺ¨λ“  것은 μ‚¬λžŒλ§ˆλ‹€ μƒλŒ€μ 

Typescriptμ—μ„œ νƒ€μž…μ„ μ§€μ •ν•˜λŠ” 방법

  1. νƒ€μž… 좔둠을 ν†΅ν•œ μ•”μ‹œμ  νƒ€μž„ 지정
let foo = 10;

μœ„μ™€ 같이 Javascript와 λ™μΌν•˜κ²Œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.
νƒ€μž…μΆ”λ‘ μ„ 톡해 Typescript λ˜ν•œ 별닀λ₯Έ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠλŠ”λ‹€.

let foo = 10;
foo = false;

ν•˜μ§€λ§Œ μœ„μ™€ 같이 λ‹€λ₯Έ νƒ€μž…μ˜ 값을 λŒ€μž…ν•  경우 λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.
fooλ³€μˆ˜μ— 10μ΄λΌλŠ” numberνƒ€μž… 값이 μ§€μ •λ˜λ©΄μ„œ λ‹€λ₯Έ νƒ€μž…μ˜ 값은 λŒ€μž…ν•  수 μ—†λ‹€.

  1. λͺ…μ‹œμ μœΌλ‘œ νƒ€μž…μ„ μ§€μ •ν•˜λŠ” 법

λ³€μˆ˜λͺ…:νƒ€μž…κ³Ό 같이 μ‚¬μš©ν•΄ νƒ€μž…μ„ λͺ…μ‹œν•  수 μžˆλ‹€.

let foo: number = 10;
foo = false;

λ‹€λ₯Έ νƒ€μž…μ˜ 값을 λŒ€μž…ν•  μ‹œ νƒ€μž… 좔둠을 ν†΅ν•œ νƒ€μž… 지정과 λ™μΌν•˜κ²Œ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

νƒ€μž… 별칭

let age: number = 10;
let weight: number = 72;

age와 weight λ³€μˆ˜λŠ” numberνƒ€μž…μœΌλ‘œ 별 λ¬Έμ œμ—†μ΄ μ‚¬μš©ν•  수 μžˆλ‹€.
ν•˜μ§€λ§Œ μ½”λ“œμ˜ 가독성을 μœ„ν•΄ μ•„λž˜μ™€ 같이 νƒ€μž… 별칭을 μ΄μš©ν•΄ νƒ€μž…μ„ 지정할 수 μžˆλ‹€.

type Age = number;

let a: Age = 10;

λ³€μˆ˜ aλŠ” age와 λ™μΌν•˜κ²Œ numberνƒ€μž…μ΄μ§€λ§Œ AgeλΌλŠ” νƒ€μž… 별칭을 μ‚¬μš©ν•΄ 가독성을 μ¦κ°€μ‹œν‚¨λ‹€.

객체 νƒ€μž…

객체의 νƒ€μž…μ€ μ•„λž˜μ™€ 같이 type ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ μ •μ˜ν•  수 μžˆλ‹€.

type Foo = {
    age: number;
    name: string;
}

const foo: Foo = {
    age: 10,
    name: "Kim,
}

Foo 객체 νƒ€μž…μ€ numberνƒ€μž…μ˜ age와 stringνƒ€μž…μ˜ name 속성을 가지고 μžˆμ–΄μ•Ό ν•œλ‹€.
객체 νƒ€μž… λ‚΄λΆ€ μ†μ„±μ˜ νƒ€μž…μ„ 지정할 λ•Œμ—λ„ νƒ€μž… 별칭을 λ™μΌν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

type Age = number;

type Foo = {
    age: Age;
    name: string;
};

객체 νƒ€μž…μ„ μ •μ˜ν•˜λŠ” λ‹€λ₯Έ λ°©λ²•μœΌλ‘œλŠ” interface ν‚€μ›Œλ“œκ°€ μ‘΄μž¬ν•œλ‹€.

type Age = number;

interface Bar {
    age: Age;
    name: string;
}

const bar: Bar = {
    age: 10,
    name: "Kim",
};

type ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ 객체 νƒ€μž…κ³Ό λ™μΌν•˜κ²Œ interfaceλ₯Ό μ΄μš©ν•΄ 객체 νƒ€μž…μ„ μ„ μ–Έν•  수 μžˆλ‹€.
type을 μ΄μš©ν•œ νƒ€μž… μ„ μ–Έ 방식과 interfaceλ₯Ό μ΄μš©ν•œ νƒ€μž… μ„ μ–Έ 방식은 차이가 μ‘΄μž¬ν•œλ‹€.

Typescript&React ν”„λ‘œμ νŠΈ μƒμ„±ν•˜κΈ°

npm νŒ¨ν‚€μ§€μ˜ create-react-app을 μ΄μš©ν•΄ κ°„λ‹¨ν•˜κ²Œ ν”„λ‘œμ νŠΈ 생성을 ν•  수 μžˆλ‹€.

  • yarn
yarn create react-app <app_name> --template typescript
  • npm
npm init react-app <app_name> --template typescript
  • npx
npx create-react-app <app_name> --template typescript

κ°„λ‹¨ν•œ React μ»΄ν¬λ„ŒνŠΈ λ§Œλ“€κΈ°

μ•„λž˜μ™€ 같이 function ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄ ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈλ₯Ό 생성할 수 μžˆλ‹€.

  • src/index.tsx
import React from "react";
import ReactDom from "react-dom";

function App() {
    return (
        <h1>Tech Hello!</h1>
    );
}

ReactDom.render(
    <React.StricMode>
        <App/>
    </React.StrictMode>,
    document.getElementById("root")
)

ReactDom의 renderν•¨μˆ˜λŠ” 가상돔에 μ»΄ν¬λ„ŒνŠΈλ₯Ό κ·Έλ¦¬λŠ” ν•¨μˆ˜μ΄λ©° 두 개의 인자λ₯Ό λ°›λŠ”λ‹€.
첫 λ²ˆμ§ΈμΈμžλŠ” λ Œλ”λ§λ  μ»΄ν¬λ„ŒνŠΈλ©° 두 번째 μΈμžλŠ” λ Œλ”λ§λœ μ»΄ν¬λ„ŒνŠΈλ₯Ό 넣을 HTML μš”μ†Œλ‹€.

Babel을 ν†΅ν•œ React μ»΄ν¬λ„ŒνŠΈ λ³€ν™˜

μž‘μ„±ν•œ Appμ»΄ν¬λ„ŒνŠΈλŠ” babelμ΄λΌλŠ” 트랜슀파일러λ₯Ό 톡해 μ•„λž˜μ™€ 같이 λ³€ν™˜λœλ‹€.

  • λ³€ν™˜ μ „ App μ»΄ν¬λ„ŒνŠΈ
function App() {
    return <h1 id="header">Tech Hello!</h1>;
}
  • λ³€ν™˜ ν›„ App μ»΄ν¬λ„ŒνŠΈ
function App() {
    return /*@__PURE__*/ React.createElement(
        "h1",
        {
            id: "header",
        },
        "Hello Tech"
    );
}

μž‘μ„±ν•œ jsxμ½”λ“œκ°€ μœ„μ™€ 같이 React의 createElementν•¨μˆ˜λ‘œ λ³€ν™˜λœλ‹€.

μž‘μ„±ν•œ App μ»΄ν¬λ„ŒνŠΈμ˜ ν™•μž₯

μ•„λž˜μ™€ 같이 App μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ™ΈλΆ€μ—μ„œ 가지고 μžˆλŠ” 값을 ν•„μš”λ‘œν•˜λŠ” κ²½μš°κ°€ 생길 수 μžˆλ‹€.

ReactDom.render(
    <React.StricMode>
        <App title="Tech Hello?" color="red"/>
    </React.StrictMode>,
    document.getElementById("root")
)

<App title="Tech Hello?" color="red"/>와 같이 λ„˜μ–΄κ°„ 값은 객체 νƒ€μž…μœΌλ‘œ μ „λ‹¬λœλ‹€.

function App(props) {
    return <h1 id="header">{props.title}</h1>;
}

jsxλ‚΄λΆ€μ—μ„œ Javascript μ½”λ“œλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” {}내뢀에 μž‘μ„±ν•˜λ©΄ λœλ‹€.

interface AppProps {
    title: string;
    color: string;
}

function App(props: AppProps) {
    return <h1 id="header">{props.title}</h1>;
}

interfaceλ₯Ό μ΄μš©ν•΄ App μ»΄ν¬λ„ŒνŠΈκ°€ 받을 μ†μ„±μ˜ 객체 νƒ€μž…μΈ AppPropsλ₯Ό μ •μ˜ν•  수 μžˆλ‹€.
App μ»΄ν¬λ„ŒνŠΈμ—μ„œ 받을 속성 객체의 νƒ€μž…μ„ ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈμ˜ λ§€κ°œλ³€μˆ˜μ— λͺ…μ‹œν•  수 μžˆλ‹€.

전역적인 μƒνƒœκ΄€λ¦¬

μ „μ—­μ μœΌλ‘œ μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ” λŒ€ν‘œμ μΈ μ•„ν‚€ν…μ³λ‘œλŠ” Flux 아킀텍쳐가 μ‘΄μž¬ν•œλ‹€.
μ „μ—­μ μœΌλ‘œ μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ” λͺ©μ μœΌλ‘œ reduxλΌλŠ” νŒ¨ν‚€μ§€κ°€ λŒ€ν‘œμ μœΌλ‘œ μ‚¬μš©λœλ‹€.
redux와 λΉ„μŠ·ν•˜κ²Œ μ „μ—­μ μœΌλ‘œ μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ” νŒ¨ν‚€μ§€λŠ” MobXκ°€ μ‘΄μž¬ν•œλ‹€.
redux와 λ‹€λ₯΄κ²Œ MobXλŠ” κΈ°λŠ₯이 많으며 λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.
κΈ°λŠ₯이 λ§Žλ‹€λŠ” λœ»μ€ μœ μ—°ν•˜κ²Œ κΈ°λŠ₯듀을 μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 의미λ₯Ό 가지고 μžˆλ‹€.
λ°˜λ©΄μ— μœ μ—°ν•˜κ²Œ κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆλŠ” 만큼 κ°œλ°œμžκ°€ μ‹€μˆ˜λ₯Ό ν•  수 μžˆλŠ” 여지가 λ§Žλ‹€.
λ”°λΌμ„œ μ‹€μˆ˜λ₯Ό 쀄이기 μœ„ν•΄μ„œ κΈ°μˆ μ„ μ‚¬μš©ν•˜κΈ° μ „ 아킀텍쳐 섀계 λ˜ν•œ ꡉμž₯히 μ€‘μš”ν•˜λ‹€.