Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Server Side Rendering๊ณผ Client Side Rendering #16

Open
yuiseo opened this issue Nov 8, 2024 · 0 comments
Open

Server Side Rendering๊ณผ Client Side Rendering #16

yuiseo opened this issue Nov 8, 2024 · 0 comments
Assignees
Labels
ํ”„๋ก ํŠธ์—”๋“œ ์งˆ๋ฌธ ๋ฆฌ์ŠคํŠธ์˜ ์ง๋ฌด ๊ตฌ๋ถ„์„ ์œ„ํ•œ ๋ผ๋ฒจ ๐Ÿ’ก ์งˆ๋ฌธ ๋ฆฌ์ŠคํŠธ ์ง๋ฌด ๊ด€๋ จ ๊ถ๊ธˆ์ฆ๊ณผ ํ•ด๊ฒฐ์ด ํ•„์š”ํ•œ ์งˆ๋ฌธ๋“ค

Comments

@yuiseo
Copy link
Member

yuiseo commented Nov 8, 2024

๐Ÿ“ ์ œ๋ชฉ: Server Side Rendering(SSR)๊ณผ Client Side Rendering(CSR)์˜ ์ดํ•ด

๐Ÿ“š ์ฃผ์ œ:
Next.js์—์„œ ์‚ฌ์šฉ๋˜๋Š” Server Side Rendering(SSR)๊ณผ Client Side Rendering(CSR)์˜ ๊ฐœ๋… ๋ฐ ์ฐจ์ด์  ์„ค๋ช…

๐ŸŽฏ ์Šคํ„ฐ๋”” ๋ชฉํ‘œ
์„ค๋ช…: SSR๊ณผ CSR์˜ ์ฐจ์ด์ ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ , ๊ฐ ๋ฐฉ์‹์˜ ์žฅ๋‹จ์ ์„ ํ•™์Šตํ•˜๊ธฐ


๐Ÿ“– ํ•ต์‹ฌ ๋‚ด์šฉ:

1. Server Side Rendering(SSR)

  • SSR์€ ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•  ๋•Œ ์„œ๋ฒ„์—์„œ HTML์„ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹
  • ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š”(๋ Œ๋”๋ง) ์ฃผ์ฒด๊ฐ€ ์„œ๋ฒ„! (why? html์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์„œ๋ฒ„๋‹ˆ๊นŒ!)
  • ์„œ๋ฒ„์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ๋ธŒ๋ผ์šฐ์ €์— ์ „๋‹ฌ๋˜๋ฏ€๋กœ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ ์™„์„ฑ๋œ HTML์„ ์ œ๊ณต

๋ ˆ์Šคํ† ๋ž‘์— ๋น„์œ ํ•˜๋ฉด?

๋ ˆ์Šคํ† ๋ž‘์—์„œ ์Œ์‹์„ ์ฃผ๋ฌธํ–ˆ์„ ๋•Œ, ์ฃผ๋ฐฉ์—์„œ ๋ฏธ๋ฆฌ ์š”๋ฆฌ๋ฅผ ๋‹ค ๋งŒ๋“ค์–ด์„œ ๊ณ ๊ฐ์—๊ฒŒ ๊ฐ€์ ธ๋‹ค์ฃผ๋Š” ์ƒํ™ฉ
๊ณ ๊ฐ์€ ์Œ์‹์„ ๋ฐ›์•„์„œ ๋ฐ”๋กœ ๋จน์„ ์ˆ˜ ์žˆ์Œ!
์š”๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๊นŒ์ง€์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€๋งŒ, ๋ฐ›์ž๋งˆ์ž ์ค€๋น„๋œ ์š”๋ฆฌ๋ฅผ ๋ฐ”๋กœ ๋จน์„ ์ˆ˜ ์žˆ์Œ

image

1. ์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ์— ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค
2. ์„œ๋ฒ„๋Š” ๋ Œ๋”๋ง ๊ฐ€๋Šฅํ•œ HTML ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค
3. ๋ธŒ๋ผ์šฐ์ €๋Š” ๋น ๋ฅด๊ฒŒ HTMLํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ์–ด ํ™”๋ฉด์€ ๋ Œ๋”๋ง ๋œ ์ƒํƒœ์ด์ง€๋งŒ ์•„์ง JS ํŒŒ์ผ์„ ์ฝ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐ์ž‘์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
4. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ JS๋ฅผ ์ฝ๋Š”๋‹ค
5. ์ด์ œ ์œ ์ €๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ๋ณด๊ณ  ์‚ฌ์šฉ์ž์˜ ์กฐ์ž‘๋„ ๊ธฐ๋ก๋œ๋‹ค.
6. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ JS ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค
7. ๊ธฐ๋ก๋œ ์‚ฌ์šฉ์ž ์กฐ์ž‘๋„ ์‹คํ–‰๋˜๊ณ  ํŽ˜์ด์ง€ ์ƒํ˜ธ์ž‘์šฉ๋„ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

์žฅ์ 

  • ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ , SEO(๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™”)์— ์œ ๋ฆฌ
  • ์„œ๋ฒ„์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํ–ฅ์ƒ

๋‹จ์ 

  • ์ดˆ๊ธฐ ๋กœ๋”ฉ ์ดํ›„ ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ์†๋„๊ฐ€ CSR์— ๋น„ํ•ด ๋Š๋ฆผ
  • ์„œ๋ฒ„์— ๋ถ€ํ•˜๊ฐ€ ๋งŽ์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„œ๋ฒ„ ์‘๋‹ต ์†๋„์— ๋”ฐ๋ผ ๋ Œ๋”๋ง ์†๋„๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ

2. Client Side Rendering(CSR)

  • CSR์€ ์ดˆ๊ธฐ ์š”์ฒญ ์‹œ ์ตœ์†Œํ•œ์˜ HTML๊ณผ JavaScript๋ฅผ ๋ณด๋‚ด๊ณ , ๋ธŒ๋ผ์šฐ์ €์—์„œ JavaScript๊ฐ€ ์‹คํ–‰๋˜์–ด ์ฝ˜ํ…์ธ ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹
  • ์ฆ‰ ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ์ธ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ™”๋ฉด์— ๊ทธ๋ฆผ
  • ์ฃผ๋กœ React ๊ฐ™์€ SPA ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์‚ฌ์šฉ

์‹๋‹น์— ๋น„์œ ํ•˜๋ฉด?

์ฆ‰์„ ์š”๋ฆฌ ์ฝ”๋„ˆ์—์„œ ์Œ์‹์„ ๋ฐ›๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ
๊ณ ๊ฐ์€ ๋นˆ ์ ‘์‹œ๋ฅผ ๋จผ์ € ๋ฐ›์ง€๋งŒ, ์ง์ ‘ ์š”๋ฆฌํ•  ์žฌ๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์•„ ํ…Œ์ด๋ธ”์—์„œ ์š”๋ฆฌ๋ฅผ ๋งˆ์นœ ํ›„์— ๋จน์–ด ํ•จ!
์ฒ˜์Œ์—๋Š” ๋น„์–ด ์žˆ์ง€๋งŒ, ์กฐ๊ธˆ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์›ํ•˜๋Š” ์Œ์‹์ด ์™„์„ฑ

image

1. ์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ์— ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
2. CDN์ด ๋น ๋ฅด๊ฒŒ HTMLํŒŒ์ผ๊ณผ JSํŒŒ์ผ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋งํฌ๋ฅผ ๋ณด๋‚ธ๋‹ค.
- CDN(Content Delivery Network)์ฝ˜ํ…์ธ  ์ „์†ก๋„คํŠธ์›Œํฌ : ์—”๋“œ ์œ ์ €์˜ ์š”์ฒญ์— '๋ฌผ๋ฆฌ์ '์œผ๋กœ ๊ฐ€๊นŒ์šด ์„œ๋ฒ„์—์„œ ์š”์ฒญ์— ์‘๋‹ตํ•˜๋Š” ๋ฐฉ์‹
3. ๋ธŒ๋ผ์šฐ์ €๋Š” HTML,JS ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๊ณ  ๊ทธ๋™์•ˆ ํ™”๋ฉด์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.
4. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ JSํŒŒ์ผ์„ ์ฝ๋Š”๋‹ค. (์ด๋•Œ๋„ ํ™”๋ฉด ์•ˆ๋ณด์ž„)
5. ๋‹ค์šด์ด ์™„๋ฃŒ๋œ JS๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•œ API๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. (์ด๋•Œ ์œ ์ €๋“ค์€ placeholder๋ฅผ ๋ณด๊ฒŒ๋œ๋‹ค. )
6. ์„œ๋ฒ„๊ฐ€ API ์š”์ฒญ์— ์‘๋‹ตํ•œ๋‹ค
7. API๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜จ data๋ฅผ placeholder ์ž๋ฆฌ์— ๋„ฃ์–ด์ค€๋‹ค. ์ด์ œ ํŽ˜์ด์ง€๋Š” ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

์žฅ์ :

  • ์ดˆ๊ธฐ ๋กœ๋”ฉ ์ดํ›„์˜ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•œ ๊ฒฝํ—˜์ด ํ–ฅ์ƒ
  • ์ƒˆ๋กœ๊ณ ์นจ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ๋„์›€
  • ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€ ๊ฐ„ ์ด๋™ ์‹œ ๋” ๋น ๋ฅธ ์ „ํ™˜์ด ๊ฐ€๋Šฅ
  • ํ•„์š”ํ•œ, ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ›์•„์˜ค๋ฏ€๋กœ ํŠธ๋ž˜ํ”ฝ ๊ฐ์†Œ

๋‹จ์ 

  • ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ ์ฝ˜ํ…์ธ ๊ฐ€ ๋น„์–ด ์žˆ๋Š” ์ƒํƒœ๋กœ ์‹œ์ž‘๋˜๊ธฐ ๋•Œ๋ฌธ์— SEO์— ๋ถˆ๋ฆฌ
  • ์ฒซ ํ™”๋ฉด์ด ๋ณด์ด๊ธฐ๊นŒ์ง€ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Œ

3. SSR๊ณผ CSR์˜ ์‹ค์ œ ์ฝ”๋“œ ์˜ˆ์ œ

1. SSR (Server-Side Rendering)

์„œ๋ฒ„์—์„œ HTML์„ ๋ Œ๋”๋งํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์— ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด, ์ฆ‰์‹œ HTML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฐ›์€ HTML์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

const express = require('express');
const app = express();

// ํด๋ผ์ด์–ธํŠธ๊ฐ€ '/' ๊ฒฝ๋กœ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„๊ฐ€ HTML์„ ๋งŒ๋“ค์–ด ๋ณด๋ƒ…๋‹ˆ๋‹ค.
app.get('/', (req, res) => {
    res.send('<html><body><h1>Hello, SSR!</h1></body></html>');
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});
  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์— ์ ‘์†ํ•˜๋ฉด, ์„œ๋ฒ„๊ฐ€ HTML์„ ๋งŒ๋“ค์–ด์„œ ๋ณด๋‚ด์คŒ
  • ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ฅผ ๋ฐ”๋กœ ๋ณด์—ฌ์คŒ

2. CSR (Client-Side Rendering)

ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTML์„ ๋จผ์ € ๋ฐ›์€ ํ›„, JavaScript๋กœ ๋™์ ์œผ๋กœ ๋‚ด์šฉ์„ ์ถ”๊ฐ€
์„œ๋ฒ„๋Š” ๊ธฐ๋ณธ HTML๊ณผ JavaScript๋งŒ ์ „์†ก
๋ธŒ๋ผ์šฐ์ €๋Š” JavaScript๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ•„์š”ํ•œ ๋‚ด์šฉ์„ ๋™์ ์œผ๋กœ ํ‘œ์‹œ

<!DOCTYPE html>
<html>
<head>
    <title>CSR Example</title>
    <script>
        // ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋œ ํ›„ JavaScript๊ฐ€ ์‹คํ–‰๋˜์–ด ๋‚ด์šฉ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
        document.addEventListener('DOMContentLoaded', () => {
            document.body.innerHTML = '<h1>Hello, CSR!</h1>';
        });
    </script>
</head>
<body>
</body>
</html>
  • ๋ธŒ๋ผ์šฐ์ €๋Š” ์ฒ˜์Œ์— ๋นˆ HTML๊ณผ JavaScript ํŒŒ์ผ์„ ๋ฐ›์Œ
  • JavaScript๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ํ™”๋ฉด์— <h1>Hello, CSR!</h1>๊ฐ€ ํ‘œ์‹œ

์ฐจ์ด์  ์š”์•ฝ

image
image

SSR์€ ์„œ๋ฒ„์—์„œ HTML์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋ณด๋‚ด์–ด, ๋น ๋ฅธ ์ดˆ๊ธฐ ํ™”๋ฉด ๋กœ๋”ฉ.
CSR์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTMLํŒŒ์ผ JSํŒŒ์ผ ๋‹ค ์ฝ๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ ์‹คํ–‰๊นŒ์ง€ ๋‹ค ํ•˜๊ณ ๋‚˜์„œ์•ผ ํŽ˜์ด์ง€๊ฐ€ ๋ณด์—ฌ์ง€๊ณ  ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅ.
๋”ฐ๋ผ์„œ, ์ดˆ๊ธฐ ๋กœ๋”ฉ์€ ๋Š๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ, ์ดํ›„ ์ƒํ˜ธ์ž‘์šฉ์€ ๋น ๋ฆ„.

4. Next.js์—์„œ์˜ ํ™œ์šฉ

  • Next.js๋Š” SSR๊ณผ CSR์„ ๋ชจ๋‘ ์ง€์›
  • ์ƒํ™ฉ์— ๋งž๊ฒŒ getServerSideProps, getStaticProps ๋“ฑ์„ ์‚ฌ์šฉํ•ด SSR์„ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜, ๊ธฐ๋ณธ์ ์ธ CSR ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๊ฒฉ(SEO ํ•„์š”์„ฑ, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋นˆ๋„ ๋“ฑ)์— ๋”ฐ๋ผ ์ ํ•ฉํ•œ ๋ฐฉ์‹์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿ’ก ์ฐธ๊ณ  ์ž๋ฃŒ:
https://f-lab.kr/insight/ssr-vs-csr-20240707?gad_source=1&gclid=Cj0KCQiA0MG5BhD1ARIsAEcZtwRswlpe85ZfezLC9LMYaDjNSXt_yw6x0ovOIASB68nUKbFsmy2pe4gaAguFEALw_wcB

https://velog.io/@jhyun_k/%EC%84%9C%EB%B2%84%EC%82%AC%EC%9D%B4%EB%93%9C%EB%A0%8C%EB%8D%94%EB%A7%81-vs-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%EC%82%AC%EC%9D%B4%EB%93%9C%EB%A0%8C%EB%8D%94%EB%A7%81-SSR%EA%B3%BC-CSR
https://bigyou98.tistory.com/entry/Nextjs-%EC%93%B0%EB%A9%B4-SSR-%ED%95%98%EA%B3%A0-%EC%9E%88%EB%8A%94%EA%B1%B0-%EC%95%84%EB%8B%98

@yuiseo yuiseo added ๐Ÿ’ก ์งˆ๋ฌธ ๋ฆฌ์ŠคํŠธ ์ง๋ฌด ๊ด€๋ จ ๊ถ๊ธˆ์ฆ๊ณผ ํ•ด๊ฒฐ์ด ํ•„์š”ํ•œ ์งˆ๋ฌธ๋“ค ํ”„๋ก ํŠธ์—”๋“œ ์งˆ๋ฌธ ๋ฆฌ์ŠคํŠธ์˜ ์ง๋ฌด ๊ตฌ๋ถ„์„ ์œ„ํ•œ ๋ผ๋ฒจ labels Nov 8, 2024
@yuiseo yuiseo self-assigned this Nov 8, 2024
@suna-ji suna-ji closed this as completed Nov 14, 2024
@suna-ji suna-ji reopened this Dec 22, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ํ”„๋ก ํŠธ์—”๋“œ ์งˆ๋ฌธ ๋ฆฌ์ŠคํŠธ์˜ ์ง๋ฌด ๊ตฌ๋ถ„์„ ์œ„ํ•œ ๋ผ๋ฒจ ๐Ÿ’ก ์งˆ๋ฌธ ๋ฆฌ์ŠคํŠธ ์ง๋ฌด ๊ด€๋ จ ๊ถ๊ธˆ์ฆ๊ณผ ํ•ด๊ฒฐ์ด ํ•„์š”ํ•œ ์งˆ๋ฌธ๋“ค
Projects
None yet
Development

No branches or pull requests

2 participants