⚛️ ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…: CRA vs Vite

โš›๏ธ ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…: CRA vs Vite

๐ŸŽฏ ํ”„๋ก ํŠธ์—”๋“œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์˜ ์ง„ํ™”: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํŒจ์น˜(Data Fetching)์˜ ํ˜์‹ ๊ณผ ์ตœ์‹  ํŠธ๋ Œ๋“œ

๐Ÿ’ก ์™œ ๋ฐ์ดํ„ฐ ํŒจ์น˜ ๊ธฐ์ˆ ์— ์ฃผ๋ชฉํ•ด์•ผ ํ• ๊นŒ์š”?

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์€ ๋Œ€๋ถ€๋ถ„ ๋ฐ์ดํ„ฐ๋ฅผ ์–ผ๋งˆ๋‚˜ ํšจ์œจ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ๊ด€๋ฆฌํ•˜๋Š”์ง€์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” `useState`์™€ `useEffect`๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™”์ง€๋งŒ, ์ด๋Š” ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ˆ˜๋งŽ์€ ๋ฒ„๊ทธ์™€ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด, ๋‹ค์Œ์˜ ๋ฌธ์ œ๋“ค์— ์ž์ฃผ ์ง๋ฉดํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค:
  • ๋ฐ์ดํ„ฐ ์บ์‹ฑ(Caching)์˜ ๋ถ€์žฌ๋กœ ์ธํ•œ ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ
  • ํ™”๋ฉด์ด ๋กœ๋”ฉ๋˜๋Š” ๋™์•ˆ์˜ ์ง€๋ฃจํ•œ ๋กœ๋”ฉ ์ƒํƒœ ๊ด€๋ฆฌ
  • ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๋ฐ˜์˜์„ ์œ„ํ•œ ์ˆ˜๋™์ ์ธ ์žฌ์š”์ฒญ(Refetching)
  • ๋ฐ์ดํ„ฐ์˜ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•˜๋Š” Stale Data ๋ฌธ์ œ

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


๐Ÿš€ React Query: ์ƒํƒœ ๊ด€๋ฆฌ, ๊ทธ ์ด์ƒ์˜ ๊ฐ€์น˜

React Query(์ตœ๊ทผ์—๋Š” TanStack Query๋กœ ๋ถˆ๋ฆผ)๋Š” ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Š” ์„œ๋ฒ„ ์ƒํƒœ(Server State)๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ด๋ฉฐ, ํ”„๋ก ํŠธ์—”๋“œ์˜ ๋น„๋™๊ธฐ ๋กœ์ง์„ ํš๊ธฐ์ ์œผ๋กœ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค.

⚡ ํ•ต์‹ฌ ์›๋ฆฌ: ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ

React Query๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๋Š” UI ์ƒํƒœ(์˜ˆ: ๋ชจ๋‹ฌ ์—ด๋ฆผ ์—ฌ๋ถ€)์™€ ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ์ธ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. 
์„œ๋ฒ„ ์ƒํƒœ๋Š” ํœ˜๋ฐœ์„ฑ์ด ๋†’๊ณ , ๋„คํŠธ์›Œํฌ๋กœ ์ธํ•ด ์–ธ์ œ๋“  ์ตœ์‹  ์ƒํƒœ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŠน๋ณ„ํ•œ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŒŸ React Query์˜ 4๊ฐ€์ง€ ์ดˆ๋Šฅ๋ ฅ

  1. ์ž๋™ ์บ์‹ฑ (Caching): ์ด๋ฏธ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต ์š”์ฒญ์„ ๋ง‰์Šต๋‹ˆ๋‹ค.
  2. ์ž๋™ ์žฌ์š”์ฒญ (Refetching): ์œˆ๋„์šฐ ํฌ์ปค์Šค, ๋„คํŠธ์›Œํฌ ์žฌ์—ฐ๊ฒฐ ๋“ฑ ํŠน์ • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  3. ๋กœ๋”ฉ/์—๋Ÿฌ ์ƒํƒœ ์ถ”์ : `isLoading`, `isError` ๊ฐ™์€ ์ƒํƒœ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ณต์žกํ•œ ๋กœ๋”ฉ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ (Optimistic Updates): ์‚ฌ์šฉ์ž์˜ ๋™์ž‘์„ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜์—ฌ UX๋ฅผ ๊ฐœ์„ ํ•˜๊ณ , ์‹ค์ œ ์„œ๋ฒ„ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

ํŠนํžˆ `useQuery` ํ›… ํ•˜๋‚˜๋กœ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ, ๋กœ๋”ฉ, ์—๋Ÿฌ, ์บ์‹ฑ๊นŒ์ง€ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์˜ ์ƒ์‚ฐ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค.


๐ŸŒŒ GraphQL: ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์ฝ• ์ง‘์–ด ๊ฐ€์ ธ์˜ค๊ธฐ

๊ธฐ์กด์˜ REST API๋Š” ์—”๋“œํฌ์ธํŠธ(URL)๋งˆ๋‹ค ์ •ํ•ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ ธ์™€์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. 
์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž์˜ '์ด๋ฆ„'๋งŒ ํ•„์š”ํ•œ๋ฐ '์ฃผ์†Œ', '์ „ํ™”๋ฒˆํ˜ธ', '์ƒ๋…„์›”์ผ'๊นŒ์ง€ ์ „๋ถ€ ๊ฐ€์ ธ์™€์•ผ ํ–ˆ์ฃ . ์ด๋ฅผ ์˜ค๋ฒ„ํŒจ์นญ(Over-fetching)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

GraphQL์€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” API๋ฅผ ์œ„ํ•œ ์ฟผ๋ฆฌ ์–ธ์–ด(Query Language)์ด์ž ๋Ÿฐํƒ€์ž„์ž…๋‹ˆ๋‹ค.

✨ GraphQL์˜ ํ•ต์‹ฌ ๊ฐ€์น˜

  • ์ •ํ™•ํ•œ ๋ฐ์ดํ„ฐ ์š”์ฒญ: ํด๋ผ์ด์–ธํŠธ(ํ”„๋ก ํŠธ์—”๋“œ)๊ฐ€ ํ•„์š”ํ•œ ํ•„๋“œ๋งŒ ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ•˜๊ณ  ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ: ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์—”๋“œํฌ์ธํŠธ๊ฐ€ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉ๋˜์–ด ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
  • Under-fetching ํ•ด์†Œ: ์—ฌ๋Ÿฌ API ์š”์ฒญ์„ ํ•œ ๋ฒˆ์˜ ์ฟผ๋ฆฌ๋กœ ํ†ตํ•ฉํ•˜์—ฌ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ GraphQL ์ฟผ๋ฆฌ์˜ ๊ตฌ์กฐ

GraphQL์˜ ์š”์ฒญ์€ REST์˜ GET ์š”์ฒญ๊ณผ ๋น„์Šทํ•œ Query์™€, 
๋ฐ์ดํ„ฐ ์ƒ์„ฑ/์ˆ˜์ •/์‚ญ์ œ๋ฅผ ์œ„ํ•œ Mutation์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.
query getUserProfile {
  user(id: "101") {
    id
    name
    email
    posts {
      title
    }
  }
}
์œ„ ์˜ˆ์‹œ์ฒ˜๋Ÿผ, ์˜ค์ง `user`์˜ `id`, name, `email`, ๊ทธ๋ฆฌ๊ณ  ์ž‘์„ฑํ•œ `posts`์˜ `title`๋งŒ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์ •ํ™•ํžˆ ์ด ๋ฐ์ดํ„ฐ๋งŒ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. 
GraphQL์€ ๋ฐ์ดํ„ฐ ์ „์†ก ํšจ์œจ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ฏธ๋ž˜ ์ง€ํ–ฅ์ ์ธ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก ์ตœ์‹  ํŠธ๋ Œ๋“œ: ๋‘ ๊ธฐ์ˆ ์˜ ์‹œ๋„ˆ์ง€ ํšจ๊ณผ

์ตœ๊ทผ ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ๊ณ„์—์„œ๋Š” React Query์™€ GraphQL์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ์ถ”์„ธ๊ฐ€ ๋‘๋“œ๋Ÿฌ์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 
์ด ๋‘˜์€ ์„œ๋กœ๋ฅผ ๋ณด์™„ํ•˜๋ฉฐ ์ตœ์ ์˜ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”ฅ ์‹œ๋„ˆ์ง€ ํšจ๊ณผ ์š”์•ฝ

๊ธฐ์ˆ  ์—ญํ•  ๋ฐ ๊ฐ•์  ์ œ๊ณตํ•˜๋Š” ๊ฐ€์น˜
GraphQL API ํ†ต์‹  ์ตœ์ ํ™” (๋ฐ์ดํ„ฐ๋Ÿ‰ ๋ฐ ์š”์ฒญ ํšŸ์ˆ˜ ๊ด€๋ฆฌ) ๋„คํŠธ์›Œํฌ ํšจ์œจ์„ฑ ์ฆ๋Œ€, ์˜ค๋ฒ„ํŒจ์นญ ๋ฐฉ์ง€
React Query ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ ๊ด€๋ฆฌ (์บ์‹ฑ, ์žฌ์š”์ฒญ ๋กœ์ง) ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ ํ–ฅ์ƒ, UX ์•ˆ์ •์„ฑ ํ™•๋ณด

GraphQL์€ '๋ฌด์—‡์„ ๊ฐ€์ ธ์˜ฌ์ง€'๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ , React Query๋Š” '์–ธ์ œ, ์–ด๋–ป๊ฒŒ ์บ์‹ฑํ•˜๊ณ  ์žฌ์š”์ฒญํ• ์ง€'๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค.

์‹ค์šฉ์ ์ธ ์ ์šฉ ํŒ

๋‹น์‹ ์ด ์ด ๊ธฐ์ˆ ๋“ค์„ ์ฒ˜์Œ ์ ‘ํ•œ๋‹ค๋ฉด, ๋‹ค์Œ์˜ ๋‹จ๊ณ„๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

  1. React Query๋ถ€ํ„ฐ ์‹œ์ž‘: ๊ธฐ์กด REST API ํ™˜๊ฒฝ์—์„œ๋„ useQuery ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์บ์‹ฑ๊ณผ ๋กœ๋”ฉ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๊ฒฝํ—˜์„ ํ•ด๋ณด์„ธ์š”.
  2. GraphQL ๊ฐœ๋… ํ•™์Šต: ์ฟผ๋ฆฌ, ๋ฎคํ…Œ์ด์…˜, ์Šคํ‚ค๋งˆ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์ตํ˜€ ๋ฐ์ดํ„ฐ ์š”์ฒญ์˜ ์œ ์—ฐ์„ฑ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
  3. ํ†ตํ•ฉ ์ ์šฉ: Apollo Client๋‚˜ Relay ๊ฐ™์€ GraphQL ์ „์šฉ ํด๋ผ์ด์–ธํŠธ ๋Œ€์‹ , React Query์™€ GraphQL์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹ฑ ๋กœ์ง์„ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ์‹์„ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”. GraphQL ํ†ต์‹ ์„ React Query์˜ `queryFn`์— ์ ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ตœ์‹  ๋„๊ตฌ๋“ค์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ(Boilerplate) ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ๊ฐ„์„ ์ค„์ด๊ณ , ์ง„์ •ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ํ•„์ˆ˜์ ์ธ ์ง€์‹์ž…๋‹ˆ๋‹ค.


๐ŸŽ‰ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์˜ ๋ฏธ๋ž˜, ์ง€๊ธˆ ์‹œ์ž‘ํ•˜์„ธ์š”!

ํ”„๋ก ํŠธ์—”๋“œ ๋ฐ์ดํ„ฐ ํŒจ์น˜์˜ ์ง„ํ™”๋Š” ๋‹จ์ˆœํ•œ ์œ ํ–‰์ด ์•„๋‹Œ, 
๋ณต์žกํ•ด์ง€๋Š” ์›น ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ํ•„์—ฐ์ ์ธ ํ•ด๊ฒฐ์ฑ…์ž…๋‹ˆ๋‹ค.

๐Ÿš€ ํ•ต์‹ฌ ์š”์•ฝ

  • React Query: ๋ณต์žกํ•œ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง์„ ์ž๋™ํ™”ํ•˜์—ฌ ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • GraphQL: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์š”์ฒญํ•˜๊ฒŒ ํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ํšจ์œจ์„ฑ์„ ํ˜์‹ ์ ์œผ๋กœ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์Œ ๋‹จ๊ณ„: ๋‹น์‹ ์˜ ํ”„๋กœ์ ํŠธ์— React Query๋ฅผ ์ ์šฉํ•˜์—ฌ ์บ์‹ฑ๊ณผ ๋กœ๋”ฉ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•ด๋ณด๊ณ , ์ ์ง„์ ์œผ๋กœ GraphQL ๋„์ž…์„ ๊ฒ€ํ† ํ•ด๋ณด์„ธ์š”. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ฐจ์„ธ๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ๋‚˜์•„๊ฐ€๋Š” ๊ธธ์ž…๋‹ˆ๋‹ค.

์ด ๊ธฐ์ˆ ๋“ค์„ ๋งˆ์Šคํ„ฐํ•œ๋‹ค๋ฉด, ๋‹น์‹ ์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋”์šฑ ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ธ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ“๊ธ€ ์“ฐ๊ธฐ