ํ์ค ์ด๋ฒคํธ ์ฐ๊ฒฐ ๋ฐฉ์
/*
1. ์ด๋ฒคํธ ์ฐ๊ฒฐ ๋ฐฉ์์ ํ์ค ์ด๋ฒคํธ ์ฐ๊ฒฐ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ
2. ๋ณ๊ฒฝ๋ ์ฝ๋๋ฅผ ์คํํ์ฌ ๋ํดํธ ์ ๊ฑฐ ํ
์คํธ
3. ํ์ค ์ด๋ฒคํธ ๋ฐฉ์์์๋ ์ด๋ฒคํธ ์ ๊ฑฐ๋ฅผ ์ํด preventDefault() ๋ฉ์๋๋ฅผ ์ฌ์ฉ
*/
function handler(event) {
var id = document.querySelector('#id');
var pw = document.querySelector('#pw');
var newPw = document.querySelector('#newPw');
var rePw = document.querySelector('#rePw');
var msg = document.querySelector('#msg');
if (id.value.length >= 3 && pw.value.length >= 3 && newPw.value.length >= 3 && rePw.value.length >= 3 && pw.value !== newPw.value && newPw.value === rePw.value) {
} else {
id.value = '';
pw.value = '';
newPw.value = '';
rePw.value = '';
msg.innerHTML = '์คํจ';
msg.style.color = 'red';
id.focus();
event.preventDefault();
}
}
function init() {
document.querySelector('#changePw').addEventListener('submit', handler);
}
window.addEventListener('load', init);
์ด๋ฒคํธ ๋ฒ๋ธ๋ง๊ณผ stopPropagation()
์ด๋ฒคํธ ๋ฒ๋ธ๋ง(7/15 ์์ ๋ด์ฉ)
์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ํ์ ์์์์ ๋ฐ์ํ ์ด๋ฒคํธ๊ฐ ์์ ์์๋ก ์ ๋ฌ๋๋ ํ์์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ HTML ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค.
<div id="outer">
<div id="inner">
<button>Click me</button>
</div>
</div>
๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ฒํผ์์ click ์ด๋ฒคํธ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด ๋ฐ์ํ๋ฉด์ ๋ฒํผ์์ ๋ฐ์ํ ์ด๋ฒคํธ๊ฐ ์์ ์์์ธ div#inner
๋ก ์ ๋ฌ๋๊ณ , ๋ค์ div#inner
์์ div#outer
๋ก
์ ๋ฌ๋ฉ๋๋ค.
document.querySelector('#outer').addEventListener('click', function() {
console.log('outer');
});
document.querySelector('#inner').addEventListener('click', function() {
console.log('inner');
});
document.querySelector('button').addEventListener('click', function() {
console.log('button');
});
์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ฒํผ์ ํด๋ฆญํ ๋ ์ฝ์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
button
inner
outer
stopPropagation()
stopPropagation() ๋ฉ์๋๋ ์ด๋ฒคํธ์ ๋ฒ๋ธ๋ง์ ์ค์ง์ํต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ HTML ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค.
<div id="outer">
<div id="inner">
<button>Click me</button>
</div>
</div>
๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค.
document.querySelector('#outer').addEventListener('click', function () {
console.log('outer');
});
document.querySelector('#inner').addEventListener('click', function (event) {
console.log('inner');
event.stopPropagation();
});
document.querySelector('button').addEventListener('click', function () {
console.log('button');
});
์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ฒํผ์ ํด๋ฆญํ ๋ ์ฝ์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
button
inner
div#inner
์ click ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ stopPropagation() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด ์ค์ง๋๊ณ , div#outer
๋ก ์ด๋ฒคํธ๊ฐ ์ ํ๋์ง ์์ต๋๋ค.
์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ์ด์ฉํ ๋ฒํผ ๊ตฌํ
<body>
<h1>hello, world</h1>
<h2>์ด๋ฒคํธ ๋ฒ๋ธ๋ง</h2>
<hr>
<div id="buttons">
<button>Create</button>
<br>
<button>Read</button>
<br>
<button>Update</button>
<br>
<button>Delete</button>
<br>
</div>
<script>
function handler(event) {
var content = event.target.innerHTML;
// event.target ์ ์ด์ฉํ ์์
if (content === 'Create') {
alert('์์ฑ ๋ฒํผ์ ํด๋ฆญํจ')
} else if (content === 'Read') {
alert('์ฝ๊ธฐ ๋ฒํผ์ ํด๋ฆญํจ')
} else if (content === 'Update') {
alert('์
๋ฐ์ดํธ ๋ฒํผ์ ํด๋ฆญํจ')
} else if (content === 'Delete') {
alert('์ญ์ ๋ฒํผ์ ํด๋ฆญํจ')
}
}
function init() {
document.querySelector('#buttons').addEventListener('click', handler)
}
window.onload = init;
</script>
</body>
SPA(Single Page-web Application)
SPA(Single Page-Web Application)๋ ๋จ์ผ ํ์ด์ง๋ก ๊ตฌ์ฑ๋ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๋๋ค. ์๋ก์ด ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ์ด ์๋๋ผ, ๋์ ์ผ๋ก ํ๋ฉด์ ๊ฐฑ์ ํ๋ฉด์ ์ฌ์ฉ์์ ์ํธ์์ฉํฉ๋๋ค. ์ด๋ฅผ ์ํด, ๋๋ถ๋ถ์ ๋ก์ง์ด ํด๋ผ์ด์ธํธ ์ธก์์ ์ํ๋ฉ๋๋ค. SPA๋ ๋น ๋ฅธ ์ฌ์ฉ์ ๊ฒฝํ๊ณผ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ํ์ด์ง ์ ํ ์์ ํ์ํ ๋ฆฌ์์ค(HTML, CSS, JavaScript)๋ฅผ ํ ๋ฒ๋ง ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ํ, ์๋ฒ์์ ํต์ ์ ์ต์ํํ๋ฉด์, ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๊ฐ์ ธ์ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค๋๋ค.
โ AJAX๋ Asynchronous JavaScript and XML์ ์ฝ์๋ก, ๋น๋๊ธฐ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋๋ ์น ๊ฐ๋ฐ ๊ธฐ์ ์ ๋๋ค. ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ด์ง๋ฅผ ๋ค์ ๋ก๋ํ ํ์ ์์ด ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๊ณ ์ํธ์์ฉ์ด ๊ฐ๋ฅํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
AJAX๋ ํ๋์ ์ธ ์น ๊ฐ๋ฐ์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ฉฐ, ํนํ ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA)์์ ์ฌ์ฉ๋ฉ๋๋ค. SPA๋ ๋จ์ผ HTML ํ์ด์ง๋ฅผ ๋ก๋ํ๊ณ ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ํธ์์ฉํจ์ ๋ฐ๋ผ ํด๋น ํ์ด์ง๋ฅผ ๋์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค. ํ์ด์ง๊ฐ ๋ค์ ๋ก๋๋์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๋ ๋ ๋น ๋ฅธ ๋ก๋ ์๊ฐ๊ณผ ํ์ด์ง ๊ฐ์ ๋ถ๋๋ฌ์ด ์ ํ์ ๊ฒฝํํ ์ ์์ต๋๋ค.
AJAX๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ ์ธก Javacript ์ฝ๋์ ์๋ฒ ์ธก ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ์ ์์ต๋๋ค. ์ด ํต์ ์ ์ผ๋ฐ์ ์ผ๋ก JSON(JavaScript Object Notation) ๋๋ XML( Extensible Markup Language)์ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ ์ธก ์ฝ๋๋ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง๋ฅผ ๋์ ์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
AJAX๋ ๋น ๋ฅด๊ณ ๋ฐ์์ฑ์ด ๋์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๋ฐ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๊ณ ๋ณด์์ ์ ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. AJAX๋ฅผ ์ฌ์ฉํ ๋๋ ๋ฐ๋์ ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ (XSS) ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋ณดํธํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ์ฌ์ฉ์ ์ ๋ ฅ์ ์ ์ ํ๊ฒ ๊ฒ์ฆํ๊ณ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ ์ธก์์ ์ ํจ์ฑ ๊ฒ์ฌํด์ผ ํฉ๋๋ค.
AJAX ์ธ์๋, ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ ๋๊ตฌ๋ก๋ React๊ฐ ์์ต๋๋ค. React๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. React๋ ์๋ฒ ์ธก ๋ ๋๋ง๋ ์ง์ํ๊ธฐ ๋๋ฌธ์ SEO์ ์นํ์ ์ธ SPA๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ข์ ์ ํ์ง์ ๋๋ค. AJAX์ React๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋์ ์ด๊ณ ์ํธ์์ฉ์ด ๊ฐ๋ฅํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
โ React : SPA ํ๊ฒฝ์์ AJAX๋ฅผ ์ด์ฉํ์ฌ ๋์ ์ผ๋ก ํ๋ฉด์ ์ฌ๊ตฌ์ฑ ํ๋ ๋ฐฉ๋ฒ (JXS, Compornent๋ฅผ ์ด์ฉ)
์์ธ์ฒ๋ฆฌ
์์ธ(Exception)๋ ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ด ์ค์๋์ ํ๊ฑฐ๋ ์ข ๋ฃ๋๋ ์์ธ์ด ๋๋ ์ค๋ฅ๋ฅผ ๋งํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ธ๋ ๋ค์ํ ์ด์ ๋ก ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ชป๋ ๋งค๊ฐ๋ณ์๋ฅผ ํจ์์ ์ ๋ฌํ๊ฑฐ๋, ์กด์ฌํ์ง ์์ ๊ฐ์ฒด ์์ฑ์ ์ฐธ์กฐํ๊ฑฐ๋, ๋ฐฐ์ด์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฑ์ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ try-catch๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. try ๋ธ๋ก ์์๋ ์์ธ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ์ฝ๋๋ฅผ ์์ฑํ๊ณ , catch ๋ธ๋ก ์์๋ ํด๋น ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ์์ธ๊ฐ ๋ฐ์ํ๋ฉด, try ๋ธ๋ก ์์ ์ฝ๋ ์คํ์ด ์ค๋จ๋๊ณ , catch ๋ธ๋ก์ผ๋ก ์ ์ด๊ฐ ์ด๋ํฉ๋๋ค. catch ๋ธ๋ก์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ํ, ํ๋ก๊ทธ๋จ์ด ๊ณ์ ์คํ๋ฉ๋๋ค.
์์ ๋ฅผ ํตํด ์ด๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
function divide(a, b) {
if (b === 0) {
throw new Error('Divide by zero');
}
return a / b;
}
try {
var result = divide(10, 0);
console.log(result);
} catch (e) {
console.log(e.message);
}
์ ์ฝ๋๋ ์ซ์ a๋ฅผ ์ซ์ b๋ก ๋๋๋ divide ํจ์์ ๋๋ค. ๋ง์ฝ b๊ฐ 0์ด๋ฉด, ์์ธ๋ฅผ ๋ฐ์์ํต๋๋ค. try ๋ธ๋ก ์์์ divide ํจ์๋ฅผ ํธ์ถํ ํ, catch ๋ธ๋ก์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ด ์์ ์์๋ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด, โDivide by zeroโ๋ผ๋ ๋ฉ์์ง๊ฐ ์ฝ์์ ์ถ๋ ฅ๋ฉ๋๋ค.
์ด์ธ์๋, ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ throw๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ต๋๋ค. throw๋ฌธ์ ์์ธ๋ฅผ ๊ฐ์ ๋ก ๋ฐ์์ํต๋๋ค. ๋ค์ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
function func() {
throw new Error('Something went wrong');
}
try {
func();
} catch (e) {
console.log(e.message);
}
์ ์ฝ๋๋ func ํจ์๋ฅผ ํธ์ถํ๊ณ , ํจ์ ๋ด๋ถ์์ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ์์ ์ ๋๋ค. try ๋ธ๋ก์์ func ํจ์๋ฅผ ํธ์ถํ๊ณ , catch ๋ธ๋ก์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ด ์์ ์์๋ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด, โSomething went wrongโ๋ผ๋ ๋ฉ์์ง๊ฐ ์ฝ์์ ์ถ๋ ฅ๋ฉ๋๋ค.
์์ธ์ฒ๋ฆฌ๋ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ ๋์ด๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์์ธ๊ฐ ๋ฐ์ํ๋ฉด, ํ๋ก๊ทธ๋จ์ด ์๊ธฐ์น ์๊ฒ ์ข ๋ฃ{๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์, ์์ธ์ฒ๋ฆฌ๋ฅผ ์ ์ ํ๊ฒ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ ๋์ด๋ ๊ฒ์ด ์ข์ต๋๋ค.
์์ธ์ฒ๋ฆฌ ์ฝ์๋ก ํ์ธํด๋ณด๊ธฐ
try {
console.log('[1] ์ค๋ฅ ๋ฐ์ ์ ');
console.log('[2]' + (4 + num));
console.log('[3] ์ค๋ฅ ๋ฐ์ ํ');
} catch (e) {
console.log('[4] ์๋ฌ ์ฒ๋ฆฌ');
}
console.log('[5] ์๋ฌ ์ฒ๋ฆฌ ํ');
// 1, 4, 5 ์ฝ์์ฐฝ์ ํ์๋จ