[Front-End] CSR vs SSR ๐ŸŽˆ

7384 ๋‹จ์–ด next.jsfront endReactReact

์˜ค๋Š˜์€ CSR (Client Side Rendering)๊ณผ

SSR (Server Side Rendering)์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค.

๐ŸŽˆ ์›น์—์„œ Client์™€ Server ๊ฐ„ ๋™์ž‘

  1. Client์—์„œ URL๋กœ Server์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
  2. Server์—์„œ๋Š” ๊ทธ ์š”์ฒญ์„ ํ† ๋Œ€๋กœ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด html ๋ฌธ์„œ๋ฅผ ๋‹ค์‹œ Client์—๊ฒŒ ์‘๋‹ตํ•ด์ค€๋‹ค.
  3. Client์—์„œ๋Š” ๊ทธ๊ฑธ ๊ทธ๋ฆฐ๋‹ค.
    ์ด๋Ÿฐ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์›น์€ ๋™์ž‘ํ•œ๋‹ค.

๐ŸŽˆ ์›น์˜ ๋ณ€ํ™” (์ง„ํ™”)

์ ์  Server์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผํ•  ์ •๋ณด๋„ ๋งŽ์•„์ง€๊ณ , ํšŸ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋‹ค ๋ณด๋‹ˆ
๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๊ณ  ๊ณ„์†ํ•ด์„œ ์‘๋‹ตํ•œ ๊ฒƒ์„ ๊ทธ๋ฆฌ๋‹ค๋ณด๋‹ˆ ํŽ˜์ด์ง€ ๊นœ๋นก์ž„๋„ ๋Š˜์–ด๋‚œ๋‹ค.
์ด๋•Œ ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ ๊ฒƒ์ด ๋ฐ”๋กœ Ajax์ด๋‹ค.
Ajax๋Š” ํŽ˜์ด์ง€์˜ ์ผ๋ถ€๋งŒ ์š”์ฒญํ•˜๊ณ  ์‘๋‹ตํ•˜๋ฉฐ ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹Œ
์‘๋‹ต๋œ ์ผ๋ถ€๋งŒ ๋‹ค์‹œ ๊ทธ๋ฆด ์ˆ˜ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์›น์˜ ์„ฑ๋Šฅ์„ ํ•œ์ธต ์—…๊ทธ๋ ˆ์ด๋“œ ์‹œ์ผœ์ฃผ์—ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋” ๋‚˜์•„๊ฐ€ SPA๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋œ๋‹ค.
SPA๋Š” url์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ html์„ ๋‹ค์‹œ ๋‚ด๋ ค์ฃผ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ์ž˜ ์•Œ๊ณ  ์žˆ๋Š” React๋Š” CSR ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

๐ŸŽˆ CSR

CSR์€ ๊ธฐ์กด ์›น์˜ ๋™์ž‘๋ฐฉ์‹๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ
Server์—์„œ html์„ ๋‚ด๋ ค๋ฐ›์ง€ ์•Š๊ณ  ์˜จ์ „ํžˆ Client์—์„œ๋งŒ ์ฝ”๋“œ๋ฅผ ๋ฐ›์•„ ๊ทธ๋ ค์ฃผ๋Š” ๋™์ž‘ ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.
์–ด๋–ป๊ฒŒ??? (๋ฆฌ์•กํŠธ๋ฅผ ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•œ๋‹ค)
Network ํƒญ์˜ Doc์™€ | Element ํƒญ์„ ๋น„๊ตํ•˜๋ฉฐ ํ™•์ธํ•ด๋ณด๋ฉด
Doc(Server)์—์„œ๋Š” root ํƒœ๊ทธ๊ฐ€ ๋น„์–ด์žˆ์ง€๋งŒ Element ํƒญ(Client)๋Š” ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด์™€์žˆ๋‹ค.
๊ทธ ๋ง์€, bundle.js์— ์ฝ”๋“œ๊ฐ€ ๋‹ด๊ฒจ์ ธ ์˜จ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋นŒ๋“œ๋ฅผ ํ•  ๋•Œ bundle.js์— ๋ชจ๋“  ๋ฆฌ์•กํŠธ ์ฝ”๋“œ๋ฅผ javascript๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋‹ด์•„์ค€๋‹ค.

์„œ๋ฒ„๋Š” ๋น„์–ด์žˆ๋Š” html์„ ์‘๋‹ตํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์—์„œ bundle.js๋ฅผ ์ฝ์œผ๋ฉด์„œ DOM ํ™”๋ฉด์„ ๊ทธ๋ ค์ค€๋‹ค.

CSR์˜ ์žฅ์ ๊ณผ ๋‹จ์ 

  • ์žฅ์ ์€ URL์ด ๋ฐ”๋€Œ์–ด๋„ html์„ ๋‹ค์‹œ ๋ฐ›์ง€ ์•Š๊ณ  ํด๋ผ์ด์–ธํŠธ์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋‹จ์ ์€ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜๊ณ  ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค bundle.js์˜ ํฌ๊ธฐ๊ฐ€ ๋ˆˆ๋ฉ์ด์ฒ˜๋Ÿผ ์ปค์ ธ ๋กœ๋”ฉ์ด ์ ์  ๋Š๋ ค์ง„๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ฒซ ํ™”๋ฉด์„ ๋ณด๊ธฐ๊นŒ์ง€ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค.
    ์ด๋Ÿฐ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด CSR+SSR์„ ํ•˜๋ฉด ์–ด๋–จ๊นŒ! -> ์ด๊ฒŒ ๋ฐ”๋กœ Next.js์ด๋‹ค.

๐ŸŽˆ ํ•ด๊ฒฐ์ฑ…

๊ทธ๋Ÿผ ์ฒซ ์‹œ์ž‘ ํ™”๋ฉด์€ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„ ๋ Œ๋”๋งํ•˜๊ณ , ๋‚˜๋จธ์ง€๋Š” CSR ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋ฉด ์–ด๋–จ๊นŒ?
์ฒซ ํ™”๋ฉด์€ Server์—์„œ ๋‚ด์šฉ์ด ์ฑ„์›Œ์ง„ html์„ ๋ฐ›๊ณ  Client์—์„œ๋Š” ๊ทธ๋ฆฐ๋‹ค๋Š” ๋ง์ด๋‹ค.
-> ๊ฒ€์ƒ‰์—”์ง„์ตœ์ ํ™”, ์ฒซ ํ™”๋ฉด ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋นจ๋ผ์ง„๋‹ค.
-> ์ดํ›„์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ url์„ ์ด๋™ํ•ด๋„ ๊นœ๋นก์ž„ ์—†์ด ์ด์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋” ์‰ฌ์šด๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ ???? ์žˆ๋‹ค! Next.js!

Next.js

Next.js์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” page๊ธฐ๋ฐ˜์œผ๋กœ ๋นŒ๋“œ๋ฅผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
page๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ component๋“ค๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค. pages์— ์žˆ๋Š” ํŒŒ์ผ ์ด๋ฆ„์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋ผ์šฐํŒ…์ด ๋™์ž‘ํ•œ๋‹ค.

๋งจ ์ฒ˜์Œ์€ index.js๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. ์—ฌ๊ธฐ์„œ ์•„๊นŒ ํ™•์ธํ–ˆ๋Š” Networkํƒญ์„ ํ™•์ธํ•ด๋ณด๋ฉด, ์„œ๋ฒ„์—์„œ html์„ ๋‹ด์•„์„œ ์‘๋‹ตํ•ด์ค€๋‹ค.
๊ทธ ํ›„ /home url๋กœ ์ด๋™์„ ํ•ด๋„ ์„œ๋ฒ„์—์„œ html์„ ์‘๋‹ตํ•ด์ค€๋‹ค.

๊ทธ๋Ÿผ CSR๋Š” ์–ด๋””์„œ ๋™์ž‘ํ•˜๋Š”๊ฑฐ์•ผ ?
Next.js์— ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” next/link๋‚˜ next/router๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ CSR ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘๋œ๋‹ค.

๐ŸŽˆ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ์ดํ•ด๋„๋ฅผ ๋†’์—ฌ๋ณด์ž
Next.js ๊ณต์‹ ๋ฌธ์„œ์—์„œ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.

import Link from 'next/link'

function Home() {
  return (
    <ul>
      <li>
        <Link href="/">
          <a>Home</a>
        </Link>
      </li>
      <li>
        <Link href="/about">
          <a>About Us</a>
        </Link>
      </li>
      <li>
        <Link href="/blog/hello-world">
          <a>Blog Post</a>
        </Link>
      </li>
    </ul>
  )
}

export default Home

next/link๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด CSR ๋ฐฉ์‹์œผ๋กœ ๋ Œ๋”๋ง์ด ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

<Link href="/about">

์ด๋ผ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด pages ํด๋” ์•ˆ์˜ about.js๊ฐ€ ์‹คํ–‰๋˜๋Š”๋ฐ
์ด๋•Œ ์„œ๋ฒ„์—์„œ html์„ ์‘๋‹ตํ•˜์ง€ ์•Š๊ณ  Client ๋‚ด๋ถ€์—์„œ ๋ Œ๋”๋ง๋˜๋Š” CSR๋กœ ๋™์ž‘ํ•œ๋‹ค๐ŸŽˆ

์ฒซ ํ™”๋ฉด์€ ๋ฌด์กฐ๊ฑด ์„œ๋ฒ„์—์„œ html์„ ์‘๋‹ตํ•œ๋‹ค. ๊ผญ index.js๊ฐ€ ์•„๋‹ˆ๋ผ๋„ /about์œผ๋กœ ์‹คํ–‰ํ•ด๋„ about์˜ html์„ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์„œ ๋ Œ๋”๋ง(SSR)ํ•œ๋‹ค. ๊ทธ๋Ÿผ ์ฒซ ํ™”๋ฉด ๋กœ๋”ฉ์ด ๋นจ๋ผ์ง„๋‹ค!

ํ•œ ์ค„๋กœ ์ •๋ฆฌํ•˜๋ฉด!
์ฒซ ํ™”๋ฉด์€ SSR ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  ๊ทธ ์ดํ›„๋Š” ๋ชจ๋‘ CSR ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•œ๋‹ค.


์ฐธ๊ณ 
์œ ํŠœ๋ธŒ ๊ฐœ๋ฐœํ™”๋ผ๋ฆฌ๋‹˜
Next.js ๊ณต์‹ ๋ฌธ์„œ

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ