JS Ajax A to Z - Imchaemin/snulion8th GitHub Wiki

JS / Ajax A๋ถ€ํ„ฐ Z๊นŒ์ง€



1. JS์˜ ์—ญ์‚ฌ ๐Ÿšถโ€โ™‚๏ธ๐Ÿšถ

20180410174619_ozpxguwq

Q. ?? ๋„น? ๊ฐ‘์ž๊ธฐ ์—ญ์‚ฌ์š”??

A. ๋ผ๋Š” ์งˆ๋ฌธ์„ ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ์ €๋ฒˆ ์„ธ์…˜์—์„œ ํ–ˆ๋˜ ajax ๋ฅผ ์ดํ•ดํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์™œ ํƒœ์–ด๋‚˜๊ฒŒ ๋˜์—ˆ๊ณ , ์ด๊ฒŒ ์–ด๋–ค ์˜ํ–ฅ์„ ์คฌ๋Š”์ง€ ์•Œ๋ฉด ๋” ํฅ๋ฏธ๋กญ๊ฒŒ ๋ฐ”๋ผ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์„œ ์ค€๋น„ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

1995๋…„, ๋‹น์‹œ ๋„ค์Šค์ผ€์ดํ”„์‚ฌ์˜ ๋„ค๋น„๊ฒŒ์ดํ„ฐ๊ฐ€ ์›น๋ธŒ๋ผ์šฐ์ € ์‹œ์žฅ์„ ์ง€๋ฐฐํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ๋„ค์Šค์ผ€์ดํ”„๋Š” HTMLํŽ˜์ด์ง€์— ๊ฒฝ๋Ÿ‰์˜ ํ”„๋กœ๊ทธ๋žจ ์–ธ์–ด๋ฅผ ํ†ตํ•˜์—ฌ ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒํ•œ ๊ฒƒ์„ ์ถ”๊ฐ€ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ธŒ๋žœ๋“  ์•„์ด์ž‘(Brendan Erich) ๋ฅผ ๊ณ ์šฉํ–ˆ๋‹ค., ๊ทธ๋Š” 10์ผ ๋งŒ์— ์–ธ์–ด (์‚ฌ๋žŒ ๋งž์•„..? ๐Ÿคข๐Ÿคฎ) ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทธ ์–ธ์–ด์˜ ์ด๋ฆ„์€ '๋ชจ์นด'์˜€๊ณ , 9์›” '๋ผ์ด๋ธŒ์Šคํฌ๋ฆฝํŠธ'๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค. ๊ทธํ•ด 12์›” ๋„ค์Šค์ผ€์ดํ”„์™€ ์ฌ์€ '๋ผ์ด๋ธŒ์Šคํฌ๋ฆฝํŠธ'๋ฅผ '์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ' ๋ผ๊ณ  ์ตœ์ข… ์ด๋ฆ„์„ ๊ฒฐ์ •ํ•˜์˜€๋‹ค. ์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋„ค๋น„๊ฒŒ์ดํ„ฐ 2.0B3์— ํฌํ•จ๋˜์—ˆ๋‹ค.


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์™œ "ECMAScript"๋ผ ๋ถˆ๋ฆฌ๊ฒŒ ๋˜์—ˆ๋‚˜?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•ด ๋“ค์–ด๋ดค๊ฑฐ๋‚˜, ๊ฒ€์ƒ‰ํ•ด๋ดค์œผ๋ฉด ES6 ๋ผ๋Š” ์šฉ์–ด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ES๊ฐ€ ๋ฐ”๋กœ ECMAScript์˜ ์•ฝ์–ด์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋‚˜์˜จ ์ดํ›„ , MS์‚ฌ๋Š” IE 3.0( 3.0..? )์—์„œ ๋™์ž‘ํ•˜๋Š” 'JSrcipt'๋ผ๋Š” ๋˜‘๊ฐ™์€ ์–ธ์–ด๋ฅผ ๋งŒ๋“ค์–ด ๋ƒˆ๋‹ค. ๊ทธ๋Ÿฌ์ž ๋„ท์Šค์ผ€์ดํ”„์‚ฌ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ‘œ์ค€ํ™” ํ•˜๊ธฐ ์œ„ํ•ด, ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ธ Ecma International์— ์š”์ฒญ์„ ํ–ˆ๋‹ค.

1996๋…„ 11์›”, ECMA-262 (์ง€๊ธˆ๋„ ์กด์žฌํ•˜๊ณ , ์ด๊ฑฐ ๋ณด๋ฉด JS ๋™์ž‘ ์›๋ฆฌ๋ฅผ ๋ชจ๋‘ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Œ)๋ผ ๋ถˆ๋ฆฌ๋Š” ๋ช…์„ธ์„œ์— ๋Œ€ํ•œ ์ž‘์—…์ด ์‹œ์ž‘ํ–ˆ๊ณ  ๊ทธ ๋ฒ„์ „์€ 1997๋…„ 7์›”์— ์™„์„ฑ๋˜์—ˆ๋‹ค. ๋‹น์‹œ Sun์‚ฌ๊ฐ€ 'JAVA' ๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์ƒํ‘œ ๋“ฑ๋ก์„ ํ•ด ๋†จ๊ธฐ์— 'JavaScript' ๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์—†์—ˆ๋‹ค.

๋”ฐ๋ผ์„œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋ฆ„์ด ๊ฒฐ์ •๋˜์—ˆ๋‹ค :

  • ํ‘œ์ค€ ์–ธ์–ด์˜ ์ด๋ฆ„์€ ECMAScript(a.k.a ES)
  • ๋Œ€์™ธ์ ์œผ๋กœ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋‚˜ J์Šคํฌ๋ฆฝํŠธ๋ผ๊ณ  ๋ถˆ๋ €๋‹ค. ๋‚˜์ค‘์—” ํ‘œ์ค€ ์ด๋‚˜ ๊ตฌํ˜„ ๋ชจ๋‘ 'JavaScript๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ถˆ๋ ธ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์—ญ์‚ฌ์ ์œผ๋กœ ์ค‘์š”ํ•œ ์‚ฌ๊ฑด

์ด ํŒŒํŠธ์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํƒ„์ƒ ์ดํ›„ ์–ด๋– ํ•œ ์ผ๋“ค์ด ์žˆ์—ˆ๋Š”์ง€ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

1997๋…„ ๋™์ ์ธ HTML ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ์ปจํ…์ธ ์™€ ์›นํŽ˜์ด์ง€์˜ ์™ธ๊ด€์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŽ˜์ด์ง€์˜ ๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ(DOM)์„ ๋‹ค๋ฃจ์–ด ์ปจํ…์ธ ์™€ ์Šคํƒ€์ผ์„ ๋ณ€ํ™”ํ•˜๊ณ , ์š”์†Œ๋ฅผ ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜ ์ˆจ๊ธฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ–ˆ๋‹ค.

1999๋…„ XMLHttpRequest ์ด API๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก ์Šคํฌ๋ฆฝํŠธ๋ฅผ http ๋˜๋Š” https๋กœ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญํ•˜๊ณ , ํ…์ŠคํŠธ ํ˜•์‹์œผ๋กœ(๋‹น์‹œ์—” xml, html / ์ง€๊ธˆ์€ json๋„ ๊ฐ€๋Šฅ) ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ–ˆ๋‹ค.

2001๋…„ JSON, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜ ํฌ๋งท 2001๋…„ ๋”๊ธ€๋ผ์Šค ํฌ๋ฝํฌ๋“œ(Douglas Crockford) ๋Š” ํ…์ŠคํŠธ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์„ 'JSON' ์ด๋ผ ์ด๋ฆ„ ๋ถ™์ด๊ณ  ๋ฌธ์„œํ™”ํ–ˆ๋‹ค. JSON์€ ๊ฐ์ฒด, ๋ฐฐ์—ด, ๋ฌธ์ž์—ด, ์ˆซ์ž๋“ค, ๋ถˆ๋ฆฐ ๋“ฑ์„ ๊ตฌ์กฐ์ ์ธ ๋ฐ์ดํ„ฐ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

{
  "firstName": "CHAEMIN",
  "lastName": "IM",
  "function": () => { console.log('function') },
  "array": ["foo", "bar"],
  "object": {
    "key": "value"
  }
}

์ง€๊ธˆ๋„ JSON์€ ๋งค์šฐ๋งค์šฐ๋งค์šฐ ๋งŽ์ด ์“ฐ์ด๋ฉฐ, ํŠนํžˆ API ํ†ต์‹ ์— ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

2005๋…„ Ajax ๐Ÿ˜€, ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜

Ajax์˜ ๋‘ ๊ฐ€์ง€ ์†์„ฑ

  • ์ปจํ…์ธ  ๋กœ๋”ฉ์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค. (XMLHttpRequest)
  • ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ฐ€์ง€๊ณ  ํ˜„์žฌ ํŽ˜์ด์ง€์—์„œ ๋™์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•œ๋‹ค.(dynamic HTML)

๋”ฐ๋ผ์„œ ๋งค๋ฒˆ ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋งŽ์€ ์‚ฌ์šฉ์„ฑ ๊ฐœ์„ ์ด ๋˜์—ˆ๋‹ค.

Ajax๋Š” ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์™€ ํ•จ๊ป˜ ๋™์  ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฃผ์š” ๋ŒํŒŒ๊ตฌ์˜€๋‹ค. Ajax๊ฐ€ ๋‚˜์˜จ ์ดํ›„, ์ด์ „๊ณผ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํ˜•์‹์ด ์ธ๊ธฐ๋ฅผ ์–ป๊ฒŒ ๋˜์—ˆ๊ณ (XML ๋Œ€์‹  JSON), ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ๋“ค์ด ์‚ฌ์šฉ๋˜๊ฒŒ ๋˜์—ˆ๊ณ (HTTP๋ฟ๋งŒ ์•„๋‹Œ ์›น ์†Œ์บฃ..), ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ๋˜ํ•œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

2006๋…„ jQuery, Dom์กฐ์ž‘์„ ๋„์™€์ฃผ๋‹ค. ๋ธŒ๋ผ์šฐ์ € DOM์€ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์›น ๊ฐœ๋ฐœ์—์„œ ๊ฐ€์žฅ ํž˜๋“  ๋ถ€๋ถ„์ด๋‹ค. jQuery๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ์ฐจ์ด๋ฅผ ๋„˜์–ด์„  ์ถ”์ƒํ™” (=๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž˜ ๋™์ž‘์„ ๋ณด์žฅ)์™€ DOM์˜ ์ฟผ๋ฆฌ ๋ฐ ์ˆ˜์ •์„ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ API๋ฅผ ์ œ๊ณตํ•˜์—ฌ DOM์กฐ์ž‘์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ ๋‹ค.

2008๋…„ V8, ๋” ๋นจ๋ผ์ง„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌ๊ธ€์ด ํฌ๋กฌ ์›น๋ธŒ๋ผ์šฐ์ €๋ฅผ ์†Œ๊ฐœํ–ˆ์„ ๋•Œ, ๋งŽ์€ ์žฅ์ ๋“ค ์ค‘ ํ•˜๋‚˜๋Š” V8์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋น ๋ฅธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด์—ˆ๋‹ค. ์ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋Š๋ฆฌ๋‹ค๋Š” ์ธ์‹์„ ๋ฐ”๊พธ๊ณ , ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ € ์ œ์กฐ์‚ฌ๋“ค๊ณผ์˜ ์†๋„ ๊ฒฝ์Ÿ์„ ์ด๋Œ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

... ๋‚˜๋จธ์ง„ ์ƒ๋žต ๐Ÿ˜Ž



2. JQuery ๋ฅผ ํ†ตํ•œ DOM ์กฐ์ž‘

๋‹ค๋“ค ์ €๋ฒˆ MDL / JS / Ajax ์„ธ์…˜์—์„œ JS (+ JQuery) ๋ฅผ ํ†ตํ•ด DOM ์กฐ์ž‘์„ ํ•ด๋ดค์„ ๊ฑฐ์—์š”.

์ €๋ฒˆ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ํ•˜๋‚˜ํ•˜๋‚˜ ์ดํ•ดํ•ด๋ณด๋Š” ์‹œ๊ฐ„์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์„œ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค~

๐Ÿ““ ์šฉ์–ด ์‚ฌ์ „ ๐Ÿ““

MDL : Material Design Lite - ๊ตฌ๊ธ€์˜ ๋””์ž์ธ ์ฒ ํ•™์„ ๋‹ด์•„์„œ ๋งŒ๋“  UI Library.

UI : User Interface - ํฐํŠธ, ์ปฌ๋Ÿฌ, ๋ ˆ์ด์•„์›ƒ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์ฃผํ•˜๊ฒŒ๋  ์‹œ๊ฐ์ ์ธ ๋””์ž์ธ.

Library : ํŠน์ • ๊ธฐ๋Šฅ๋“ค์„ ์†์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•ด๋†“์€ ๊ฒƒ๋“ค.

DOM : Document Object Model - ๊ฐ„๋‹จํ•˜๊ฒŒ ์ดํ•ดํ•˜์ž๋ฉด, ์›น ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋Š” ์š”์†Œ๋“ค(div, p, h1 ๋“ฑ๋“ฑ ํƒœ๊ทธ)๊ณผ ์ด ์š”์†Œ๋“ค์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ต์นญํ•ด์„œ DOM์ด๋ผ๊ณ  ํ•จ. (DOM์ด๋ž€?)


JQuery์˜ $ ๊ฐ€ ๋ญ์•ผ?

์•„๋ž˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ €๋ฒˆ์— ๋Œ“๊ธ€ ๊ฐ์ถ”๊ธฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ–ˆ๋˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

์ข€ ํŠน์ดํ•œ๊ฒŒ ์ € $ ํ‘œ์‹œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”๋ฐ ์ €๋งŒ ๊ทธ๋Ÿฐ๊ฑฐ ์•„๋‹ˆ์ ธ..? ์ €๊ฒŒ ๋ญ”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค.

$(document).ready(() => {
    $(".more-comment-btn").on('click', function(event) {
      $(this).toggleClass("showing-comment");
  
      if ($(this).hasClass("showing-comment")) {
        $(this).text("HIDE COMMENTS");
        $(this).parent().find(".toggle-comment").not(".last-comment").show();
      } else {
        $(this).text("MORE COMMENTS");
        $(this).parent().find(".toggle-comment").not(".last-comment").hide();
      }
    });
  }
)

$() ํ•จ์ˆ˜ ๐Ÿค‘

JQuery ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € JQuery ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ธฐ๋Šฅ๋“ค์€ JQuery ๊ฐ์ฒด์— ์žˆ๊ฑฐ๋“ ์š”.

๊ณ ๋Ÿผ JQuery ๊ฐ์ฒด๋Š” ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋ƒ! ๋ฐ”๋กœ ์•„๋ž˜ ๋‘ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  • jquery()
  • $()

์ด ๋‘ ํ•จ์ˆ˜๋Š” ์™„์ „ํžˆ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค. jquery() ๋ฅผ ๋‹ค ์“ฐ๊ธฐ์—” ๊ท€์ฐฎ์œผ๋‹ˆ๊นŒ ๊ทธ๋ƒฅ $() ๋ฅผ ์จ์„œ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฑฐ์ฃ .

$() ํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ selector ์™€ context ๋ฐฐ์—ด์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. (context ๋ฐฐ์—ด์€ ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ , optional ๊ฐ’์ž…๋‹ˆ๋‹ค.) selector๋Š” css selector ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

$('.toggle-comment') ๋ผ๊ณ  ์“ฐ๋ฉด .toggle-comment ๋ผ๋Š” class๋ฅผ ๊ฐ€์ง„ DOM ๊ฐ์ฒด๋ฅผ jquery ๊ฐ์ฒด๋กœ ๋งŒ๋“ค๊ฒŒ ๋˜๋Š”๊ฑฐ์ฃ ! ๋งŒ๋“  ํ›„์— jquery ์—์„œ ๋งŒ๋“ค์–ด ๋†“์€ ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•ด์„œ .toggle-comment class ๋ฅผ ๊ฐ€์ง„ DOM ๊ฐ์ฒด๋ฅผ ์†์‰ฝ๊ณ , ์ž์œ ๋กญ๊ฒŒ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ $()ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ์š”์†Œ๋ฅผ ์ œ์ด์ฟผ๋ฆฌ ๊ฐ์ฒด(jQuery Object)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.


Document ๊ฐ์ฒด์™€ ready() ํ•จ์ˆ˜

Document ๊ฐ์ฒด๋Š” ์›น ํŽ˜์ด์ง€ ๊ทธ ์ž์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์›น ํŽ˜์ด์ง€์— ์กด์žฌํ•˜๋Š” HTML ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ Document ๊ฐ์ฒด๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Document์—๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›ํ•˜๋Š” ๋งค์šฐ ๋งŽ์€ ๋นŒํŠธ์ธ ํ•จ์ˆ˜(built-in ํ•จ์ˆ˜) ๊ฐ€ ์กด์žฌํ•˜์ฃ . ์š”๋†ˆ์ด ์—†์œผ๋ฉด JS๋Š” ๋ฌด์“ธ๋ชจ ์ž…๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์œ„์— Document๊ฐ€ ์—†์œผ๋ฉด JS ๊ฐ€ ๋ฌด์“ธ๋ชจ๋ผ ํ–ˆ์ฃ ? ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—!! โš ๏ธ DOM์„ ์กฐ์ž‘ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ! ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋Š” ์›น๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฌธ์„œ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋กœ๋“œํ•œ ๋’ค์— ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. โš ๏ธ ์ €๋ฒˆ ์„ธ์…˜์—์„œ ์ œ๊ฐ€ <script ...></script> ์€ <body> ํƒœ๊ทธ ๋ฐ‘, ํ˜น์€ ๋ฌธ์„œ ์ œ์ผ์•„๋ž˜์— ๋„ฃ์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ–ˆ์ฃ ? ๊ทธ ์ด์œ ๊ฐ€ ๋ฐ”๋กœ ์ด๊ฒƒ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

DOM ์กฐ์ž‘ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹น

  1. ์•„์ง ์ƒ์„ฑ๋˜์ง€ ์•Š์€ HTML ์š”์†Œ์— ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•  ๊ฒฝ์šฐ
  2. ์•„์ง ๋กœ๋“œ๋˜์ง€ ์•Š์€ ์ด๋ฏธ์ง€, DOM์˜ ๋ ˆ์ด์•„์›ƒ ์ •๋ณด(ํฌ๊ธฐ, ์œ„์น˜ ๋“ฑ)๋ฅผ ์–ป์œผ๋ ค๊ณ  ํ•  ๊ฒฝ์šฐ

๊ทธ๋Ÿผ ์œ„์— ์žˆ๋Š” ์˜ค๋ฅ˜ ์—†์ด js๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•ด? ๋ผ๋Š” ์งˆ๋ฌธ์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๊ฒ ์ฃ ? ํ•ด๊ฒฐ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์•„์š”

  1. Js ํŒŒ์ผ์„ ๋ฌธ์„œ ๊ฐ€์žฅ ์•„๋ž˜์—์„œ ๋ถ€๋ฅธ๋‹ค!

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. <body> ํƒœ๊ทธ์˜ ๊ฐ€์žฅ ์•„๋ž˜์— ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. HTML์€ ์œ„์—์„œ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์ฝ๊ธฐ ๋•Œ๋ฌธ์— <script> ๋ฅผ ๊ฐ€์žฅ ์•„๋ž˜์— ๋†“๊ณ  js๋ฅผ ๋ถ€๋ฅด๋ฉด DOM์ด ๋ชจ๋‘ ๋งŒ๋“ค์–ด์ง€๊ณ  ๋‚œ ๋‹ค์Œ js๊ฐ€ ๋™์ž‘ํ•˜๊ฒ ์ฃ ?

  1. document๊ฐ€ ๋กœ๋“œ๋˜๊ณ  ๋‚œ ๋‹ค์Œ JS๊ฐ€ ๋™์ž‘ํ•˜๋„๋ก ๊ฐ•์ œํ•œ๋‹ค!

ํ•˜์ง€๋งŒ JS ๋กœ๋“œ ์‹œ์ ์„ ํ•ญ์ƒ ์ฒ ์ €ํ•˜๊ฒŒ ์ง€ํ‚ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ๋• document ๊ฐ์ฒด๊ฐ€ ๋กœ๋“œ ๋œ ๋‹ค์Œ js๋ฅผ ์‹คํ–‰์‹œํ‚ค๋„๋ก ๊ฐ•์ œํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด์š”!

(์ƒค์‹ค document๋ณด๋‹ค ์ƒ์œ„์— window ๊ฐ์ฒด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค) window.onload ๋Š” document ๊ฐ€ ๋ชจ๋‘ ๋กœ๋“œ๋˜๊ณ  ๋‚œ ๋‹ค์Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ๊ฑธ ์ด๋ฒคํŠธ ํ•จ์ˆ˜(event function) ๋ผ๊ณ  ํ•˜๋Š”๋ฐ, click ์ฒ˜๋Ÿผ ์–ด๋–ค ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์žˆ๊ณ , ํ•ด๋‹น ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ๋™์ž‘ํ•  ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด window.onload ๋Š” document ๊ฐ์ฒด๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋กœ๋“œ ๋˜๋ฉด (= DOM ์ด ์ •์ƒ์ ์œผ๋กœ ์ƒ์…ฉ๋˜๋ฉด! ) ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ง˜ํŽธํžˆ JS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ฐ”๋‹๋ผ js์™€ jquery ๊ฐ€ ํ˜•์‹์€ ์ชผ์˜ค๊ธˆ ๋‹ค๋ฅด์ง€๋งŒ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค!

  • ๋ฐ”๋‹๋ผ JS๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ
window.onload = function(){
	// do something
};
 
  • jQurey๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ
$(document).ready(function() {
	// do something with jquery
});

JQuery ๋กœ ํด๋ฆญ๐Ÿ–ฑ๏ธ ์ด๋ฒคํŠธ ๋งŒ๋“ค๊ธฐ

๋‹ค์‹œ ์šฐ๋ฆฌ๊ฐ€ ์งฐ๋˜ ์ฝ”๋“œ๋กœ ์™€๋ด…์‹œ๋‹ค.

$(document).ready(() => {
    $(".more-comment-btn").on('click', function(event) {
      $(this).toggleClass("showing-comment");
  
      if ($(this).hasClass("showing-comment")) {
        $(this).text("HIDE COMMENTS");
        $(this).parent().find(".toggle-comment").not(".last-comment").show();
      } else {
        $(this).text("MORE COMMENTS");
        $(this).parent().find(".toggle-comment").not(".last-comment").hide();
      }
    });
  }
)

์ด์ œ ๋ญ”๊ฐ€ ์ข€ ์ดํ•ด๊ฐ€ ๋ ๊ฑฐ๋ผ ๋ฏฟ์–ด์š”.

  • $() ๋ฅผ ํ†ตํ•ด jquery ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์šฐ๋ฆฌ๊ฐ€ ์“ฐ๊ณ  ์‹ถ์€ ๊ธฐ๋Šฅ๋“ค์„ ์“ฐ๊ณ ์ž ํ•œ๋‹ค
  • $(document).ready(() => {...}) ๋ฅผ ํ†ตํ•ด document ๊ฐ์ฒด๊ฐ€ ๋กœ๋“œ๋˜๊ณ  ๋‚œ ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ ค ํ•จ! ๋•๋ถ„์— DOM ์กฐ์ž‘์— ์žˆ์–ด์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ์ผ์ด ์—†์›€

๋งž์ฃ ? ๋งž๋‹ค๊ณ  ๋งํ•ด

์ž ์šฐ๋ฆฌ๋Š” '๋Œ“๊ธ€ ๋”๋ณด๊ธฐ' ๋ฒ„ํŠผ์„ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋™์ž‘์„ ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

  • ๋Œ“๊ธ€ ๋”๋ณด๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๊ฒฝ์šฐ
    • ๋ฒ„ํŠผ ํ…์ŠคํŠธ๋ฅผ 'HIDE COMMENTS' ๋กœ ์ˆ˜์ • - ๋Œ“๊ธ€์„ ๋‹ค ๋ณด์—ฌ์คฌ์œผ๋‹ˆ ์ด์   ์ˆจ๊ธฐ๋Š” ๋ฒ„ํŠผ์œผ๋กœ Change~
    • .last-comment ๊ฐ€ ์•„๋‹Œ ๋Œ“๊ธ€๋“ค์„ ๋ณด์—ฌ์ง€๊ฒŒ ๋งŒ๋“ฆ!
  • ๋Œ“๊ธ€ ์ˆจ๊ธฐ๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๊ฒฝ์šฐ
    • ๋ฒ„ํŠผ ํ…์ŠคํŠธ๋ฅผ 'MORE COMMENTS' ๋กœ ์ˆ˜์ • - ๋Œ“๊ธ€์„ ์ˆจ๊ฒผ์œผ๋‹ˆ ์ด์   ๋ณด์—ฌ์ฃผ๋Š” ๋ฒ„ํŠผ์œผ๋กœ Change~
    • .last-comment ๋งŒ ๋ณด์—ฌ์ง€๊ณ  ๋‚˜๋จธ์ง€ .toggle-comment ๋“ค์€ ๋ชจ๋‘ ์ˆจ๊น€!

์—ฌ๊ธฐ๊นŒ์ง€ ์ดํ•ด๋˜์‹œ์ฃ ?

๊ทธ๋Ÿผ ์ € ์ฝ”๋“œ์—์„œ ์œ„ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ๋˜ ํ•จ์ˆ˜๋“ค์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋œฏ์–ด๋ด…์‹œ๋‹ค


.on('click', () => {...})

jquery์—์„œ on ์€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ถ™์ด๋Š” ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ด ๋”ฑ ์˜ค์‹œ๋Š” ๋ถ„๋„ ์žˆ๊ฒ ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๋ถ„๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ.

์šฐ์„  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋ž€ ํŠน์ • ์ด๋ฒคํŠธ, ์˜ˆ๋ฅผ ๋“ค์–ด 'click', 'scroll', 'load', 'keypress' ๋“ฑ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹คํ–‰์‹œํ‚ค๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ง๊ทธ๋Œ€๋กœ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•ธ๋“ค๋ง ํ•˜๋Š” ์—ญํ• ์ด์ฃ .

.on() ํ•จ์ˆ˜๋Š” 2๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

  • EventType
    • e.g) click, load, keypress ...
  • Callback Function

์šฐ๋ฆฌ๊ฐ€ ์œ„์—์„œ ์‚ฌ์šฉํ–ˆ๋˜๊ฑด ๊ทธ๋Ÿผ ๋ญ˜๊นŒ์š”? ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด function(event) ๋ถ€๋ถ„์„ ์‹คํ–‰ํ•˜๋ผ๋Š” ๊ฑฐ๊ฒ ์ฃ ?

๋ง‰๊ฐ„ Question! ์–ด๋–ค๊ฑธ ๋ˆŒ๋Ÿฌ์•ผ ์ด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ž‘ํ• ๊นŒ์š”??? ์ •๋‹ต์€.. ์•Œ๊ณ  ๊ณ„์‹œ๊ฒ ์ง€๋งŒ $(".more-comment-btn") ๊ฐ์ฒด๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.


$(this)

JS ์—์„œ this๋ž€ ... ๋งค์šฐ๋งค์šฐ.. ๋งค์šฐ...์•„์ฃผ... ์—„์ฒญ ๊ดด๋ž„ํ•˜๊ณ  ์ด์ƒํ•˜๊ณ  ๊ทนํ˜์ด๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์„ค๋ช…ํ•˜์ž๋ฉด ํ•˜๋ฃจ ๋‹ค ์“ธ ์ˆ˜ ์žˆ์„์ •๋„๋กœ ๊ทนํ˜์ด๋‹ˆ, ์—ฌ๊ธฐ์„  ๊ทธ๋ƒฅ $(".more-comment-btn") ๊ฐ์ฒด ๊ฐ๊ฐ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์„ธ์šฉ.

๋‹จ '๊ฐ๊ฐ' ์ด๋ผ๋Š” ์ ์— ์ฃผ๋ชฉํ•˜์…”์•ผ ํ•˜๋Š”๋ฐ, $(".more-comment-btn") ๋Š” ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ž–์•„์š”? .more-comment-btn ์ด ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ์š”! ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์„œ $(this) ๋Š” ๋”ฑ! ํด๋ฆญํ•œ ๊ทธ๋†ˆ! ๊ทธ ๊ฐ์ฒด! ๋งŒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๋ƒฅ ๊ทธ๋ ‡๊ฒŒ ์•Œ์•„๋‘์„ธ์š”!~!


.toggleClass()

ClassName์„ ๋ถ™์˜€๋‹ค ๋–ผ์—ˆ๋‹ค ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค! ๋ณดํ†ต click ์ด๋ฒคํŠธ๋ž‘ ์ž˜ ์—ฎ์—ฌ์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„  $(".more-comment-btn") ์— .showing-comment class ๋ฅผ ๋ถ™์˜€๋‹ค ๋–ผ์—ˆ๋‹ค ํ•˜๊ฒ ๋„ค์š”!


.hasClass()

ํ•ด๋‹น class ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. true / false ๊ฐ’์„ ๋ฆฌํ„ดํ•˜์ ธ


.text()

DOM ์˜ ํ…์ŠคํŠธ๋ฅผ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค. <p>this is p tag</p> ์— $('p').text('No this is div') ๋ฅผ ์ ์šฉํ•˜๋ฉด<p>No this is div</p> ๊ฐ€ ๋˜๊ฒ ์ฃ ?


.parent()

๋ถ€๋ชจ DOM์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.


.find()

Css selector ๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋ฐ, ์ž์‹ DOM ์ค‘์—์„œ selector์— ๋ถ€ํ•ฉํ•˜๋Š” jquery ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.


.not()

์—ญ์‹œ Css selector ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์ง€๋งŒ, ์ž์‹ DOM ์ค‘์—์„œ ํ•ด๋‹น selector๊ฐ€ ์—†๋Š” jquery ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.


.hide() / .show()

์ˆจ๊ธฐ๊ณ  ๋ณด์—ฌ์ค๋‹ˆ๋‹น!

์™€! ์—ฌ๊ธฐ๊นŒ์ง€ ํ–ˆ์œผ๋ฉด AJAX๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‹ค๋“ค jquery ์‹ค๋ฒ„๋Š” ๋˜์…จ์Šต๋‹ˆ๋‹ค. ์•„์ง ๊ทธ๋žœ๋“œ ๋งˆ์Šคํ„ฐ๊นŒ์ง„ ๋จผ ๊ธธ์ด ๋‚จ์•„์žˆ์ง€๋งŒ, ์‹ค๋ฒ„๊ฐ€ ๋ฐ˜์ด๋ž€ ์†๋‹ด๋„ ์žˆ์ž–์•„์š”? ๋ฒŒ์จ ๋ฐ˜ ์™”์–ด์š”!



AJAX

Ajax ์ด๋ก ์€ ์–ด๋Š์ •๋„ ํŒŒ์•…ํ•˜์…จ์„ ๊ฑฐ๋ผ ๋ฏฟ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ํ˜น์‹œ ๋ชฐ๋ผ ๊ฐ„๋‹จํžˆ ๊ทธ๋ฆผ๊ณผ ํ•จ๊ผ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค


Django ์—์„œ ์„œ๋ฒ„ํ†ต์‹ 

์—ฌ๋Ÿฌ๋ถ„ ์žฅ๊ณ ๋Š” ํ”„๋ก ํŠธ์•ค๋“œ, ๋ฐฑ์—”๋“œ๊ฐ€ ํ•จ๊ป˜์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

req_res

์œ„์— ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ, ์šฐ๋ฆฌ๋Š” ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด ์žฅ๊ณ  ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, ์žฅ๊ณ ๋Š” HTML๋ฅผ ์‘๋‹ต์œผ๋กœ ์ฃผ๊ณ , ์šฐ๋ฆฌ๋Š” ๋ฐ›์€ HTML๋กœ ํ…œํ”Œ๋ฆฟ์„ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. HTML์„ ๋ฐ›๋Š”๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•˜์„ธ์š”. ์šฐ๋ฆฌ๋Š” ์žฅ๊ณ  ๋ทฐ์—์„œ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•œ ๋‹ค์Œ render() ํ•จ์ˆ˜ ๋˜๋Š” redirect() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ํ…œํ”Œ๋ฆฟ์„ ๋ณด์—ฌ์ฃผ๊ณ , ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๊ณ  ์žˆ์—ˆ์ฃ ? ์ด๋ ‡๊ฒŒ HTML์„ ํ†ต์œผ๋กœ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ์ƒˆ๋กœ๊ณ ์นจ์ด ๋œ๋‹ค๋Š” ํ•„์—ฐ์ ์ธ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. (๋‹ค๋งŒ! ์ค ๋ผ ๋น ๋ฅด๊ณ  ๊ฒ€์ƒ‰์—”์ง„์— ์ตœ์ ํ™” ๋˜์–ด์žˆ๋‹ค๋Š” ์žฅ์ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.)


AJAX

Ajax๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?? ajax ํ†ต์‹ ์— ๋Œ€ํ•ด ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ฐ‘์—์„œ ๋” ์„ค๋ช…๋“œ๋ฆด๊ฒŒ์š”. ์šฐ์„  ์ „์ฒด์ ์ธ ํ๋ฆ„๋งŒ ๋ณด๋ฉด ajax๋Š” JSON ๊ฐ์ฒด๋ฅผ ์‘๋‹ต์œผ๋กœ ๋ฐ›๊ณ  JS๋ฅผ ํ†ตํ•ด DOM์„ ๋™์ ์œผ๋กœ ์กฐ์ž‘ํ•ด์„œ ํ™”๋ฉด์„ ์ˆ˜์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. JS๋ฅผ ํ†ตํ•ด ๋™์ ์œผ๋กœ ํ™”๋ฉด์„ ์ˆ˜์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ๊ณ ์นจ์ด ์—†์ฃ !! ์™œ๋ƒ? JS๋Š” ๊ทธ๋ƒฅ ๊ทธ๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์กŒ์–ด์š”... ๋‹ค๋ฅธ ์ž‘์—…์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์–ด๋–ค ์ผ์„ ํ•  ์ˆ˜ ์žˆ์–ด์šฉ..

์•„ ๋ฌผ๋ก ..! Ajax ํ†ต์‹ ๋„ XML, HTML ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HTML์„ ๋ฐ›์•„๋„ JS๋ฅผ ํ†ตํ•ด ๋ฐ›์€ HTML ๋ถ€๋ถ„๋งŒ ๊ฐˆ์•„๋ผ์šฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค๋งŒ, ์ง€๊ธˆ์€ ๊ฑฐ์˜ ์•ˆ ์“ฐ์ด์ฃ ..

์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด์‹œ๋ฉด ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„๊ฑฐ์—์š”.

Traditional REQ/RES AJAX REQ/RES
traditional-webpage-lifecycle ajax-webpage-lifecycle

์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜์ฅฌ? ๋‹ค๋ฅธ๊ฑด ๋ญ๋ƒ? AJAX Request ๋ฅผ ๋ณด๋‚ธ๋‹ค๋Š” ๊ฒƒ๊ณผ, JSON Response ๋ฅผ ๋ฐ›๋Š”๋‹ค๋Š” ์  ๋ฟ์ด์ฃ 


AJAX๋กœ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ๋Œ“๊ธ€ ์ถ”๊ฐ€ํ•ด๋ณด๊ธฐ

์ž ์ด์ œ ์‹ค์Šต์‹œ๊ฐ„์— ํ–ˆ๋˜ ๋‚ด์šฉ์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ถ„์„ํ•ด ๋ด…์‹œ๋‹ค.


JQuery์˜ ajax ํ•จ์ˆ˜๋ถ€ํ„ฐ ์ดํ•ดํ•˜์ž

$.ajax({
  type: '', // ํ†ต์‹  ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. HTTP Method
  url: ``, // api ํ†ต์‹ ์„ ํ•  pathname์ž…๋‹ˆ๋‹ค. 
  data: { 
    // ajax ํ†ต์‹ ์„ ์œ„ํ•ด ์„œ๋ฒ„์— ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐ์ดํ„ฐ ์ž…๋‹ˆ๋‹ค.
    // ์˜ˆ๋ฅผ ๋“ค์–ด, feed ์— comment๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด, feed id ์™€, comment ๋‚ด์šฉ์ด ์žˆ๊ฒ ์ฃ ?
  },
  dataType: 'json',
  success: function(response) { 
    // ajax ํ†ต์‹ ์ด ์„ฑ๊ณตํ•˜๋ฉด ์‹คํ–‰๋จ.
  },
  error: function(response, status, error) {
    // ajax ํ†ต์‹  ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹คํ–‰๋จ
  },
  complete: function(response) {
    // ajax ํ†ต์‹ ์ด ๋๋‚˜๊ณ , ์„ฑ๊ณต / ์‹คํŒจ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ์‹คํ–‰๋จ.
  },
});
  • $.ajax
    • ์ž $ ๋Š” jquery์˜ ์ „์—ญ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ „์—ญ๊ฐ์ฒด.. ์ด๋ฆ„๋งŒ ๋“ค์œผ๋ฉด ์–ด๋ ค์›Œ ๋ณด์ด์ง€๋งŒ, ๊ทธ๋ƒฅ jqeury๊ฐ€ ์ง€๋‹Œ ๋ชจ๋“  ๋ณ€์ˆ˜, ํ•จ์ˆ˜๋“ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ajax ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋˜์–ด์žˆ๊ณ  ์šฐ๋ฆฌ๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
  • $.ajax({ ... })
    • ์œ„์— ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ํ•จ์ˆ˜์—๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์ฌฌ? JS๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ Object ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ajax ํ•จ์ˆ˜๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ์—ฌ๋Ÿฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ key-value ๊ฐ’์œผ๋กœ ํ•ด์„œ ๋„ฃ์–ด์ฃผ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์ฃ 

AJAX๋ฅผ ์œ„ํ•ด ๋ญ˜ ๋ฐ”๊ฟ”์•ผ ํ•ด?

์ž ๊ทธ๋ž˜์„œ ์šฐ๋ฆฐ Ajax ํ†ต์‹ ์„ ์œ„ํ•ด ์–ด๋–ค ํŒŒ์ผ, ์–ด๋–ค ์ฝ”๋“œ๋“ค์„ ์ˆ˜์ •์„ ํ•ด์•ผํ• ๊นŒ์š”? ๋”ฑ ์ •๋ฆฌํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ์žฅ๊ณ  ํ”„๋กœ์ ํŠธ์—์„  ๋”ฑ ํŒŒ์ผ 3๊ฐœ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • HTML

    • ajax๋Š” JS๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ! ์šฐ๋ฆฌ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๋ ค๋Š” ์ฃผ์†Œ๊ฐ€ fid ์ฒ˜๋Ÿผ ์žฅ๊ณ  ๋ทฐ๋กœ๋ถ€ํ„ฐ ๋ฐ›๋Š” ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋ฉด? /feeds/<int:fid>/comments/ ๊ฐ™์€ ํ˜•ํƒœ๋ผ๋ฉด? ํ˜น์€ ๋ณด๋‚ด๋ ค๋Š” ๋ฐ์ดํ„ฐ์— fid ๊ฐ™์€ ์žฅ๊ณ  ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด? ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ด fid ๊ฐ€ ๋ญ”์ง€ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ์—ฌ?? ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜์ฃ ? ์•Œ๊ฒŒ ํ•ด์•ผ์ฃ !!
    • HTML Data ์†์„ฑ ์ด๋ž€๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด HTML์— ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฌธ๋ฒ•์ด์ฃ . JS๋Š” DOM์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ, ์—ฌ๊ธฐ์— ์ €์žฅ๋œ ์ •๋ณด๋ฅผ JS๋Š” ๊ฐ€์ ธ๋‹ค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ณ ๋ž˜์„œ! ์š”์ฒญ์— ํ•„์š”ํ•œ ๋ณ€์ˆ˜์ •๋ณด๋“ค์€ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์„œ JS๊ฐ€ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • myjs.js

    • Ajaxํ†ต์‹ ์„ ํ•  js ํŒŒ์ผ
  • view.py

    • ํ†ต์‹ ์„ ํ•  API ์— ๋Œ€ํ•œ view.py ์ฝ”๋“œ
    • response๋งŒ JSON์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค

AJAX๋ฅผ ์œ„ํ•ด ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ”์•ผ ํ•ด?

์ž ์žฅ๊ณ ์—์„  ๋”ฑ 3๊ฐœ ํŒŒ์ผ๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ง‰์ƒ ๊ตฌํ˜„ํ•˜๋ ค ํ•˜๋ฉด, ๋ง‰๋ง‰ํ•˜์ฃ .. ๋ฐ”๊พธ๋ฉด ๋˜๋Š” ํŒŒ์ผ์€ ์•Œ๊ฒ ์ง€๋งŒ ๋ญ˜ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์ฃ ? ๊ทธ๋ž˜์„œ ์ข€ ๋” ์ž์„ธํ•œ Flow ๋ฅผ ์ •๋ฆฌํ•ด ๋“œ๋ฆฌ๋ ค ํ•ฉ๋‹ˆ๋‹ค.

  1. HTML์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ data- ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฃผ์ž…ํ•ด์ฃผ๊ธฐ

    • data-fid : ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ํ•„์š”ํ•œ feed์˜ id
    • data-csrfmiddlewaretoken : POST ์š”์ฒญ์„ ๋ณด๋‚ผ๋• ๋ฐ˜๋“œ์‹œ csrf ํ† ํฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋™์•ˆ์€ ํผํƒœ๊ทธ ๋ฐ‘์— {% csrf_token %} ๋ฅผ ๋„ฃ์Œ์œผ๋กœ์จ ์žฅ๊ณ ๊ฐ€ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•ด์คฌ์ง€๋งŒ, ajax๋ฅผ ์œ„ํ•ด์„  ์ €ํฌ๊ฐ€ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•˜๋ฏ€๋กœ ์š”๊ฒƒ๋„ ๊ฐ™์ด ๋ณด๋‚ด์ค๋‹ˆ๋‹ค. (GET ์š”์ฒญ์—๋Š” ํ•„์š”์—†์Šด๋‹ˆ๋‹ค)
    <!-- feepage/templates/feedpage/index.html -->
    <form action="/feeds/{{ feed.id }}/comments/" method="POST" class="comment-submit" data-fid="{{ feed.id }}" data-csrfmiddlewaretoken="{{ csrf_token }}">
      {% csrf_token %}
    	<!-- ... some HTML -->
    </form>
  2. myjs.js ํŒŒ์ผ์— ajax ์ฝ”๋“œ ์ถ”๊ฐ€

    ์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€ํ•ด์ค˜์•ผํ•  ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ณจ์ž์ž…๋‹ˆ๋‹ค. ๋จผ์ € ajax ํ†ต์‹ ์„ ๋ฐœ์ƒ์‹œํ‚ฌ ์ด๋ฒคํŠธ๋ฅผ ๊ฑธ๊ณ , ํ•ด๋‹น ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ(์ฝœ๋ฐฑํ•จ์ˆ˜)์— ajaxํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒ๋‹ˆ๋‹ค.

    $('selector').sumbit((event) => {
        event.preventDefault();
        $.ajax({
            type: 'GET' | 'POST' | 'PATCH' | 'DELETE',
            url: `API_PATH`, 
            data: { 
            },
            dataType: 'json',
            success: function(response) {},
            error: function(response, status, error) {},
            complete: function(response) {},
        });
    });
  3. ajax ๋‚ด์šฉ๋ฌผ์„ ์ฑ„์›Œ์ค์‹œ๋‹ค

    $('.comment-submit').submit((event) => {
     	  event.preventDefault();
      
        const $this = $(event.currentTarget);	// .comment-submit ๊ฐ์ฒด
        const fid = $this.data('fid');	// ์•ž์„œ data-fid ๋กœ ๋„ฃ์–ด์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ ‡๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
        const csrfmiddlewaretoken = $this.data('csrfmiddlewaretoken'); // ์•ž์„œ data-csrfmiddlewaretoken ๋กœ ๋„ฃ์–ด์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ ‡๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    
        $.ajax({
            type: 'POST',
            url: `/feeds/${fid}/comments`,  // ``์„ ์‚ฌ์šฉํ•˜๋ฉด js๋ณ€์ˆ˜๋ฅผ ํŽธํ•˜๊ฒŒ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
            data: { 
              // data์— ๋“ค์–ด๊ฐˆ ๋‚ด์šฉ์€, comments๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋‚ด์šฉ๋“ค์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ view.py์—์„œ create_comment ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ๋•Œ ํ•„์š”ํ•œ ์ •๋ณด๋“ค์ด์ฃ 
              fid: fid,
              csrfmiddlewaretoken: csrfmiddlewaretoken,
              content: $(`input#${fid}[name=content]`).val(), // ์—ฌ๊ธฐ๊ฐ€ ๋Œ“๊ธ€์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.
            },	
            dataType: 'json', // json ํƒ€์ž…์œผ๋กœ ํ†ต์‹ ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๊ฑ ๋†”๋‘๋ฉด ๋ฉ๋‹ˆ๋‹ค.
            success: function(response) {}, // ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜
            error: function(response, status, error) {}, // ์‹คํŒจํ–ˆ์„ ๋–„ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜
            complete: function(response) {}, // ajax ํ†ต์‹ ์ด ๋๋‚˜๋ฉด ํ•ญ์ƒ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜
        });
    });
  4. View.py๋ฅผ ์ˆ˜์ •ํ•ด์ค์‹œ๋‹ค.

    ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. response๋งŒ JSON์œผ๋กœ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    # feedpage/views.py
    
    from django.http import JsonResponse # ์ถ”๊ฐ€
    ...
    
    def create_comment(request,id):
        content = request.POST['content']
        FeedComment.objects.create(feed_id=id, content=content, author=request.user)
        new_comment = FeedComment.objects.latest('id')
    
        context = {
            'id': new_comment.id,
            'username': new_comment.author.username,
            'content': new_comment.content,
        } # ํ”„๋ก ํŠธ๋กœ ์ „๋‹ฌํ•ด์ฃผ๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ๋“ค
    
        return JsonResponse(context)
  5. ajax๊ฐ€ ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ๋ญ˜ ํ• ์ง€ ์ •ํ•ด์ค๋‹ˆ๋‹ค.

    ajax๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ๋ญ˜ ํ•ด์ค˜์•ผ ํ• ๊นŒ์š”? ์šฐ์„  3๋ฒˆ๊นŒ์ง€ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํ†ต์‹ ์ด ์„ฑ๊ณตํ•˜๋ฉด ์žฅ๊ณ  ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ context ๋ฅผ ๋ฐ›์„ ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋ฐ›์€ context ๋ฐ์ดํ„ฐ๋“ค (id, username, content) ์„ JS๋ฅผ ํ†ตํ•ด ๋Œ“๊ธ€๋กœ ๋งŒ๋“ค๊ณ , ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, DOM ์กฐ์ž‘์„ ํ•˜๋Š”๊ฒƒ์ด์ฃ 

    $('.comment-submit').submit((event) => {
        event.preventDefault();
      
        const $this = $(event.currentTarget);	
        const fid = $this.data('fid');
        const csrfmiddlewaretoken = $this.data('csrfmiddlewaretoken'); 
    
        $.ajax({
            type: 'POST',
            url: `/feeds/${fid}/comments`,
            data: { 
              fid: fid,
              csrfmiddlewaretoken: csrfmiddlewaretoken,
              content: $(`input#${fid}[name=content]`).val(),
            },
            dataType: 'json',
            success: function(response) {
    	       // function(response) ... ๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์žฅ๊ณ ์„œ๋ฒ„์—์„œ ๋ณด๋‚ด์ฃผ๋Š” context๋Š” response๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐ›์•„์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
                // ์ด response ์ด๋ฆ„์€ ์ž์œ ๋กญ๊ฒŒ ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ์ˆ˜์ •ํ•˜๋“  context ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ฒจ์ ธ ์˜ต๋‹ˆ๋‹ค.
              
                // ๋ฐ›์€ response ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์ƒˆ๋กœ์šด ๋Œ“๊ธ€ DOM์„ ๋งŒ๋“ค์–ด ์ค์‹œ๋‹ค. ์—ฌ๊ธฐ๋Š” feedpage์— ์žˆ๋Š” html์„ ์ฐธ๊ณ ํ•ด์„œ ๋งŒ๋“ค์–ด ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค
                const str = `
                    <div class="toggle-comment last-comment">
                        <p>${response.username}: ${response.content}</p>
                        <form action="/feeds/${fid}/comments/${response.id}/" method="POST">
                        <input type="hidden" name="csrfmiddlewaretoken" value=${csrfmiddlewaretoken}>
                        <button class="mdl-button mdl-js-button mdl-button--icon">
                            <i class="material-icons">clear</i>
                        </button>
                        </form>
                    </div>
                `;
    
                // ์šฐ๋ฆฌ๊ฐ€ ๋”๋ณด๊ธฐ ๋ฒ„ํŠผ์„ ํ†ตํ•ด ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋Œ“๊ธ€๋งŒ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์—ˆ์ฃ ? ๊ทธ๋Ÿฐ๋ฐ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๋Œ“๊ธ€์ด ์ƒ๊ฒผ์–ด์š”. 
    	       // ๊ทธ๋Ÿฌ๋ฉด ๊ธฐ์กด์— .last-comment๋Š” ๋”์ด์ƒ last-comment๊ฐ€ ์•„๋‹ˆ๊ฒŒ ๋˜๊ณ , ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜๋Š” ๋Œ“๊ธ€์ด last-comment๊ฐ€ ๋˜๊ฒ ์ฃ ?
                // ๊ทธ๋Ÿฐ๋ฐ ์œ„์— ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋Œ“๊ธ€ DOM์„ ๋ณด๋‹ˆ ์ด๋ฏธ last-comment class๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋„ค์š”?
                // ๊ทธ๋Ÿผ ์šฐ๋ฆฌ๋Š” ๊ธฐ์กด์— ์žˆ๋˜ last-comment์— .last-comment class๋งŒ ์ง€์›Œ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
                // ๊ทธ ๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๊ฒ๋‹ˆ๋‹ค.
                const $commentBtn = $this.siblings('.more-comment-btn');
                const $lastComment = $this.siblings('.last-comment');
    
                // ๋งŒ์•ฝ ์ง€๊ธˆ ์ƒํƒœ๊ฐ€ ๋Œ“๊ธ€์„ ๋‹ค ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค๋ฉด, .last-comment class ๋งŒ ์ œ๊ฑฐ!
                // ๋งŒ์•ฝ ์ง€๊ธˆ ์ƒํƒœ๊ฐ€ ๋Œ“๊ธ€์„ ์ˆจ๊ธฐ๊ณ  ์žˆ๋‹ค๋ฉด, .last-comment class ์ œ๊ฑฐํ•จ๊ณผ ๋™์‹œ์— ์ˆจ๊ฒจ์ค˜์•ผ๊ฒ ์ฃ ?
                if ($commentBtn.hasClass('showing-comment')) {
                    $lastComment.removeClass('last-comment');
                } else {
                    $lastComment.removeClass('last-comment').hide();
                }
    
                // ๋งŒ๋“  ๋Œ“๊ธ€์„ ์ฃผ์ž…ํ•ด์ค์‹œ๋‹ค
                $(str).insertBefore($this);
              
                // ๊ทธ๋ฆฌ๊ณ  ๋Œ“๊ธ€ ์ž…๋ ฅ์ฐฝ์„ ๋น„์›Œ์ค์‹œ๋‹ค
                $(`input#${fid}[name=content]`).val('');
            },
            error: function(response, status, error) {},
            complete: function(response) {},
        });
    });
  6. ๊ฟ‘!

๊ณ ์ƒ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ๋“œ๋””์–ด ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ๋Œ“๊ธ€์„ ๋‹ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค~!~! ๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘


AJAX. ๊ทธ๋ž˜์„œ ์ง€๊ธˆ์€ ์•ˆ ์“ฐ๋Š”๋ฐ ์™œ ๋ฐฐ์›Œ?

๋„ค ์‚ฌ์‹ค๋Œ€๋กœ ๋งํ•˜๋ฉด ํ˜„์žฌ๋Š” ์ €๋ ‡๊ฒŒ jquery๋ฅผ ์‚ฌ์šฉํ•ด์„œ Ajax ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒ๊ตฌ์š”? ์š”์ฆ˜์€ ํ”„๋ก ํŠธ์•ค๋“œ๋Š” ํ”„๋ก ํŠธ์•ค๋“œ, ๋ฐฑ์•ค๋“œ๋Š” ๋ฐฑ์•ค๋“œ ๊ฐ๊ฐ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœํ•˜๊ฑฐ๋“ ์š”. ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ํ”„๋ก ํŠธ์•ค๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ๋Š” ๋ฆฌ์•กํŠธ(react) ๊ฐ€ ์žˆ๋Š”๋ฐ, ๋ฆฌ์•กํŠธ๋Š” ๋†€๋ž๊ฒŒ๋„ ajax๋ฅผ ์‹ ๊ฒฝ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ต๋‹ˆ๋‹ค!

๊ทธ๋Ÿฐ๋ฐ ์™œ ๋ฐฐ์›Œ์•ผํ• ๊นŒ? ๋Š” ์˜๋ฌธ์ด ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์—ฌ๊ธฐ๋ถ€ํ„ด ์ œ ๊ฐœ์ธ์ ์ธ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค)

Ajax๋Š” API ํ†ต์‹ ์˜ ์ƒˆ๋กœ์šด ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์›ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ์ฃผ๊ณ ๋ฐ›๊ฑฐ๋‚˜ ํ˜น์€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์ฃผ๊ณ ๋ฐ›๋Š” ํ˜•ํƒœ๋กœ ๋ง์ด์ฃ .

์ด์   ํ”„๋ก ํŠธ์•ค๋“œ์™€ ๋ฐฑ์•ค๋“œ๊ฐ€ ์™„์ „ ๋ถ„๋ฆฌ๋˜์–ด ํ”„๋ก ํŠธ์•ค๋“œ๋Š” ํ”„๋ก ํŠธ์•ค๋“œ ์„œ๋ฒ„๋ฅผ ๊ฐ€์ง€๊ณ , ๋ฐฑ์•ค๋“œ๋Š” ๋ฐฑ์•ค๋“œ ์„œ๋ฒ„๋ฅผ ๊ฐ€์ง€๊ณ  ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋ง์ด์ฃ . ํ”„๋ก ํŠธ์•ค๋“œ์—์„œ ๋ฐฑ์•ค๋“œ๋กœ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ํŠน์ • api๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฐฑ์•ค๋“œ๋Š” api ํ˜ธ์ถœ์— ๋งž๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ณ  json์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๋Š” ๊ฑฐ์ฃ . ๊ทธ๋Ÿผ ํ”„๋ก ํŠธ์•ค๋“œ๋Š” ๋ฐ›์€ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ์ƒˆ๋กญ๊ฒŒ ํ™”๋ฉด์„ ๊ตฌ์„ฑ & ์ˆ˜์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ญ”๊ฐ€ ์ต์ˆ™ํ•˜์ฃ ? ajax ํ†ต์‹  flow์™€ ๋™์ผํ•˜์ง€ ์•Š๋‚˜์š”? ajax ๋Š” ๋‹จ์ˆœํžˆ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜์ง€ ์•Š๊ฒŒ ํ•ด์ค€๋‹ค๋Š” ๊ฐœ๋…์ด ์•„๋‹ˆ๋ผ! ์ƒˆ๋กœ์šด ํ†ต์‹  ํŒจ๋Ÿฌ๋‹ค์ž„์ด๊ณ , ํ˜„์žฌ๊นŒ์ง€ ๋„๋ฆฌ๋„๋ฆฌ ์“ฐ์ด๋Š” ์ผ์ข…์˜ ํ†ต์‹ ๋ฐฉ์‹์ด๋ผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ณ  ์žˆ์œผ๋ฉด ์œ„์˜ ๊ตฌ์กฐ๋„ ์ดํ•ด๊ฐ€ ๊ฐˆ ๊ฒƒ์ด๊ณ , ๋‚˜์ค‘์— ํ”„๋ก ํŠธ์•ค๋“œ์™€ ๋ฐฑ์•ค๋“œ๊ฐ€ ๋ถ„๋ฆฌ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๋•Œ ์„œ๋กœ ํ†ต์‹ ์„ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•ด ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค.



๋งˆ์น˜๋ฉฐ

๊ธด ๊ธ€ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฟŒ๋“ฏ!~!

l1ilfO33

โš ๏ธ **GitHub.com Fallback** โš ๏ธ