heroku
λ₯Ό μ¬μ©νμ¬socket.io
μλ² μμ±
Socket.io
: μλ²μμ λ₯λμ μΌλ‘ μ λ¬νλ κ°μ μμ νκΈ° μν λͺ¨λJest
,React-testing-library
:Unit test
styled-components
:CSS-in-JS
components
: μ¬νμ©κ°λ₯ν μ»΄ν¬λνΈ κ΄λ¦¬. λλΆλΆ λ¨μUI
λ₯Ό 그리기 μν μ»΄ν¬λνΈhooks
: κΈ°λ₯μ λ°λΌμ μΆμνλ λ‘μ§λ€μ κ΄λ¦¬json
: μ μ μΈjson
λ°μ΄ν° κ΄λ¦¬pages
: κ°μ’ λ‘μ§μ΄ μ°κ²°λλ μ΅μμ μ»΄ν¬λνΈRoute
κ°λ socket
:socket.io
κ΅¬μ± μμ. μ΄νμ μΆκ°λλsocket
κ΄λ ¨reducer
λ ν¬ν¨styles
:global Style
types
:types
Text
,Input
,Button
κ³Ό κ°μ κ°μ₯ μμ λ¨μμ μ»΄ν¬λνΈλ€μ μ΅λνμ μ¬μ¬μ©μ±μ μν΄ κΈ°λ³ΈElement
λ€μ νμ₯νμ¬ μ¬μ©
import { ButtonHTMLAttributes } from "react";
import * as Styled from "./index.style";
interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
border?: string;
}
function Button({ border = "borderless", children, ...props }: ButtonProps) {
return (
<Styled.Button border={border} {...props}>
{children}
</Styled.Button>
);
}
export default Button;
margin
κ³Ό κ°μ 컨ν μΈ μΈλΆμ μν₯μ μ£Όλ μ€νμΌλ€μ μμμ»΄ν¬λνΈμμ μ§μ - μ΅λν μΆμν λ¨κ³ ν΅μΌν
UI
λ₯Ό ꡬμ±νλλ° μ¬μ©λλ μνκ°μ κ³μ°νλ λ‘μ§μ μ΅λνhooks
λ‘ μΆμν νμ¬ μ μΈνμΌλ‘ μ¬μ©
μνκ° κ΄λ¦¬ hook
μ useState
κ° μλ useReducer
μ¬μ©
-
μνκ°μ΄ μ λ°μ΄νΈ λ¨μ μμ΄, μ΄μ μ κ°κ³Ό λ€λ₯Έ μνκ°μ λν μμ‘΄μ κ°κ²λλ μν©μ΄ λ§μμ μ¬μ©
μμ‘΄μ± λ°°μ΄μ μ¬μ©νλ
useEffect
,useCallback
κ³Ό κ°μ λΌμ΄ν μ¬μ΄ν΄μμλ μ±λ₯μ΄ κ°μ λ¨
Redux
- μ»΄ν¬λνΈ κ΅¬μ‘°λ©΄μμ μ‘°ν©μ μ¬μ©νμ¬
props depth
μ λν λ¬Έμ λ μμκΈ° λλ¬Έμ, μ μ μνκ΄λ¦¬μ νμλ₯Ό λͺ»λλ. useReducer
λ‘Redux
μreducer
κΈ°λ₯μ μΆ©λΆν λ체 κ°λ₯
Redux-Saga
Redux
μ μ¬μ©μ΄ κ°μ λ¨take
μ κ°μ κΈ°λ₯μΌλ‘connect
,disconnect
λ‘μ§μflow
νμμΌλ‘ μμ±ν μ μμκ² κ°μ.channel
κΈ°λ₯μ΄socket
κ³Ό μλΉν κΆν©μ΄ μλ§λλ€κ³ ν¨.action
μ΄ μ§§μ ν λ΄μ μ¬λ¬λ² νΈμΆλμμ λ,que
νμμ μλ£κ΅¬μ‘°λ₯Ό κ°μ§ μνλ‘ μμ°¨μ μΌλ‘ μ§νλ μ μλλ‘ λ²νΌλ§socket.on
κ³Ό κ°μ μΈλΆ μ΄λ²€νΈλ₯Όsaga
μtake
μ μ°κ²°ν μ μλλ‘ λμμ£Όλ κΈ°λ₯buffer
μ λμ λ κ°λ€μ μ μ₯νκ³ ,flush
λ‘ κ·Έ κ°λ€μ κ°μ Έμ μ¬μ©