Jieunny์˜ ๋ธ”๋กœ๊ทธ

S2) Unit 7. [HTTP/๋„คํŠธ์›Œํฌ] ๋ธŒ๋ผ์šฐ์ €์˜ ์ž‘๋™ ์›๋ฆฌ(๋ณด์ด๋Š” ๊ณณ) ๋ณธ๋ฌธ

CodeStates/learning contents

S2) Unit 7. [HTTP/๋„คํŠธ์›Œํฌ] ๋ธŒ๋ผ์šฐ์ €์˜ ์ž‘๋™ ์›๋ฆฌ(๋ณด์ด๋Š” ๊ณณ)

Jieunny 2023. 1. 30. 16:00

๐Ÿ“ฃ  SPA๋ฅผ ๋งŒ๋“œ๋Š” ๊ธฐ์ˆ : AJAX

โœ”๏ธ AJAX ๋ž€?

โžฐ Asynchronous JavaScript And XMLHttpRequest

โžฐ JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜๋กœ JS๋ฅผ ์‚ฌ์šฉํ•œ ๋น„๋™๊ธฐ ํ†ต์‹ , ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์— XML๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

โžฐ JS, DOM, Fetch, XMLHttpRequest, HTML ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š” ์›น ๊ฐœ๋ฐœ ๊ธฐ๋ฒ•

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

โžฐ ex) ๊ฒ€์ƒ‰์ฐฝ์€ ๊ธ€์ž๋ฅผ ์ž…๋ ฅํ•  ๋•Œ๋งˆ๋‹ค ์ถ”์ฒœ๊ฒ€์ƒ‰์–ด๋ฅผ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋œ๋‹ค.

 

โœ”๏ธ AJAX์˜ ํ•ต์‹ฌ ๊ธฐ์ˆ 

โžฐ JS์™€ DOM, ๊ทธ๋ฆฌ๊ณ  Fetch

โžฐ Fetch๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜์ง€ ์•Š์•„๋„ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

โžฐ ๋ธŒ๋ผ์šฐ์ €๋Š” Fetch๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ๋™์ž‘์„ ๋ฉˆ์ถ”๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ณ„์†ํ•ด์„œ ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋น„๋™๊ธฐ์ ์ธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

โžฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์™€์„œ DOM์— ์ ์šฉ์‹œ์ผœ ๊ธฐ์กด ํŽ˜์ด์ง€์—์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“ฃ  XHR๊ณผ Fetch

โžฐ Fetch ์ด์ „์—๋Š” XHR์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

โžฐ Fetch๋Š” XHR์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•œ ์ƒˆ๋กœ์šด Web API๋กœ, XML ๋ณด๋‹ค ๊ฐ€๋ณ๊ณ  JS์™€ ํ˜ธํ™˜๋˜๋Š” JSON์œผ๋ฅด ์‚ฌ์šฉํ•œ๋‹ค.

โžฐ promise ์ง€์› ๋“ฑ์˜ ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์ง€๊ธˆ์€ XHR๋ณด๋‹ค ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

โž• XHR์ด๋ž€?

๋”๋ณด๊ธฐ

โžฐ XMLHttpRequest๋กœ, AJAX ์š”์ฒญ์„ ์ƒ์„ฑํ•˜๋Š” JS API ๋‹ค.

โžฐ XHR ๋ฉ”์„œ๋“œ๋กœ ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„๊ฐ„์˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

โžฐ ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๊ณ ์น˜์ง€ ์•Š๊ณ ๋„ URL์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ณ , ํŽ˜์ด์ง€์˜ ์ผ๋ถ€๋งŒ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

โžฐ Cross-Site ์ด์Šˆ ๋“ฑ์˜ ๋ถˆํŽธํ•จ์ด ์กด์žฌํ•œ๋‹ค.

    โž• Cross-Site Scripting(XSS) ์ด๋ž€?

        ๏น’์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ผ์–ด๋‚˜๋Š” ์ทจ์•ฝ์ ์œผ๋กœ ๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹Œ ๊ถŒํ•œ์ด ์—†๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์‚ฌ์ดํŠธ์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ•

โžฐ XHR ์˜ˆ์ œ

// XMLHttpRequest๋ฅผ ์‚ฌ์šฉ
var xhr = new XMLHttpRequest();
xhr.open('get', 'http://52.78.213.9:3000/messages');

xhr.onreadystatechange = function(){
	if(xhr.readyState !== 4) return;
	// readyState 4: ์™„๋ฃŒ

	if(xhr.status === 200) {
        // status 200: ์„ฑ๊ณต
		console.log(xhr.responseText); // ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์˜จ ์‘๋‹ต
	} else {
		console.log('์—๋Ÿฌ: ' + xhr.status); // ์š”์ฒญ ๋„์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ
	}
}

xhr.send(); // ์š”์ฒญ ์ „์†ก

โžฐ Fetch ์˜ˆ์ œ

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

 

๐Ÿ“ฃ  AJAX์˜ ์žฅ์ 

1๏ธโƒฃ ์„œ๋ฒ„์—์„œ HTML์„ ์™„์„ฑํ•˜์—ฌ ๋ณด๋‚ด์ฃผ์ง€ ์•Š์•„๋„ ์›น ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

โžฐ ์„œ๋ฒ„์—์„œ ์™„์„ฑ๋œ HTML์„ ๋ณด๋‚ด์ฃผ์ง€ ์•Š์•„๋„ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ฐ€์ ธ์™€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ™”๋ฉด์˜ ์ผ๋ถ€๋งŒ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2๏ธโƒฃ ํ‘œ์ค€ํ™”๋œ ๋ฐฉ๋ฒ•

โžฐ ์ด์ „์—๋Š” ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ AJAX๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋‚˜, XHR์ด ํ‘œ์ค€ํ™”๋˜๋ฉด์„œ๋ถ€ํ„ฐ ๋ธŒ๋ผ์šฐ์ €์— ์ƒ๊ด€์—†์ด AJAX๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

3๏ธโƒฃ ์œ ์ € ์ค‘์‹ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ

โžฐ AJAX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ถ€๋ถ„๋งŒ ๋ Œ๋”๋ง์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅด๊ณ  ๋” ๋งŽ์€ ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

4๏ธโƒฃ ๋” ์ž‘์€ ๋Œ€์—ญํญ(๋„คํŠธ์›Œํฌ ํ†ต์‹  ํ•œ ๋ฒˆ์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ)

โžฐ AJAX๋Š” ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ…์ŠคํŠธ ํ˜•ํƒœ(JSON, XML)๋กœ ๋ณด๋‚ด๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„๊ต์  ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘๋‹ค.

 

๐Ÿ“ฃ  AJAX์˜ ๋‹จ์ 

1๏ธโƒฃ Search Engine Optimization(SEO)์— ๋ถˆ๋ฆฌํ•˜๋‹ค.

โžฐ ์ฒ˜์Œ ๋ฐ›๋Š” HTML ํŒŒ์ผ์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•œ ํ‹€๋งŒ ์ž‘์„ฑ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. HTML ํŒŒ์ผ์€ ๋ผˆ๋Œ€๋งŒ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ดํŠธ์˜ ์ •๋ณด๋ฅผ ๊ธ์–ด๊ฐ€๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ ๊ฒ€์ƒ‰ ์ตœ์ ํ™”๊ฐ€ ์–ด๋ ต๋‹ค.

 

2๏ธโƒฃ ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ ๋ฌธ์ œ

โžฐ AJAX๋Š” ์ด์ „ ์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์ด ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋•Œ๋ฌธ์— ๋’ค๋กœ๊ฐ€๊ธฐ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” History API๋ฅผ ๋”ฐ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 


๐Ÿ“ฃ  SSR๊ณผ CSR

โœ”๏ธ SSR

โžฐ Server Side Rendering

โžฐ ์›น ํŽ˜์ด์ง€๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ Œ๋”๋งํ•˜๋Š” ๋Œ€์‹ ์— ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง ํ•œ๋‹ค.

โžฐ SSR ์˜ ๊ณผ์ •

    ๏น’๋ธŒ๋ผ์šฐ์ €๊ฐ€ URI๋กœ GET ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, ์„œ๋ฒ„๋Š” ์ •ํ•ด์ง„ ์›น ํŽ˜์ด์ง€ ํŒŒ์ผ์„ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†กํ•œ๋‹ค.

    ๏น’์„œ๋ฒ„์˜ ์›น ํŽ˜์ด์ง€๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ๋„์ฐฉํ•˜๋ฉด ์™„์ „ํžˆ ๋ Œ๋”๋ง ๋œ๋‹ค.

โžฐ ์„œ๋ฒ„์—์„œ ์›น ํŽ˜์ด์ง€๋ฅผ ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ณด๋‚ด๊ธฐ ์ „์— ์„œ๋ฒ„์—์„œ ์™„์ „ํžˆ ๋ Œ๋”๋งํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Server Side Rendering ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

โžฐ ์›น ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์„œ๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ ๋‹ค์Œ ์›น ํŽ˜์ด์ง€๋ฅผ ์™„์ „ํžˆ ๋ Œ๋”๋ง ๋œ ํŽ˜์ด์ง€๋กœ ๋ณ€ํ™˜ํ•œ ํ›„์— ๋ธŒ๋ผ์šฐ์ €์— ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ธ๋‹ค.

โžฐ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•œ ๊ฒฝ์šฐ, ์„œ๋ฒ„๋Š” ๊ฐ™์€ ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•œ๋‹ค. (์ƒˆ๋กœ์šด ์ •์ ํŒŒ์ผ์„ ์š”์ฒญ)

 

โœ”๏ธ CSR

โžฐ Client Side Rendering

โžฐ ํด๋ผ์ด์–ธํŠธ(์›น ๋ธŒ๋ผ์šฐ์ €)์—์„œ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋ง ํ•œ๋‹ค.

โžฐ CSR์˜ ๊ณผ์ •

    ๏น’๋ธŒ๋ผ์šฐ์ €์˜ ์š”์ฒญ์„ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„๋Š” ์›น ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋Œ€์‹ , ์›น ํŽ˜์ด์ง€์˜ ๊ณจ๊ฒฉ์ด ๋  ๋‹จ์ผ ํŽ˜์ด์ง€๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ธ๋‹ค.

    ๏น’์ด๋•Œ ์„œ๋ฒ„๋Š” ์›น ํŽ˜์ด์ง€์™€ ํ•จ๊ผ JS ํŒŒ์ผ์„ ๋ณด๋‚ด๊ณ , ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์›น ํŽ˜์ด์ง€๋ฅผ ๋ฐ›์œผ๋ฉด ์›น ํŽ˜์ด์ง€์™€ ํ•จ๊ป˜ ์ „๋‹ฌ๋œ JS ํŒŒ์ผ์€ ๋ธŒ๋ผ์šฐ์ €์˜

        ์›น  ํŽ˜์ด์ง€๋ฅผ ์™„์ „ํžˆ ๋ Œ๋”๋ง ๋œ ํŽ˜์ด์ง€๋กœ ๋ฐ”๊พผ๋‹ค.

โžฐ DB์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ๋ธŒ๋ผ์šฐ์ €๋Š” DB์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์›น ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋ง ํ•ด์•ผ ํ•˜๋ฏ€๋กœ Fetch์™€ ๊ฐ™์€ API ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

โžฐ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•œ ๊ฒฝ์šฐ, ์„œ๋ฒ„๊ฐ€ ์›น ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญํ•œ ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋ง ํ•œ๋‹ค. (๋™์ ์œผ๋กœ ๋ผ์šฐํŒ…์„ ๊ด€๋ฆฌํ•œ๋‹ค)

 

๐Ÿ“ฃ  SSR๊ณผ CSR์˜ ์ฐจ์ด์ 

SSR ์‚ฌ์šฉ CSR ์‚ฌ์šฉ
๏น’์„œ๋ฒ„์—์„œ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋ง ํ•œ๋‹ค.
๏น’SEO๊ฐ€ ์šฐ์„ ์ˆœ์œ„์ธ ๊ฒฝ์šฐ ์‚ฌ์šฉ
๏น’์›น ํŽ˜์ด์ง€์˜ ์ฒซ ํ™”๋ฉด ๋ Œ๋”๋ง์ด ๋นจ๋ผ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
๏น’๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ, ๋‰ด์š• ํƒ€์ž„์Šค  
๏น’ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์—์„œ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋ง ํ•œ๋‹ค.
๏น’SEO๊ฐ€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์‚ฌ์šฉ
๏น’์‚ฌ์ดํŠธ์— ํ’๋ถ€ํ•œ ์ƒํ˜ธ ์ž‘์šฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ
๏น’์•„๊ณ ๋‹ค ๊ฐ™์€ ์˜ˆ์•ฝ ์‚ฌ์ดํŠธ