JS Ajax A to Z - Imchaemin/snulion8th GitHub Wiki
Q. ?? ๋น? ๊ฐ์๊ธฐ ์ญ์ฌ์??
A. ๋ผ๋ ์ง๋ฌธ์ ํ ์ ์๊ฒ ์ง๋ง, ์ ๋ฒ ์ธ์ ์์ ํ๋ ajax ๋ฅผ ์ดํดํ๊ณ ์ ํ๋ค๋ฉด ์ ํ์ด๋๊ฒ ๋์๊ณ , ์ด๊ฒ ์ด๋ค ์ํฅ์ ์คฌ๋์ง ์๋ฉด ๋ ํฅ๋ฏธ๋กญ๊ฒ ๋ฐ๋ผ๋ณผ ์ ์์ ๊ฒ ๊ฐ์์ ์ค๋นํด๋ดค์ต๋๋ค.
1995๋ , ๋น์ ๋ค์ค์ผ์ดํ์ฌ์ ๋ค๋น๊ฒ์ดํฐ๊ฐ ์น๋ธ๋ผ์ฐ์ ์์ฅ์ ์ง๋ฐฐํ๊ณ ์์๋๋ฐ, ๋ค์ค์ผ์ดํ๋ HTMLํ์ด์ง์ ๊ฒฝ๋์ ํ๋ก๊ทธ๋จ ์ธ์ด๋ฅผ ํตํ์ฌ ์ธํฐ๋ ํฐ๋ธํ ๊ฒ์ ์ถ๊ฐ ํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
๊ทธ๋์ ๋ธ๋๋ ์์ด์(Brendan Erich) ๋ฅผ ๊ณ ์ฉํ๋ค., ๊ทธ๋ 10์ผ ๋ง์ ์ธ์ด (์ฌ๋ ๋ง์..? ๐คข๐คฎ) ๋ฅผ ๋ง๋ค์๋ค.
๊ทธ ์ธ์ด์ ์ด๋ฆ์ '๋ชจ์นด'์๊ณ , 9์ '๋ผ์ด๋ธ์คํฌ๋ฆฝํธ'๋ก ์ด๋ฆ์ ๋ณ๊ฒฝํ์๋ค.
๊ทธํด 12์ ๋ค์ค์ผ์ดํ์ ์ฌ์ '๋ผ์ด๋ธ์คํฌ๋ฆฝํธ'๋ฅผ '์๋ฐ์คํฌ๋ฆฝํธ' ๋ผ๊ณ ์ต์ข
์ด๋ฆ์ ๊ฒฐ์ ํ์๋ค.
์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ค๋น๊ฒ์ดํฐ 2.0B3์ ํฌํจ๋์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ํด ๋ค์ด๋ดค๊ฑฐ๋, ๊ฒ์ํด๋ดค์ผ๋ฉด 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์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋น ๋ฅธ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด์๋ค. ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋๋ฆฌ๋ค๋ ์ธ์์ ๋ฐ๊พธ๊ณ , ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์ ์กฐ์ฌ๋ค๊ณผ์ ์๋ ๊ฒฝ์์ ์ด๋ ์ ์๊ฒ ๋์๋ค.
... ๋๋จธ์ง ์๋ต ๐

๋ค๋ค ์ ๋ฒ 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์ด๋?)
์๋๋ ์ฐ๋ฆฌ๊ฐ ์ ๋ฒ์ ๋๊ธ ๊ฐ์ถ๊ธฐ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ์์ฑํ๋ ์ฝ๋์ ๋๋ค.
์ข ํน์ดํ๊ฒ ์ $
ํ์๋ผ๊ณ ์๊ฐํ๋๋ฐ ์ ๋ง ๊ทธ๋ฐ๊ฑฐ ์๋์ ธ..? ์ ๊ฒ ๋ญ์ง ์์๋ด
์๋ค.
$(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 ๊ฐ์ฒด๋ ์น ํ์ด์ง ๊ทธ ์์ฒด๋ฅผ ์๋ฏธํฉ๋๋ค. ์น ํ์ด์ง์ ์กด์ฌํ๋ HTML ์์์ ์ ๊ทผํ๊ณ ์ ํ ๋๋ ๋ฐ๋์ Document ๊ฐ์ฒด๋ถํฐ ์์ํด์ผ ํฉ๋๋ค. ๋ฟ๋ง ์๋๋ผ Document์๋ ๋ธ๋ผ์ฐ์ ์์ ์ง์ํ๋ ๋งค์ฐ ๋ง์ ๋นํธ์ธ ํจ์(built-in ํจ์) ๊ฐ ์กด์ฌํ์ฃ . ์๋์ด ์์ผ๋ฉด JS๋ ๋ฌด์ธ๋ชจ ์ ๋๋ค.
๋ฐฉ๊ธ ์์ Document๊ฐ ์์ผ๋ฉด JS ๊ฐ ๋ฌด์ธ๋ชจ๋ผ ํ์ฃ ? ๊ทธ๋ ๊ธฐ ๋๋ฌธ์!! <script ...></script>
์ <body>
ํ๊ทธ ๋ฐ, ํน์ ๋ฌธ์ ์ ์ผ์๋์ ๋ฃ์ด์ผ ํ๋ค๊ณ ํ์ฃ ? ๊ทธ ์ด์ ๊ฐ ๋ฐ๋ก ์ด๊ฒ ๋๋ฌธ์
๋๋ค.
DOM ์กฐ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋น
- ์์ง ์์ฑ๋์ง ์์ HTML ์์์ ์์ฑ์ ์ถ๊ฐํ๋ ค๊ณ ํ ๊ฒฝ์ฐ
- ์์ง ๋ก๋๋์ง ์์ ์ด๋ฏธ์ง, DOM์ ๋ ์ด์์ ์ ๋ณด(ํฌ๊ธฐ, ์์น ๋ฑ)๋ฅผ ์ป์ผ๋ ค๊ณ ํ ๊ฒฝ์ฐ
๊ทธ๋ผ ์์ ์๋ ์ค๋ฅ ์์ด js๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํด? ๋ผ๋ ์ง๋ฌธ์ด ๋์ฌ ์ ์๊ฒ ์ฃ ? ํด๊ฒฐ๋ฒ์ ์๋์ ๊ฐ์์
- Js ํ์ผ์ ๋ฌธ์ ๊ฐ์ฅ ์๋์์ ๋ถ๋ฅธ๋ค!
๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์
๋๋ค. <body>
ํ๊ทธ์ ๊ฐ์ฅ ์๋์ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค. HTML์ ์์์๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์ฝ๊ธฐ ๋๋ฌธ์ <script>
๋ฅผ ๊ฐ์ฅ ์๋์ ๋๊ณ js๋ฅผ ๋ถ๋ฅด๋ฉด DOM์ด ๋ชจ๋ ๋ง๋ค์ด์ง๊ณ ๋ ๋ค์ js๊ฐ ๋์ํ๊ฒ ์ฃ ?
- 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
});
๋ค์ ์ฐ๋ฆฌ๊ฐ ์งฐ๋ ์ฝ๋๋ก ์๋ด ์๋ค.
$(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
๋ค์ ๋ชจ๋ ์จ๊น!
์ฌ๊ธฐ๊น์ง ์ดํด๋์์ฃ ?
๊ทธ๋ผ ์ ์ฝ๋์์ ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํจ์๋ค์ ํ๋ํ๋ ๋ฏ์ด๋ด ์๋ค
jquery์์ on
์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ถ์ด๋ ๊ธฐ๋ฅ์ ํฉ๋๋ค. ๊ฐ์ด ๋ฑ ์ค์๋ ๋ถ๋ ์๊ฒ ๊ณ ๊ทธ๋ ์ง ์์ ๋ถ๋ ์์ ๊ฒ ๊ฐ์๋ฐ.
์ฐ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ
๋ ํน์ ์ด๋ฒคํธ, ์๋ฅผ ๋ค์ด 'click', 'scroll', 'load', 'keypress' ๋ฑ์ด ๋ฐ์ํ์ ๋ ์คํ์ํค๋ ํจ์๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ง๊ทธ๋๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ํธ๋ค๋ง ํ๋ ์ญํ ์ด์ฃ .
.on()
ํจ์๋ 2๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค.
- EventType
- e.g) click, load, keypress ...
- Callback Function
์ฐ๋ฆฌ๊ฐ ์์์ ์ฌ์ฉํ๋๊ฑด ๊ทธ๋ผ ๋ญ๊น์? ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด function(event)
๋ถ๋ถ์ ์คํํ๋ผ๋ ๊ฑฐ๊ฒ ์ฃ ?
๋ง๊ฐ Question! ์ด๋ค๊ฑธ ๋๋ฌ์ผ ์ด ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋์ํ ๊น์??? ์ ๋ต์.. ์๊ณ ๊ณ์๊ฒ ์ง๋ง $(".more-comment-btn")
๊ฐ์ฒด๋ฅผ ํด๋ฆญํ์ ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํฉ๋๋ค.
JS ์์ this๋ ... ๋งค์ฐ๋งค์ฐ.. ๋งค์ฐ...์์ฃผ... ์์ฒญ ๊ดด๋ํ๊ณ ์ด์ํ๊ณ ๊ทนํ์ด๊ณ ์ดํดํ๊ธฐ ์ด๋ ค์ด ๋ถ๋ถ์
๋๋ค. ์ค๋ช
ํ์๋ฉด ํ๋ฃจ ๋ค ์ธ ์ ์์์ ๋๋ก ๊ทนํ์ด๋, ์ฌ๊ธฐ์ ๊ทธ๋ฅ $(".more-comment-btn")
๊ฐ์ฒด ๊ฐ๊ฐ์ ์๋ฏธํ๋ค๊ณ ์๊ฐํ์ธ์ฉ.
๋จ '๊ฐ๊ฐ' ์ด๋ผ๋ ์ ์ ์ฃผ๋ชฉํ์
์ผ ํ๋๋ฐ, $(".more-comment-btn")
๋ ์ฌ๋ฌ๊ฐ๊ฐ ์์ ์ ์์์์? .more-comment-btn
์ด ์ฌ๋ฌ๊ฐ๊ฐ ๋ ์ ์์ผ๋๊น์! ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ $(this)
๋ ๋ฑ! ํด๋ฆญํ ๊ทธ๋! ๊ทธ ๊ฐ์ฒด! ๋ง์ ์๋ฏธํฉ๋๋ค. ๊ณ ๋ฅ ๊ทธ๋ ๊ฒ ์์๋์ธ์!~!
ClassName์ ๋ถ์๋ค ๋ผ์๋ค ํ๋ ๊ธฐ๋ฅ์
๋๋ค! ๋ณดํต click
์ด๋ฒคํธ๋ ์ ์ฎ์ฌ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ฌ๊ธฐ์ $(".more-comment-btn")
์ .showing-comment
class ๋ฅผ ๋ถ์๋ค ๋ผ์๋ค ํ๊ฒ ๋ค์!
ํด๋น class ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ์ฌ๋ถ๋ฅผ ์๋ ค์ค๋๋ค. true
/ false
๊ฐ์ ๋ฆฌํดํ์ ธ
DOM ์ ํ
์คํธ๋ฅผ ๋ฐ๊ฟ์ค๋๋ค. <p>this is p tag</p>
์ $('p').text('No this is div')
๋ฅผ ์ ์ฉํ๋ฉด<p>No this is div</p>
๊ฐ ๋๊ฒ ์ฃ ?
๋ถ๋ชจ DOM์ ๋ฆฌํดํฉ๋๋ค.
Css selector ๋ฅผ ์ธ์๋ก ๋ฐ๋๋ฐ, ์์ DOM ์ค์์ selector์ ๋ถํฉํ๋ jquery ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ค๋๋ค.
์ญ์ Css selector ๋ฅผ ์ธ์๋ก ๋ฐ์ง๋ง, ์์ DOM ์ค์์ ํด๋น selector๊ฐ ์๋ jquery ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ค๋๋ค.
์จ๊ธฐ๊ณ ๋ณด์ฌ์ค๋๋น!
์! ์ฌ๊ธฐ๊น์ง ํ์ผ๋ฉด AJAX๋ฅผ ์ ์ธํ๊ณ ๋ค๋ค jquery ์ค๋ฒ๋ ๋์ จ์ต๋๋ค. ์์ง ๊ทธ๋๋ ๋ง์คํฐ๊น์ง ๋จผ ๊ธธ์ด ๋จ์์์ง๋ง, ์ค๋ฒ๊ฐ ๋ฐ์ด๋ ์๋ด๋ ์์์์? ๋ฒ์จ ๋ฐ ์์ด์!
Ajax ์ด๋ก ์ ์ด๋์ ๋ ํ์ ํ์ จ์ ๊ฑฐ๋ผ ๋ฏฟ์ต๋๋ค.
๊ทธ๋๋ ํน์ ๋ชฐ๋ผ ๊ฐ๋จํ ๊ทธ๋ฆผ๊ณผ ํจ๊ผ ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค
์ฌ๋ฌ๋ถ ์ฅ๊ณ ๋ ํ๋ก ํธ์ค๋, ๋ฐฑ์๋๊ฐ ํจ๊ป์๋ ํ๋ ์์ํฌ์ ๋๋ค.
์์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ ์ ์๋ฏ, ์ฐ๋ฆฌ๋ ์ธํฐ๋ท์ ํตํด ์ฅ๊ณ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๋ฉด, ์ฅ๊ณ ๋ HTML๋ฅผ ์๋ต์ผ๋ก ์ฃผ๊ณ , ์ฐ๋ฆฌ๋ ๋ฐ์ HTML๋ก ํ
ํ๋ฆฟ์ ๋ค์ ๊ทธ๋ฆฌ๊ฒ ๋ฉ๋๋ค. HTML์ ๋ฐ๋๋ค๋ ์ ์ ์ฃผ๋ชฉํ์ธ์. ์ฐ๋ฆฌ๋ ์ฅ๊ณ ๋ทฐ์์ ์ฌ๋ฌ ์์
์ ํ ๋ค์ render()
ํจ์ ๋๋ redirect()
ํจ์๋ฅผ ํตํด์ ํ
ํ๋ฆฟ์ ๋ณด์ฌ์ฃผ๊ณ , ํ๋ฉด์ ๊ทธ๋ฆฌ๊ณ ์์์ฃ ? ์ด๋ ๊ฒ HTML์ ํต์ผ๋ก ๋ฐ์์ค๋ ๋ฐฉ๋ฒ์ ์๋ก๊ณ ์นจ์ด ๋๋ค๋ ํ์ฐ์ ์ธ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค. (๋ค๋ง! ์ค ๋ผ ๋น ๋ฅด๊ณ ๊ฒ์์์ง์ ์ต์ ํ ๋์ด์๋ค๋ ์ฅ์ ๋ ์์ต๋๋ค.)
Ajax๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ป๊ฒ ๋๋์?? ajax ํต์ ์ ๋ํด ์์ธํ ๋ด์ฉ์ ๋ฐ์์ ๋ ์ค๋ช ๋๋ฆด๊ฒ์. ์ฐ์ ์ ์ฒด์ ์ธ ํ๋ฆ๋ง ๋ณด๋ฉด ajax๋ JSON ๊ฐ์ฒด๋ฅผ ์๋ต์ผ๋ก ๋ฐ๊ณ JS๋ฅผ ํตํด DOM์ ๋์ ์ผ๋ก ์กฐ์ํด์ ํ๋ฉด์ ์์ ํ๊ฒ ๋ฉ๋๋ค. JS๋ฅผ ํตํด ๋์ ์ผ๋ก ํ๋ฉด์ ์์ ํ๊ธฐ ๋๋ฌธ์ ์๋ก๊ณ ์นจ์ด ์์ฃ !! ์๋? JS๋ ๊ทธ๋ฅ ๊ทธ๋ ๊ฒ ๋ง๋ค์ด์ก์ด์... ๋ค๋ฅธ ์์ ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์ด๋ค ์ผ์ ํ ์ ์์ด์ฉ..
์ ๋ฌผ๋ก ..! Ajax ํต์ ๋ XML, HTML ์ ๋ฐ์ ์ ์์ต๋๋ค. HTML์ ๋ฐ์๋ JS๋ฅผ ํตํด ๋ฐ์ HTML ๋ถ๋ถ๋ง ๊ฐ์๋ผ์ฐ๋ฉด ๋ฉ๋๋ค๋ง, ์ง๊ธ์ ๊ฑฐ์ ์ ์ฐ์ด์ฃ ..
์๋ ๊ทธ๋ฆผ์ ๋ณด์๋ฉด ๋ ์ ์ดํดํ ์ ์์๊ฑฐ์์.
Traditional REQ/RES | AJAX REQ/RES |
---|---|
![]() |
![]() |
์๊ฐ๋ณด๋ค ๊ฐ๋จํ์ฅฌ? ๋ค๋ฅธ๊ฑด ๋ญ๋? AJAX Request ๋ฅผ ๋ณด๋ธ๋ค๋ ๊ฒ๊ณผ, JSON Response ๋ฅผ ๋ฐ๋๋ค๋ ์ ๋ฟ์ด์ฃ
์ ์ด์ ์ค์ต์๊ฐ์ ํ๋ ๋ด์ฉ์ ํ๋ํ๋ ๋ถ์ํด ๋ด ์๋ค.
$.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 ํต์ ์ ์ํด ์ด๋ค ํ์ผ, ์ด๋ค ์ฝ๋๋ค์ ์์ ์ ํด์ผํ ๊น์? ๋ฑ ์ ๋ฆฌํด๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ฌ๋ฌ๋ถ์ ์ฅ๊ณ ํ๋ก์ ํธ์์ ๋ฑ ํ์ผ 3๊ฐ๋ง ์์ ํ๋ฉด ๋ฉ๋๋ค.
-
HTML
- ajax๋ JS๋ฅผ ํตํด ์คํ๋ฉ๋๋ค. ํ์ง๋ง ๋ง์ฝ! ์ฐ๋ฆฌ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ ค๋ ์ฃผ์๊ฐ
fid
์ฒ๋ผ ์ฅ๊ณ ๋ทฐ๋ก๋ถํฐ ๋ฐ๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด?/feeds/<int:fid>/comments/
๊ฐ์ ํํ๋ผ๋ฉด? ํน์ ๋ณด๋ด๋ ค๋ ๋ฐ์ดํฐ์fid
๊ฐ์ ์ฅ๊ณ ๋ณ์๊ฐ ํ์ํ๋ค๋ฉด? ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ดfid
๊ฐ ๋ญ์ง ์ ์ ์์๊น์ฌ?? ๋ชจ๋ฆ ๋๋ค. ๊ทธ๋ผ ์ด๋ป๊ฒ ํด์ผํ์ฃ ? ์๊ฒ ํด์ผ์ฃ !! - HTML Data ์์ฑ ์ด๋๊ฒ ์์ต๋๋ค. ๊ฐ๋จํ ๋งํด HTML์ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์๊ฒ ํ๋ ๋ฌธ๋ฒ์ด์ฃ . JS๋ DOM์ ์ ๊ทผํ ์ ์์ผ๋๊น, ์ฌ๊ธฐ์ ์ ์ฅ๋ ์ ๋ณด๋ฅผ JS๋ ๊ฐ์ ธ๋ค ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๊ณ ๋์! ์์ฒญ์ ํ์ํ ๋ณ์์ ๋ณด๋ค์ ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ JS๊ฐ ์ ์ ์๊ฒ ํด์ค์ผ ํฉ๋๋ค.
- ajax๋ JS๋ฅผ ํตํด ์คํ๋ฉ๋๋ค. ํ์ง๋ง ๋ง์ฝ! ์ฐ๋ฆฌ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ ค๋ ์ฃผ์๊ฐ
-
myjs.js
- Ajaxํต์ ์ ํ js ํ์ผ
-
view.py
- ํต์ ์ ํ API ์ ๋ํ view.py ์ฝ๋
- response๋ง JSON์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋ฉ๋๋ค
์ ์ฅ๊ณ ์์ ๋ฑ 3๊ฐ ํ์ผ๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ๋ฉ๋๋ค. ํ์ง๋ง ๋ง์ ๊ตฌํํ๋ ค ํ๋ฉด, ๋ง๋งํ์ฃ .. ๋ฐ๊พธ๋ฉด ๋๋ ํ์ผ์ ์๊ฒ ์ง๋ง ๋ญ ์ด๋ป๊ฒ ํด์ผํ ์ง ๋ชจ๋ฅด๊ฒ ์ฃ ? ๊ทธ๋์ ์ข ๋ ์์ธํ Flow ๋ฅผ ์ ๋ฆฌํด ๋๋ฆฌ๋ ค ํฉ๋๋ค.
-
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>
-
-
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) {}, }); });
-
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 ํต์ ์ด ๋๋๋ฉด ํญ์ ์คํ๋๋ ํจ์ }); });
-
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)
-
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) {}, }); });
-
๊ฟ!
๊ณ ์ ๋ง์์ต๋๋ค. ๋๋์ด ์๋ก๊ณ ์นจ ์์ด ๋๊ธ์ ๋ฌ ์ ์๊ฒ ๋์์ต๋๋ค~!~! ๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐
๋ค ์ฌ์ค๋๋ก ๋งํ๋ฉด ํ์ฌ๋ ์ ๋ ๊ฒ jquery๋ฅผ ์ฌ์ฉํด์ Ajax ๊ธฐ๋ฅ์ ๊ตฌํํ์ง ์์ต๋๋ค. ์๋๊ตฌ์? ์์ฆ์ ํ๋ก ํธ์ค๋๋ ํ๋ก ํธ์ค๋, ๋ฐฑ์ค๋๋ ๋ฐฑ์ค๋ ๊ฐ๊ฐ ํ๋ ์์ํฌ๋ฅผ ํตํด ๊ฐ๋ฐํ๊ฑฐ๋ ์. ๊ฐ์ฅ ์ ๋ช ํ ํ๋ก ํธ์ค๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก๋ ๋ฆฌ์กํธ(react) ๊ฐ ์๋๋ฐ, ๋ฆฌ์กํธ๋ ๋๋๊ฒ๋ ajax๋ฅผ ์ ๊ฒฝ์ธ ํ์๊ฐ ์๋ต๋๋ค!
๊ทธ๋ฐ๋ฐ ์ ๋ฐฐ์์ผํ ๊น? ๋ ์๋ฌธ์ด ๋ค ์ ์์ต๋๋ค.
(์ฌ๊ธฐ๋ถํด ์ ๊ฐ์ธ์ ์ธ ์๊ฐ์ ๋๋ค)
Ajax๋ API ํต์ ์ ์๋ก์ด ํจ๋ฌ๋ค์์ ๊ฐ์ ธ์์ต๋๋ค. ํ์ด์ง ์ ์ฒด๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ด ์๋, ์ํ๋ ๋ถ๋ถ๋ง ์ฃผ๊ณ ๋ฐ๊ฑฐ๋ ํน์ ์ํ๋ ๋ฐ์ดํฐ๋ง ์ฃผ๊ณ ๋ฐ๋ ํํ๋ก ๋ง์ด์ฃ .
์ด์ ํ๋ก ํธ์ค๋์ ๋ฐฑ์ค๋๊ฐ ์์ ๋ถ๋ฆฌ๋์ด ํ๋ก ํธ์ค๋๋ ํ๋ก ํธ์ค๋ ์๋ฒ๋ฅผ ๊ฐ์ง๊ณ , ๋ฐฑ์ค๋๋ ๋ฐฑ์ค๋ ์๋ฒ๋ฅผ ๊ฐ์ง๊ณ ๋์ํ๊ฒ ๋ฉ๋๋ค. ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๋ง์ด์ฃ . ํ๋ก ํธ์ค๋์์ ๋ฐฑ์ค๋๋ก ๋ฐ์ดํฐ์ ํจ๊ป ํน์ api๋ฅผ ํธ์ถํ๋ฉด ๋ฐฑ์ค๋๋ api ํธ์ถ์ ๋ง๋ ๋์์ ์ํํ๊ณ json์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํด์ฃผ๋ ๊ฑฐ์ฃ . ๊ทธ๋ผ ํ๋ก ํธ์ค๋๋ ๋ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ ์๋กญ๊ฒ ํ๋ฉด์ ๊ตฌ์ฑ & ์์ ํ๊ฒ ๋ฉ๋๋ค.

๋ญ๊ฐ ์ต์ํ์ฃ ? ajax ํต์ flow์ ๋์ผํ์ง ์๋์? ajax ๋ ๋จ์ํ ์๋ก๊ณ ์นจ์ ํ์ง ์๊ฒ ํด์ค๋ค๋ ๊ฐ๋ ์ด ์๋๋ผ! ์๋ก์ด ํต์ ํจ๋ฌ๋ค์์ด๊ณ , ํ์ฌ๊น์ง ๋๋ฆฌ๋๋ฆฌ ์ฐ์ด๋ ์ผ์ข ์ ํต์ ๋ฐฉ์์ด๋ผ ๋ณผ ์ ์์ต๋๋ค.
์ด ๊ฐ๋ ์ ์ดํดํ๊ณ ์์ผ๋ฉด ์์ ๊ตฌ์กฐ๋ ์ดํด๊ฐ ๊ฐ ๊ฒ์ด๊ณ , ๋์ค์ ํ๋ก ํธ์ค๋์ ๋ฐฑ์ค๋๊ฐ ๋ถ๋ฆฌ๋ ํ๋ก์ ํธ๋ฅผ ํ ๋ ์๋ก ํต์ ์ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ์ ๋ํด ๋ณด๋ค ๋น ๋ฅด๊ฒ ์ดํดํ๊ณ ์งํํ ์ ์์ ๊ฒ๋๋ค.
๊ธด ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋ฟ๋ฏ!~!