'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

REST API

ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ์‚ฌ์ด

HTTP ์ƒํƒœ ์ฝ”๋“œ๋Š” ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ฐฑ์—”๋“œ๋กœ ๋ณด๋ƒˆ๋˜ ์š”์ฒญ์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์˜๋ฏธํ•˜๋Š” ์ผ์ข…์˜ ์•ฝ์†์ด๋ฉฐ, API๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ•ต์‹ฌ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ์ฝ”๋“œ์™€ ๊ด€๋ จํ•˜์—ฌ, ๋ฐฑ์—”๋“œ๋Š” ์ž˜ ๋ชจ๋ฅด๋Š” ํ”„๋ก ํŠธ์—”๋“œ์˜ ์Šฌํ”ˆ ์‚ฌ์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.์•„๋ž˜๋Š” ์š”์ฒญ์ด ์‹คํŒจํ–ˆ์Œ์—๋„, ๋ฐฑ์—”๋“œ์—์„œ ์ƒํƒœ ์ฝ”๋“œ

JWT

ํ† ํฐ ๊ด€๋ฆฌ ๋ฐฉ์‹ ํ†บ์•„๋ณด๊ธฐ

0. ๋“ค์–ด๊ฐ€๋ฉฐ ๐ŸŽฏ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๋ ค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์„ ์‚ฌ์šฉ์ž ์ธ์ฆ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฃผ์–ด์ง„ ๊ถŒํ•œ์„ ํ™•์ธํ•˜๋Š” ์ž‘์—…์€ ์ธ๊ฐ€๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ธ๊ฐ€๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ธ์ฆ์—๋Š” ๋งŽ์€ ๋ฐฉ์‹์ด ์žˆ์ง€๋งŒ, ์˜ค๋Š˜์€ ์„ธ์…˜ ์ธ์ฆ ๋ฐฉ

A2A

A2A / MCP ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜

0. ๋“ค์–ด๊ฐ€๋ฉฐ โœ๏ธ Google for Developers์—, ๋ ˆ์Šคํ† ๋ž‘ ๊ณต๊ธ‰๋ง ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ์—ฎ์€ 6๋Œ€ ํ”„๋กœํ† ์ฝœ(MCP, A2A, UCP, AP2, A2UI, AG-UI)์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ๊ฐ€ ๊ฒŒ์‹œ๋œ ์ดํ›„, MCP์™€ A2A๋ถ€ํ„ฐ ๊ตฌํ˜„ํ•ด ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ