'Coin Site Project'

[TIL/Coin Site Project] 2023/11/30

Dark Mode ์Šต์ž‘ ๐ŸŒ–์ƒˆ๋กœ๊ณ ์นจ console ์ˆœ์„œToggleColorMode component renderingtheme executed 1theme executed 2MyApp component rendering๋ชจ๋“œ ์•„์ด์ฝ˜ ํด๋ฆญ console ์ˆœ์„œtoggleCo

2023๋…„ 11์›” 30์ผ2min read

Dark Mode ์Šต์ž‘ ๐ŸŒ–

code
import React, { createContext, useContext, useMemo, useState } from "react";
import IconButton from "@mui/material/IconButton";
import Box from "@mui/material/Box";
import { useTheme, ThemeProvider, createTheme } from "@mui/material/styles";
import Brightness4Icon from "@mui/icons-material/Brightness4";
import Brightness7Icon from "@mui/icons-material/Brightness7";

const ColorModeContext = createContext({ toggleColorMode: () => {} });

function MyApp() {
  console.log("MyApp component rendering");
  const theme = useTheme();
  const colorMode = useContext(ColorModeContext);

  return (
    <Box
      sx={{
        display: "flex",
        width: "100%",
        height: "100vh",
        alignItems: "center",
        justifyContent: "center",
        bgcolor: "background.default",
        color: "text.primary",
        borderRadius: 1,
        p: 3,
      }}
    >
      {theme.palette.mode} mode
      <IconButton
        sx={{ ml: 1 }}
        onClick={colorMode.toggleColorMode}
        color="inherit"
      >
        {theme.palette.mode === "dark" ? (
          <Brightness7Icon />
        ) : (
          <Brightness4Icon />
        )}
      </IconButton>
    </Box>
  );
}

const ToggleColorMode = () => {
  console.log("ToggleColorMode component rendering");
  const [mode, setMode] = useState("light");

  const colorMode = useMemo(
    () => ({
      toggleColorMode: () => {
        console.log("toggleColorMode executed");
        setMode((prevMode) => (prevMode === "light" ? "dark" : "light"));
      },
    }),
    []
  );
  console.log("theme executed 1");
  const theme = useMemo(
    () =>
      createTheme({
        palette: {
          mode,
        },
      }),
    [mode]
  );
  console.log("theme executed 2");
  return (
    <ColorModeContext.Provider value={colorMode}>
      <ThemeProvider theme={theme}>
        <MyApp />
      </ThemeProvider>
    </ColorModeContext.Provider>
  );
};

export default ToggleColorMode;

// what is createContext?
// ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์•ˆ์—์„œ ์ „์—ญ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณ ์•ˆ๋œ ๋ฐฉ๋ฒ•?
// ColorModeContext๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ๋Š” toggleColorMode๋ฅผ ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์˜ ์ฝ”๋“œ?

// what is useTheme?
// ์•„๋ž˜ ์ฝ”๋“œ์—์„œ theme์€, mui์—์„œ ๋‹ค์–‘ํ•œ theme์„ ๊ทœ์ •ํ•ด๋†“์€ ํ•˜๋‚˜์˜ ํ›…์ด๋‹ค.

// what is useContext?
// useContext๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ปจํ…์ŠคํŠธ์˜ ํ˜„์žฌ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์˜ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

// what is useMemo?
// ์ปดํฌ๋„ŒํŠธ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ์‚ฌ์šฉ๋˜๋Š” react hook
// ๋ Œ๋”๋ง => ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜ ํ˜ธ์ถœ => memoize๋œ ํ•จ์ˆ˜ ์žฌ์‚ฌ์šฉ(๋™์ผํ•œ ๊ณ„์‚ฐ ๋ฐ˜๋ณตํ•  ๋•Œ ์‚ฌ์šฉ)

// what is ThemeProvider?
// ์ „์—ญ์œผ๋กœ ํ…Œ๋งˆ๋ฅผ ์ ์šฉ๋  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ

// what is createTheme?
// ํ…Œ๋งˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜

์ƒˆ๋กœ๊ณ ์นจ console ์ˆœ์„œ

1. ToggleColorMode component rendering 2. theme executed 1 3. theme executed 2 4. MyApp component rendering

๋ชจ๋“œ ์•„์ด์ฝ˜ ํด๋ฆญ console ์ˆœ์„œ

1. toggleColorMode executed 2. ToggleColorMode component rendering 3. theme executed 1 4. theme executed 2 5. MyApp component rendering

+) toggleColorMode executed ์ดํ›„ setState()์— ์˜ํ•ด re-rendering์ด ๋œ๋‹ค๋Š” ์ ์ด '์•„์ด์ฝ˜ ํด๋ฆญ console'์—์„œ ์ฃผ๋ชฉํ•  ์‚ฌํ•ญ์ด๋‹ค.

+) createContext, useContext, useMemo => ๋ฆฌ์•กํŠธ ๊ณต์‹๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ์ •๋ฆฌํ•ด์•ผ ๋  ํ•„์š”์„ฑ์„ ๋А๊ผˆ๋‹ค.

+) ๋ณธ ํ”„๋กœ์ ํŠธ์—๋Š” ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•  ํ•„์š”์„ฑ์„ ๋А๊ผˆ๋‹ค.

๊ตฌํ˜„ ๐ŸŒ–

More to read

Amazon VPC

Amazon VPC Architecture ์ดํ•ดํ•˜๊ธฐ

์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐํšํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์—์„œ ๋ฌด์—‡์„ ๊ฐ€์žฅ ๋จผ์ € ๊ณ ๋ฏผํ•ด์•ผ ํ•˜๋Š”์ง€ ๋‹ค์‹œ ๋Œ์•„๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.ํ•œ๋•Œ๋Š” ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ ๋ชจ๋“  ์„ค๊ณ„์˜ ์ถœ๋ฐœ์ ์ด๋ผ๊ณ  ๋ฏฟ์—ˆ์Šต๋‹ˆ๋‹ค. ์œ ์ €๊ฐ€ ๋ฌด์—‡์„ ๋ณด๊ณ , ์–ด๋–ค ํ๋ฆ„์—์„œ ๋จธ๋ฌด๋ฅด๊ณ  ์ดํƒˆํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ดํ•ด ์—†์ด ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ ๋‹ค๋Š” ๊ฑด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ

'์›์‚ฌ์ดํŠธ'

ํ”„๋ก ํŠธ์—”๋“œ ๊ด€์ ์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ดํ•ดํ•˜๊ธฐ

์˜ค๋žœ๋งŒ์— ๋ฐฉ๋ฒ•๋ก ์— ๊ด€ํ•œ ๊ธ€์„ ์“ฐ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ ์ƒํ™ฉ์€ ์ด๋ ‡์Šต๋‹ˆ๋‹ค. SSAFY์—์„œ๋Š” ํ•˜๋ฃจ์— ์—„์ฒญ๋‚œ ์–‘์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋“ค์„ ๊ณผ์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ, '๊ตฌํ˜„๋ ฅ'์ด ๋งค์šฐ ๋–จ์–ด์ง„๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์™„์ „ํžˆ ์–ด๋ ค์šด ๋ฌธ์ œ๋ผ๋ฉด '์•„์‰ฌ์›€'์ด๋ผ๋Š” ๊ฐ์ •์กฐ์ฐจ ๋А๋ผ์ง€

Subnet

VPC ์„ค๊ณ„์˜ ์‹œ์ž‘: IP์™€ Subnet

๋ฐ˜๋ณต๋˜๋Š” ๋ฃจํ‹ด ์†์—์„œ ์–ป์€ ์•ˆ์ •๊ฐ์„ ๋ฐœํŒ ์‚ผ์•„, ์ด์ œ๋Š” ๊ธฐ์ˆ ์  ์ŠคํŽ™ํŠธ๋Ÿผ์„ ๋„“ํžˆ๊ธฐ ์œ„ํ•œ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์— ์ฐฉ์ˆ˜ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์˜ ๋ชฉํ‘œ๋Š” ๋‹จ์ˆœํ•œ ํฌํŠธํด๋ฆฌ์˜ค ๊ตฌ์ถ•์„ ๋„˜์–ด, ์‹ค์ œ ์„œ๋น„์Šค ์ˆ˜์ค€์˜ ๋ธ”๋กœ๊ทธ ์‹œ์Šคํ…œ ๊ตฌํ˜„๊ณผ ๋‹ค๊ตญ์–ด ์ฒ˜๋ฆฌ ์ ์šฉ ๋“ฑ ์‹ค๋ฌด์— ๊ฐ€๊นŒ์šด ์—ญ๋Ÿ‰์„ ํ•œ ๋‹จ๊ณ„