ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ๋ธŒ๋ผ์šฐ์ €์˜ ์ž‘๋™ ์›๋ฆฌ(๋ณด์ด๋Š” ๊ณณ) - AJAX, SSR๊ณผ CSR
    codeStates front-end/node(server) 2023. 1. 30. 19:35
    ๋ฐ˜์‘ํ˜•

     

     

     

     

    ๐Ÿ“Œ ๋ธŒ๋ผ์šฐ์ €์˜ ์ž‘๋™ ์›๋ฆฌ(๋ณด์ด๋Š” ๊ณณ)

     

     

    ๐Ÿ”— AJAX(Asynchronous JavaScript And XMLHttpRequest)

     

    ๋น„๋™๊ธฐ์‹ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ XML

    ์›น ํŽ˜์ด์ง€์— ํ•„์š”ํ•œ ๋ถ€๋ถ„์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ›์•„์™€ ํ™”๋ฉด์— ๊ทธ๋ ค๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ•

     

     

     

     

    ๋ณดํ†ต ์›นํŽ˜์ด์ง€๋Š” ๋ฌธ์„œ ๊ฐ์ฒด๋ผ๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌ์„ฑ -> HTML

     

    <HTML>
    <HEAD>
    <TITLE>ํ™˜ํ…Œํฌ ํ‹ฐ์Šคํ† ๋ฆฌ</TITLE>
    </HEAD>
    <BODY>
    <P>์—ฌ๊ธฐ๋Š” ํ™˜ํ…Œํฌ ํ‹ฐ์Šคํ† ๋ฆฌ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค</P>
    <IMG SRC="hwan.jpg"></IMG>
    </BODY>
    </HTML>

     

     

    ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์˜ ์ฒ˜๋ฆฌ ๊ณผ์ •(๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ)

     

    html -> head -> title -> text:"ํ™˜ํ…Œํฌ ํ‹ฐ์Šคํ† ๋ฆฌ"
         -> body -> text:"์—ฌ๊ธฐ๋Š” ํ™˜ํ…Œํฌ ํ‹ฐ์Šคํ† ๋ฆฌ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค"
                 -> img -> src="hwan.jpg"

     

    ์ด๋ฏธ์ง€๋ฅผ ๋ฐ”๊พธ๋ ค๋ฉด ์ด๋ฏธ์ง€๋งŒ ๋ถ„ํ•ดํ•˜์—ฌ ์กฐ์ž‘ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์›นํŽ˜์ด์ง€์— ์ƒˆ๋กœ ๋ณด์—ฌ์ค˜์•ผ ํ•˜๋Š” ๋‚ด์šฉ์ด ์„œ๋ฒ„์—์„œ ์™€์•ผ ํ•  ๊ฒฝ์šฐ,

    ์„œ๋ฒ„์— ๊ทธ ๋‚ด์šฉ์„ ์š”์ฒญํ•ด๋†“๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•œ๋‹ค. ์›ํ•˜๋Š” ๋‚ด์šฉ์ด ๋„์ฐฉํ•˜๋ฉด ๊ทธ ๋•Œ ์—…๋ฐ์ดํŠธํ•œ๋‹ค

     

     

    ์ถœ์ฒ˜ : https://sungmooncho.com/2012/12/04/gmail-and-ajax/
    
    ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ๋‹ค. 
    ์†Œํฌ๋ฅผ ์ฃผ๋ฌธํ•ด๋†“๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. 
    ํ•œ ํ™”๊ฐ€๊ฐ€ ํ™”์‹ค์—์„œ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜์ž. 
    ๋…ธ๋ž€์ƒ‰ ๋ฌผ๊ฐ์ด ๋–จ์–ด์กŒ๋‹ค. ์ „ํ™”๋กœ ๋…ธ๋ž€์ƒ‰ ๋ฌผ๊ฐ์„ ์ถ”๊ฐ€ ์ฃผ๋ฌธํ–ˆ๋‹ค. 
    ์ด ๊ฒฝ์šฐ, ํ™”๊ฐ€๋Š” ๋‘ ๊ฐ€์ง€ ์„ ํƒ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋ฌผ๊ฐ์ด ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.
    ์ด๊ฒƒ์ด ๋ฐ”๋กœ “๋™๊ธฐ(Synchronous)” ๋ฐฉ์‹์ด๋‹ค. ๋˜ ํ•œ๊ฐ€์ง€๋Š”, ๋…ธ๋ž€์ƒ‰ ๋ฌผ๊ฐ์ด ํ•„์š”ํ•œ ์ผ์€ ๊ทธ๋Œ€๋กœ 
    ๋‘๊ณ  ๊ฐ€์ง„ ๋ฌผ๊ฐ์œผ๋กœ ๊ทธ๋ฆผ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ๊ทธ๋ฆฌ๋‹ค๊ฐ€, ์†Œํฌ๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ๊ทธ ๋•Œ ๋…ธ๋ž€ ๋ฌผ๊ฐ์œผ๋กœ ํ•„์š”ํ•œ
    ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์ด “๋น„๋™๊ธฐ(Asynchronous)” ๋ฐฉ์‹์ด๋‹ค. 
    Ajax์—์„œ A์˜ ์•ฝ์ž๊ฐ€ ๋ฐ”๋กœ Aynchronous(๋น„๋™๊ธฐ ๋ฐฉ์‹)๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

     

     

    ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ์ƒˆ๋กœ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ด ๋™๊ธฐ ๋ฐฉ์‹์ด๋‹ค

    ๊ทธ๋Ÿฌ๋‚˜ ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ์ƒˆ๋กœ ๋กœ๋“œํ•˜์ง€ ์ผ๋ถ€ ์ž‘์—…๋งŒ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ด ๋น„๋™๊ธฐ ๋ฐฉ์‹์ด๋‹ค

     

     

    Ajax ์‚ฌ์šฉ๋ฐฉ๋ฒ•

     

    Ajax๋Š” ๋ฐ‘์˜ ๋ฐฉ๋ฒ•๋“ค๋กœ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋‹ค

    1. jQuery Ajax
    2. axios ์„ค์น˜
    3. fetch()

    ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„œ๋Š” axios ํ˜น์€ fetch()๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค

     

    Fetch ์˜ˆ์ œ

     

    // Fetch๋ฅผ ์‚ฌ์šฉ
    fetch('http://52.78.213.9:3000/messages')
    	.then (function(response) {
    		return response.json();
    	})
    	.then(function (json) {
    		...
    });

     

     

     

    ๐Ÿ”— SSR vs CSR

     

    SSR(Server Side Rendering)

     

    ์›น ํŽ˜์ด์ง€๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง

     

    1. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์˜ url๋กœ get ์š”์ฒญ
    2. ์„œ๋ฒ„๋Š” ์ •ํ•ด์ง„ ์›น ํŽ˜์ด์ง€ ํŒŒ์ผ์„ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก
    3. ์„œ๋ฒ„์˜ ์›น ํŽ˜์ด์ง€๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ๋„์ฐฉํ•˜๋ฉด ๋ Œ๋”๋ง

    ์›น ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ,

    ์„œ๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ ๋‹ค์Œ, ์›น ํŽ˜์ด์ง€๋ฅผ ์™„์ „ํžˆ ๋ Œ๋”๋ง ๋œ ํŽ˜์ด์ง€๋กœ ๋ณ€ํ™˜ํ•œ ํ›„์—

    ๋ธŒ๋ผ์šฐ์ €์— ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ธ๋‹ค. ์›น ํŽ˜์ด์ง€๋ฅผ ์‚ดํŽด๋ณด๋˜ ์‚ฌ์šฉ์ž๊ฐ€, ๋ธŒ๋ผ์šฐ์ €์˜ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

    ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„๋Š” ๊ฐ™์€ ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰

     

     

    CSR(Client Side Rendering)

     

    CSR์€ ํด๋ผ์ด์–ธํŠธ์—์„œ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋ง

     

    1. ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์˜ ์š”์ฒญ์„ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋ฉด
    2. ์„œ๋ฒ„๋Š” ์›น ํŽ˜์ด์ง€ ๊ณจ๊ฒฉ์ด ๋  ๋‹จ์ผ ํŽ˜์ด์ง€(jsํŒŒ์ผ๊ณผ ํ•จ๊ป˜)๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋ƒ„
    3. ํด๋ผ์ด์–ธํŠธ๋Š” ์ „๋‹ฌ๋œ jsํŒŒ์ผ ์›นํŽ˜์ด์ง€ ์™„์ „ํžˆ ๋ Œ๋”๋ง ๋œ ํŽ˜์ด์ง€๋กœ ๋ฐ”๊พผ๋‹ค

    ์›น ํŽ˜์ด์ง€์— ํ•„์š”ํ•œ ๋‚ด์šฉ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์ธ ๊ฒฝ์šฐ์—๋Š” ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ

    ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์›น ํŽ˜์ด์ง€์— ๋ Œ๋”๋ง์„ ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด๊ณณ์— API๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

    ์›น ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ API ์š”์ฒญ์œผ๋กœ ํ•ด์†Œํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋ฉด

    CSR์—์„œ๋Š” SSR๊ณผ ๋‹ค๋ฅด๊ฒŒ, ์„œ๋ฒ„๊ฐ€ ์›น ํŽ˜์ด์ง€์˜ ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๊ณ 

    ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญํ•œ ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•œ๋‹ค

     

     

    SSR ์‚ฌ์šฉ

    • SEO(Search Engine Optimization) ๊ฐ€ ์šฐ์„ ์ˆœ์œ„์ธ ๊ฒฝ์šฐ, ์ผ๋ฐ˜์ ์œผ๋กœ SSR(Server Side Rendering) ์„ ์‚ฌ์šฉ
    • ์›น ํŽ˜์ด์ง€์˜ ์ฒซ ํ™”๋ฉด ๋ Œ๋”๋ง์ด ๋น ๋ฅด๊ฒŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ๋‹จ์ผ ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์ด ์ž‘์€ SSR ์ด ์ ํ•ฉ
    • ์›น ํŽ˜์ด์ง€๊ฐ€ ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉ์ด ์ ์€ ๊ฒฝ์šฐ, SSR ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    CSR ์‚ฌ์šฉ

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

     

     

    const express = require("express");
    const app = express();
    const port = process.env.PORT || 5000;
    
    const infoArr = [
      "ssr๊ณผ ์ฐจ์ด์ ์ด ๋А๊ปด์ง€๋‚˜์š”?",
      "csr์ด๋ž€?",
      "SPA๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ",
      "ํ™”๋ฉด์˜ ์ผ๋ถ€๋งŒ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ",
      "HTML์€ ์–ด๋””์„œ ์กฐ์ž‘๋ ๊นŒ์š”?",
      "Client Side Rendering",
      "AJAX๋ฅผ ํ†ตํ•ด์„œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ›์Šต๋‹ˆ๋‹ค."
    ];
    app.get(`/`, (req, res) =>
      res.send(infoArr[Math.floor(Math.random() * infoArr.length)])
    );
    app.get(`/csr`, (req, res) =>
      res.send(infoArr[Math.floor(Math.random() * infoArr.length)])
    );
    
    app.listen(port, () =>
      console.log(`Example app listening at http://localhost:${port}`)
    );

     

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€

Designed by Tistory.