๐๊ธฐ์กด ํ๋ก์ ํธ ๋ฌธ์ ์ ์ฐพ๊ธฐ
HTML, CSS , Javascript๋ฅผ ํตํด ์ ์ํ ์น, ์๋ชจ๋ ํผ์ํฝ ๋ฏธ์ ๊ด์ ์๋ ์ ์๋ฅผ ํ ๋๋ก ๋ง๋ค์๋ค. ํด๋ก ์ฝ๋ฉ์ ์๋์ด๋ ์ฒ์ ํ๋ก ํธ์๋ ๊ณผ์ ์ ๋ฐฐ์ฐ๊ณ ๋ง๋ ํ๋ก์ ํธ์๊ธฐ์ ์ฐฝ์์ฑ๋ณด๋ค๋ ํ์ต์ฑ์ ์ด์ ์ ๋์ด ๊ธฐ์กด ์น์ ์ฐธ๊ณ ํ๋ฉฐ ๋ง๋ค์๋ค.
https://spectacular-shortbread-0fa617.netlify.app/exhibtion.html
EXHIBTION
spectacular-shortbread-0fa617.netlify.app
์๊ฐ์ด ํ๋ฅด๊ณ ๋ค์ ๋ดค์ ๋๋ ์ฒ์ ๋ง๋ ๊ฑฐ ๋๋ฌด๋๋ฌด ํฐ๋ฅผ ๋ด๋ ์น์ด์ฌ์ ๋ถ๋๋ฌ์์ก๋ค. ๋ง๋ ์๋ผ๋ form๋์์ธ , mainํ์ด์ง๋ page not found, ์ฌ์ฉ์๋ฅผ ์ ํ ๊ณ ๋ คํ์ง ์์ ๋ธ๋ผ์ฐ์ ๊น์ง ์ด์ ์ ๋๊ตญ์ด๋ผ ์์ ํ๊ธฐ๋ก ๊ฒฐ์ฌ...๐ซ
์ผ๋จ ๊ฐ ํ์ด์ง๋ฅผ ๋ณ๋ก ๋ ์ด์์์ ๋ฌธ์ ์ ์ ํ์ ํ๊ณ ๊ฐ์ ๋ฐฉํฅ๋ค์ ์ ๋ฆฌํ์๋ค.
https://statuesque-pincushion-161.notion.site/2021-08-APMA-a25416082ebb49f9a5e026f93c449f59?pvs=4
2021.08 APMA ๊ฐ์ ์ฌํญ | Built with Notion
๋ธ๋ผ์ฐ์ ์ด์์ ๋ ์ฒ์ ๋์ค๋ ํ์ด์ง exhibtion→ mainํ์ด์ง๋ก ๊ต์ฒดํ๊ธฐ
statuesque-pincushion-161.notion.site
๋ ์ด์์ ์์ ์ ๋ง์น ํ ํ ํ๋ก์ ํธ๋ก ๋๋ฒจ๋กญ ํ๊ณ ์ถ์ด์ ์บ ํผ์คํฝ ์ฑ์ ํตํด ๋ฐฑ์๋ ๊ฐ๋ฐ์ 2๋ถ๊ณผ ํ์ ์ ์์ํ๋ค.
๐(๋ก๊ทธ์ธ + ํ์๊ฐ์ )ํ ํ๋ก์ ํธ๋ก ๋๋ฒจ๋กญ ์ํค๊ธฐ
๊ธฐ์กด ํ๋ก์ ํธ์ ๋ก๊ทธ์ธ๊ณผ ํ์๊ฐ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ๋ก ์์ํ์๋ค.
์๊ตฌ์ฌํญ ๋ช ์ธ์
์๊ตฌ์ฌํญ ๋ช ์ธ์๋ฅผ ์์ฑํด์ ์ํ๋ ๊ธฐ๋ฅ์ ์ธ๋ถ์ฌํญ๋ค์ ์ ๋ฌํด๋๋ ธ๋ค. ํ์๋ ๋์ค์ฝ๋๋ฅผ ํตํด ์งํ๋์๊ณ ์ด๋ฏธ ํ๋ก ํธ์ชฝ์์๋ ๋์์ธ์ด ์์ฑ๋ ์ํ๋ผ AJAX๋ฅผ ์ด์ฉํด์ REST API๋ฅผ ๋ง๋ค์ด๋๊ณ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ๋ถ๋ค์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์๋ค.
$.ajax({
"url":"https://apma.o-r.kr/APMA/join/member",
"type":"POST",
"Content-Type":"application/json",
data: JSON.stringify(menber_info),
dataType:"json",
}).done(function (resp) {
// ๊ฒฐ๊ณผ๊ฐ ์ ์์ด๋ฉด done ์คํ
alert("ํ์๊ฐ์
์ด ์๋ฃ๋์์ต๋๋ค.");
console.log(resp);
location.href = "./login.html";
}).fail(function (error) {
// ์คํจํ๋ฉด fail ์คํ
alert("ํ์๊ฐ์
์ด ์คํจํ์์ต๋๋ค.");
alert(JSON.stringify(error));
});
์ Ajax๋ฅผ ์ฌ์ฉํ์๋๊ฐ?!
โ๏ธ๋น๋๊ธฐ ํต์ (Asynchronous Communication): jQuery Ajax๋ฅผ ์ฌ์ฉํ๋ฉด ์น ํ์ด์ง๊ฐ ์๋ก ๊ณ ์ณ์ง์ง ์๊ณ ๋ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค. ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ฉฐ ๋น ๋ฅธ ์๋ต์ ๊ฐ๋ฅํ๊ฒ ํ๋ค. ๋น๋๊ธฐ ํต์ ์ ํตํด ํ์ด์ง๊ฐ ์๋ก ๊ณ ์ณ์ง์ง ์์ผ๋ฏ๋ก ์ฌ์ฉ์๋ ํ์ด์ง ์ด๋ ์์ด๋ ๋ก๊ทธ์ธ ๋ฐ ํ์๊ฐ์ ๊ณผ ๊ฐ์ ์์ ์ ์ํํ ์ ์๋ค.
โ๏ธ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ ์ฒ๋ฆฌ: Ajax๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ ์ธก์์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํ๊ณ ์๋ฒ๋ก ์ ์กํ๊ธฐ ์ ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ก์จ ๋ถํ์ํ ์๋ฒ ์์ฒญ์ ์ต์ํํ๊ณ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์๋ค.
โ๏ธ๊ฐ๋จํ ๊ตฌํ: jQuery๋ ๊ฐํธํ ๋ฌธ๋ฒ๊ณผ ์ฌ์ฉ๋ฒ์ ์ ๊ณตํ๋ฏ๋ก, ๊ฐ๋จํ Ajax ์์ฒญ์ ์ํํ๊ธฐ์ ์ ํฉํ๋ค. ์ด๋ ๊ฐ๋ฐ์๊ฐ ๋น ๋ฅด๊ฒ ๊ตฌํํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ๋์์ค๋ค.
โ๏ธํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง ์ง์: jQuery๋ ๋ค์ํ ๋ธ๋ผ์ฐ์ ์์ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋๋ก ์ค๊ณ๋์ด ์๋ค. ์ด๋ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง ์ด์๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋๋ค.
๐CORS ์๋ฌ ์ด์๋ก ์ผ์ฃผ์ผ ๋๊ฒ ์์ํ๊ธฐ
๋๋์ด ๋ฐฑ์๋์์๋ ์ฝ๋๊ฐ ์์ฑ๋๊ณ ํ์๊ฐ์ ๋ฒํผ์ ๋๋ฌ๋ณด๋,,,
CORS ์๋ฌ?? CORS์๋ฌ๊ฐ ๋๋์ฒด ๋ญ์ผ!
CORS(Cross-Origin Resource Sharing)๋ ์ถ์ฒ๊ฐ ๋ค๋ฅธ ์์๋ค์ ๊ณต์ ํ๋ค๋ ๋ป์ผ๋ก, ํ ์ถ์ฒ์ ์๋ ์์์์ ๋ค๋ฅธ ์ถ์ฒ์ ์๋ ์์์ ์ ๊ทผํ๋๋ก ํ๋ ๊ฐ๋ ์ ๋๋ค. ์ง์ญํ๋ฉด, ๊ต์ฐจ๋๋ ์ถ์ฒ ์์๋ค์ ๊ณต์ ์ ๋๋ค. ๋ค๋ฅธ ์ถ์ฒ์ ์๋ ์์์ ์์ฒญํ๋ค๊ณ ํ๋ฉด, ์ด๋ฅผ ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
์๋ฒ์ชฝ์์ Postman์ ์ด์ฉํด ํ ์คํธ๋ฅผ ํด๋ดค์ ๋๋ ๋ฌธ์ ๊ฐ ์๊ณ CORS ์ธํ ๋ ์๋ฃํ๋๋ฐ๋ ๊ณ์ ์๋ฌ๊ฐ ๋ ์ ์ ์ ๋จธ๋ฆฌ๊ฐ ์ํ์๋ค. ์ฌ๊ธฐ์ ๊ธฐ์ ๋ฌผ์ด๋ด๋ CORS๋ ๋ฐฑ์๋์์ ํด๊ฒฐํ๋๊ฒ ๋ง๋ค๊ณ ํ์ จ๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋ด๊ฐ ๋ญ๊ฐ ์ค์ ์ ์๋ชปํ๊ฒ ์๋์ง!! ํ๋ก ํธ์์๋ CORS๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ด ์๋์ง ๊ณ์ ์ดํด๋ดค๋ค.
1. jquery ํ๋ฌ๊ทธ์ธ์ ์ด์ฉํด ajax-cross-origin ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ด๋ฐ๊ธฐ
https://www.ajax-cross-origin.com/
Home - CrossOr in Ajax
Unlike other programming languages, JavaScript can be embedded into any web page and used with many other web development mechanisms and languages.
www.ajax-cross-origin.com
์์ ์ฌ์ดํธ์์ ajax-cross-origin ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ด๋ฐ๊ณ html head ์์ ๋ฃ์ด์ค ํ
<script type="text/javascript" src="../js/jquery.ajax-cross-origin.min.js"></script>
ajax ์ฝ๋์ crossOrigin : true,์ถ๊ฐํ๊ธฐ
...์คํจ!
2. Chrome ํ์ฅ ํ๋ก๊ทธ๋จ ์ด์ฉํ๊ธฐ
Chrome์์๋ CORS ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ ๊ณตํด์ค๋ค. Chrome์ ์น์คํ ์ด ์์ cors๋ฅผ ๊ฒ์ํด์ฃผ๋ฉด ๋๋ค.
๋ธ๋ผ์ฐ์ ์ค๋ฅธ์ชฝ ์๋จ์์ ํ์ฅ ํ๋ก๊ทธ๋จ์ ํ์ฑํ ์ํฌ ์ ์๋ค. ํด๋น ํ๋ก๊ทธ๋จ์ ํ์ฑํ ์ํค๊ฒ ๋๋ฉด, ๋ก์ปฌ ํ๊ฒฝ์์ API๋ฅผ ์ฌ์ฉ ์, CORS ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค๊ณ ํ๋ค.
์คํจ!!
3. ํ์ ๊ฐ๋ฐ์ํํ ๋ฌผ์ด๋ณด๊ธฐ , ์ปค๋ฎค๋ํธ ์ฌ์ดํธ์ ๋ฌผ์ด๋ณด๊ธฐ, ๊ณ์ ์์ํ๊ธฐ
ํ ์คํธ ์ค์ ๋ฌ ์ฌ์ง์ ์๋ ํ์ ๊ฐ๋ฐ์ ๋ถ์๊ฒ ๋ณด๋ด์ ์ฌ์ญค๋ดค๋ค.
405์๋ฌ?? -> ๋ณด๋ด๋ ๊ฒ์ post ์์ฒญ์ธ๋ฐ get์ผ๋ก ๋ฐ๋ ๋ถ๋ถ๋ง ์กด์ฌํ ๋ ๋ฐ์ํ๋ค.
์ฃผ์๋ ์๋๋ฐ ๋ฐฉ์(post, get)์ด ๋ค๋ฅธ ๊ฒ , ๋ง์ฝ ์ฃผ์๊ฐ ์๋ค๋ฉด 405์๋ฌ๊ฐ ์๋ 404์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฐฑ์๋ ๊ฐ๋ฐ์ํํ ์๋ฒ์์ requestmethod๋ฅผ post, get ๋ ๋ค ํ์ฉ์ผ๋ก ํ์ ๊ฑฐ ๋ง๋๊ณ ์ฌ์ญค๋ดค๋ค. ๊ทธ๋ ๋ค๊ณ ํ๋ค.
์ฌ์ดํธ์ ๋ด ์ฝ๋๋ฅผ ์ฌ๋ ค ์ฌ์ญค๋ดค๋ค.
https://okky.kr/questions/1465493
OKKY - ์๋ฒ ํ๋ก ํธ(ajax์ฌ์ฉ) ์ฐ๊ฒฐ ์ค๋ฅ
ํ๋ก์ ํธ ํ ๋ ์ง๋ฌธ์ ๋๋ค!!๋ฐฑ์๋ ์ชฝ์์ api ์ค์จ๊ฑฐ๋ก ํ ์คํธํ ๋๋ ์๋ฌด ์ด์์๋๋ฐ ํ๋ก ํธ๋ ์ฐ๊ฒฐํ ๋ ๋ฌธ์ ๊ฐ ๋ค์ ๋ฐ์ํ ์ ์๋์?cors๋ corb ์๋ฌ๊ฐ ๋จ๋๋ฐ ์ด๋์ชฝ์์ ํด๊ฒฐํด์ผํ ๊น์?
okky.kr
url!! ๋ง๋ค. ์ฌ์ค url์ด ๋ง์ผ๋ฉด ์๋ฌ๋ฉ์์ง๋ผ๋ ๊ฐ๋ ๊ฒ์ด ์ ์์ด๋ค.
https://apma.o-r.kr/APMA/join/member -> https://apma2023.net/APMA/join/member ์์ ํ๋ค.
์๋ฌ๊ฐ ๋ฉ์ธ์ง๊ฐ ๊ฐ๋ค. ๋๋์ด ์๋ฌ๋ฉ์์ง๊ฐ ๊ฐ๋ค.
Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' is not supported]
์ GET์์ฒญ์ด ๊ฐ์ ๊น? ๋ ๋ถ๋ช POST๋ก ๋ณด๋๋๋ฐ!!
4. Ajax์ฝ๋ ์ต์ข ์์
์๋ฌ๋ฉ์ธ์ง๋ฅผ ํ์ธํ ํ์๋ ajax์ฝ๋๋ฅผ ์๋ชป ์ค์ ํ์ ๊ฐ๋ฅ์ฑ์ด ์ปค์ ์ด๊ฒ์ ๊ฒ ๋ค์ ์์ ํด๋ดค๋ค.
crossOrigin : true => crossDomain: true ์ผ๋ก ์์
crossOrigin : true : cross-Origin ์์ฒญ์ ๋ณด์ ์ ์ฑ ์ ๋์ผ ์ถ์ฒ ์ ์ฑ (Same-Origin Policy)์ ์ํด ์ ํ๋๋๋ฐ, ์ด ์ ์ฑ ์ ์ฐํํ๊ณ ๋ค๋ฅธ ๋๋ฉ์ธ์์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋ ์ฌ์ฉ๋๋ค.
crossDomain: true : ์ด ์ต์ ์ XMLHttpRequest ๊ฐ์ฒด์ ํ์ค ์์ฑ์ด๋ฉฐ, jQuery Ajax์์ ๋ช ์์ ์ผ๋ก ์ค์ ํ ํ์๊ฐ ์๋ค.
์ฌ์ค์ ์ํฅ์ ๊ฑฐ์ ๋ฏธ์น์ง ์์์ ๊ฒ ๊ฐ๋ค.
"Content-Type":"application/json", => contentType: 'application/json; charset=utf-8', ์ผ๋ก ์์
"Content-Type":"application/json ์ ์ผ๋ฐ์ ์ผ๋ก ์๋ฒ ์ธก์์ HTTP ํค๋๋ก ์ฌ์ฉ๋๋ ํํ
contentType: 'application/json; jQuery Ajax ์์ฒญ๊ณผ ๊ฐ์ด JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ ๋ง์ด ์ฌ์ฉ๋๋ ํํ
charset=utf-8 -> ๋ฐ์ดํฐ์ ์ ์ก ํ์์ ๋ํ๋ด๋๋ฐ, ์ฌ๊ธฐ์๋ JSON ๋ฐ์ดํฐ๋ฅผ UTF-8 ์ธ์ฝ๋ฉ์ผ๋ก ์ ์กํ๋ค๋ ๊ฒ์ ๋ํ๋ธ๋ค.
withCredentials:true ์ ์ถ๊ฐ
XMLHttpRequest์ ๋ํ ์ต์ ์ผ๋ก, ์ธ์ฆ ์ฟ ํค์ ๊ฐ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์์ฒญ์ ํฌํจํ๋๋ก ํ์ฉํ๋ค. ์ด ์ค์ ์ ์ถ๊ฐํ๋ฉด ์๋ฒ ๊ฐ์ ์ธ์ฆ์ด ํ์ํ ๊ฒฝ์ฐ ์ธ์ฆ๋ ์์ฒญ์ ๋ณด๋ผ ์ ์๋ค.
์ต์ข ํ์๊ฐ์ ajax ์ฝ๋
function submit_menber_info(){
$.ajax({
"url":"https://apma2023.net/login",
"type":"POST",
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(menber_info),
dataType:"json",
crossDomain : true,
withCredentials:true,
}).done(function (resp) {
// ๊ฒฐ๊ณผ๊ฐ ์ ์์ด๋ฉด done ์คํ
alert("ํ์๊ฐ์
์ด ์๋ฃ๋์์ต๋๋ค.");
console.log(resp);
location.href = "./login.html";
}).fail(function (error) {
// ์คํจํ๋ฉด fail ์คํ
alert("ํ์๊ฐ์
์ด ์คํจํ์์ต๋๋ค.");
alert(JSON.stringify(error));
});
}
์ต์ข ๋ก๊ทธ์ธ ajax ์ฝ๋
function login() {
var login_info = {
username :$("#userId").val(),
password :$("#userPw").val(),
}
console.log(login_info);
$.ajax({
"url": "https://apma2023.net/APMA/join/member",
"type": "POST",
data: JSON.stringify(login_info),
contentType: 'application/json; charset=utf-8',
dataType:"json",
crossDomain : true,
withCredentials:true
}).done(function (response,status,xhr) {
alert('๋ก๊ทธ์ธ ์๋ฃ')
window.location.href = '../index.html'
$('#side_menu>li:nth-child(1)').remove();
$('#side_menu').prepend("<li><input type='submit'>LOGOUT</input></li>");
console.log(response); //๋ก๊ทธ์ธ ์ฑ๊ณตํ๋ฉด
console.log(xhr.getREsponseHeader('Authorization'))// ํค๋์ ์๋ ํ ํฐ์ ๋ฐ์์์
localStorage.setItem('accessToken', xhr.getREsponseHeader('Authorization')) // ๋ก์ปฌ์คํ ๋ฆฌ์ง = ๋๋น , ์๋ค๊ฐ ์
์ ์๋ต ๋ฐ์ ํ ํฐ์ ๊ทธ๋๋ก ๋ฃ๋๋ค
//๋ก๊ทธ์ธ ์ฑ๊ณต์ ์๋ก๊ณ ์นจ
}).fail(function(response){
console.log(response.responseJSON);
if(response.responseJSON.statusCode === 404){
alert('์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ธํ์ฌ ์ฃผ์ธ์');
} else{
alert('์๋ฒ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ต๋๋ค.');
}
});
}
๋๋์ด ์ฑ๊ณตํ๋ค. ํ์๊ฐ์ ์ฑ๊ณต ์๋ฆผ์ ๋๋์ด ๋ณผ ์ ์์๋ค. ์๋ฌด๋๋ url๋ฌธ์ + ajax ์ค์ ์ค๋ฅ๋ก cors์๋ฌ๊ฐ ๋ฌ๊ณ ๋คํํ ํด๊ฒฐํ๋ค. ์๊ฐ์ด ํ๋ฅผ์๋ก ์ด ์๋ฌ๋ฅผ ๊ณผ์ฐ ์ก์ ์ ์์๊น๋ผ๋ ์๊ตฌ์ฌ์ด ๋ค์๋๋ฐ ๋คํ์ด๋ค. ์ด๋ฒ ๊ธฐํ์ cors์ ๋ํด์ ์์ธํ ์๊ฒ๋ผ์ ์ข์ ๊ธฐํ๊ฐ ๋ ๊ฒ ๊ฐ๋ค.
๐Html์์ Script์ ์์น๊ฐ ๋ฏธ์น๋ ์ํฅ
ํ๋ก์ ํธ๋ฅผ ์๋ฃํ ํ Netlify๋ฅผ ์ด์ฉํด ๋ฐฐํฌ๋ฅผ ํ๊ณ ๋์ ๋ดค๋๋ main page์ slide๊ฐ ์๋ํ์ง ์์๋ค. ํ์ฐธ ์ด์ ๋ฅผ ์ฐพ๋ค๊ฐ script์ ์์น๋ฅผ ๋ฐ๊ฟ์ฃผ๋ ๋ค์ ๋์ํ๋ค.
alert("hi")๋ฅผ ๋ฃ์ด ํ ์คํธ๋ฅผ ํด๋ดค์ ๋๋ ์ถ๋ ฅ์ด ๋ผ์ ์ ๋๋ก ์ฐ๊ฒฐ์ด ๋ ์ค ์์๋๋ฐ ์๋์๋ค. ๋๋์ฒด ์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ ๊น?
๋ธ๋ผ์ฐ์ ๋์ ๋ฐฉ์
์ฐ์ scriptํ๊ทธ์ ์์น์ ๋ํด์ ์ค๋ช ํ๊ธฐ ์ ์ ๋ธ๋ผ์ฐ์ ์ ๋์ ๋ฐฉ์์ ๋ํด์ ์์๋ด์ผํ๋ค.
- HTML ํ์ผ ์ฝ๊ธฐ
- HTML๋ฌธ์๋ฅผ ํ ์ค ํ ์ค ์์ฐจ์ ์ผ๋ก ํ์ฑ
- DOM ํธ๋ฆฌ ๋ง๋ค๊ธฐ
- CSSOM ํธ๋ฆฌ์ DOM ํธ๋ฆฌ๋ฅผ ๊ฒฐํฉํ์ฌ ๋ ๋ ํธ๋ฆฌ ๊ตฌ์ถ (Attachment)
- ํ๋ฉด์ ํ์ํ๊ธฐ
์ด๋ ๊ฒ ์์ ์์๋๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ๋์ํ๊ฒ ๋๋๋ฐ, HTML ๋ฌธ์๋ฅผ ํ ์ค์ฉ ํ์ฑํ๋ฉด์ DOM ์์ฑ ์ค CSS๋ฅผ ๋ก๋ํ๋ <link> ํ๊ทธ ๋๋ <style> ํ๊ทธ๋ฅผ ๋ง๋๋ฉด DOM ์์ฑ์ ์ ์ ์ค์งํ ํ CSSํ์ฑ์ ๊ฒฐ๊ณผ๋ฌผ์ธ CSSOM์ ์์ฑํ๋ ๊ณผ์ ์ ์งํํ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ก๋ํ๋ <script> ํ๊ทธ๋ฅผ ๋ง๋๋ฉด DOM ์์ฑ์ ์ค์งํ ํ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ ์ด๊ถ์ ๋๊ฒจ์ ์์
์ ์ค์ํ ํ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ฑ์ด ๋๋๋ฉด ๋ค์ DOM ์์ฑ์ ์์ํ๊ฒ ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ <script>ํ๊ทธ์ ์์น์ ๋ฐ๋ผ์ ์ฐจ์ด๊ฐ ์๊ธฐ๊ฒ ๋๋ ๊ฒ์ด๋ค.
1. <head> ํ๊ทธ ์ฌ์ด์ ์์น (์ต์ ์์)
<!DOCTYPE html>
<html lang="ko">
<head>
<script src="./main.js"></script>
</head>
<body>
<h1>head ํ๊ทธ ์์ผ๋ก ๋ฃ๊ธฐ</h1>
</body>
</html>
HTML ํ์ฑ โถ๏ธ HTML ํ์ฑ ์ ์ง โถ๏ธ JavaScript ํ์ผ ๋ค์ด๋ก๋ ํ ์คํ โถ๏ธ HTML ์ด์ด์ ํ์ฑ
์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ผ์ ํฌ๊ธฐ๊ฐ ๊ฐ๋ณ๋ค๋ฉด ๋ฏธ๋นํ ์ํฅ์ ๋ฏธ์น๊ฒ ์ง๋ง ํฌ๊ธฐ๊ฐ ๋ฌด๊ฒ๊ณ , ์ธํฐ์ฃ์ ์๋๊ฐ ๋๋ฆฌ๋ค๋ฉด ์น์ฌ์ดํธ๋ฅผ ๋ณด๋ ๋ฐ๊น์ง ๋ง์ ์๊ฐ์ด ์์๋๋ค๋ ๋จ์ ์ด ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ํ DOM์ ์ ์ดํ๊ณ ์กฐ์ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์๋ค๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๊ณ ๋์ ๊ฐ์ ๊ฒฝ์ฐ์์ ๋ฐ์ํ ์ค๋ฅ๋ผ๊ณ ํ ์ ์๋ค.
2. <body> ๋, ์ฆ </body> ํ๊ทธ ์์ ์์น
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ <body> ๋, ์ฆ </body> ํ๊ทธ ์์ ์์นํ๋ ๋ฐฉ๋ฒ์ด๋ค.
<!DOCTYPE html>
<html lang="ko">
<head>
</head>
<body>
<h1>body ํ๊ทธ ๋์ ๋ฃ๊ธฐ</h1>
<script src="./main.js"></script>
</body>
</html>
HTML ํ์ฑ โถ๏ธ JavaScript ํ์ผ ๋ค์ด๋ก๋ ํ ์คํ
๋ด๊ฐ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ด๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ค์ด๋ก๋ํ๊ธฐ ์ HTML ์ฝ๋๋ฅผ ๋ชจ๋ ํ์ฑ ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๊ฐ ํ๋ฉด์ ๋ด์ฉ์ ๋นจ๋ฆฌ ๋ณผ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
ํ์ง๋ง HTML ์ฝ๋๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์์กด์ ์ธ ์น์ฌ์ดํธ๋ผ๋ฉด ์ฌ์ฉ์๊ฐ ํ๋ฉด์ ๋ณด๊ธฐ๊น์ง์๋ ๋๊ฐ์ด ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
3. <head> ํ๊ทธ ์ฌ์ด์ ์์น + async ์์ฑ
์ธ ๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ฒซ ๋ฒ์งธ ๋ฐฉ์๊ณผ๋ ๋์ผํ์ง๋ง async ์์ฑ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ด๋ค.
<!DOCTYPE html>
<html lang="ko">
<head>
<script async src="./main.js"></script>
</head>
<body>
<h1>async ์์ฑ์ ์ถ๊ฐํด head ํ๊ทธ ์์ผ๋ก ๋ฃ๊ธฐ</h1>
</body>
</html>
HTML ํ์ฑ โถ๏ธ JavaScript ํ์ผ ๋ง๋๋ฉด ๋ณ๋ ฌ์ ์ผ๋ก ๋ค์ด๋ก๋ โถ๏ธ JavaScript ํ์ผ ๋ค์ด ์๋ฃ๋๋ฉด HTML ํ์ฑ ์ ์ง โถ๏ธ JavaScript ํ์ผ ์คํ โถ๏ธ HTML ์ด์ด์ ํ์ฑ
async ์์ฑ์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ง๋๋ฉด ๋ณ๋ ฌ ๋ค์ด๋ก๋ ๋๊ธฐ ๋๋ฌธ์ ๋ค์ด๋ก๋ ์๊ฐ์ ์ ์ฝํด์ ์๋๊ฐ ๋นจ๋ผ์ง ์ ์์ง๋ง,
์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ์คํ์ด ๋ ๋ ์ ์ HTML ํ์ฑ์ด ๋ฉ์ถ๊ธฐ ๋๋ฌธ์ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์์์ ๋ฌธ์ ์ ์ด ๊ทธ๋๋ก ๋ํ๋ ์ ์๋ค.
4. <head> ํ๊ทธ ์ฌ์ด์ ์์น + defer ์์ฑ
๋ง์ง๋ง์ผ๋ก defer ์์ฑ์ ์ถ๊ฐํ์ฌ <head> ํ๊ทธ ์ฌ์ด์ ์์นํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
<!DOCTYPE html>
<html lang="ko">
<head>
<script defer src="./main.js"></script>
</head>
<body>
<h1>defer ์์ฑ์ ์ถ๊ฐํด head ํ๊ทธ ์์ผ๋ก ๋ฃ๊ธฐ</h1>
</body>
</html>
HTML ํ์ฑ โถ๏ธ JavaScript ํ์ผ ๋ง๋๋ฉด ๋ณ๋ ฌ์ ์ผ๋ก ๋ค์ด๋ก๋ โถ๏ธ HTML ์ ์ฒด ํ์ฑ ํ JavaScript ํ์ผ ์คํ
defer ์์ฑ์ ์ถ๊ฐํ๋ฉด ์์ ์ค๋ช ํ async์ ๋ฐฉ์๊ณผ ๊ฐ์ด HTML ํ์ฑํ๋ ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ค์ด๋ก๋๋ฅผ ์๋ฃํ๊ณ ํ์ฑ์ด ์๋ฃ ๋๋ฉด ํ์ผ์ด ์คํ๋๋ค. ๋ฐ๋ผ์ ์๋์ ์ธ๋ฉด์์๋ ๊ฐ์ฅ ์ฐ์ธํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
async, defer ๋ค์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ก๋
async, defer ๋๊ฐ์ง ์์ฑ์ ๊ฒฝ์ฐ์ HTML์ ํ์ฑํ๋ ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ ํ๋ค๋ ๊ณตํต์ ์ด ์์ง๋ง ๋ค์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ก๋ํ๋ ๊ฒฝ์ฐ ์ฐจ์ด์ ์ด ๋์ฑ ํฌ๊ฒ ๋๊ปด์ง๋ค.
๐defer์ฌ์ฉ ํ slide ์๋ ๋ฌธ์ ์
์๋์ ์ธ ๋ฉด์์ ๊ฐ์ฅ ์ฐ์ธํ๋ค๊ณ ์๊ฐํ๋ script์ defer์์ฑ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋๋ setInterval( , 5000)์์ ์ค์ ํ๋ ์นด์ดํฐ๊ฐ ์ ๋๋ก ๋์ํ์ง ์์๋ค.
๋ง์ฝ HTML์ด ์์ ํ ๋ก๋๋๊ณ ํ์ฑ๋๊ธฐ ์ ์ ์คํฌ๋ฆฝํธ๊ฐ slidefun(counter)๋ฅผ ์คํํ๋ฉด, ์ค์ ํ ํด๋์ค๋ฅผ ๊ฐ์ง ์์๋ฅผ ์ฐพ์ ๋ ์ด๋ค ์์๊ฐ ์์ง ๋ก๋๋์ง ์์๊ฑฐ๋ ์์๋ณด๋ค ๋ ์ ๊ฒ ๋ก๋๋์์ ์ ์๋ค.
๊ทธ๋์ JavaScript ์ฝ๋๋ฅผ DOMContentLoaded ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ก ๊ฐ์ธ HTML ๋ฌธ์์ ์์ ํ ๋ก๋ ํ์ ์คํ๋๋๋ก ํ์๋ค.๊ทธ๋ฌ๋ ์ฌ์ค ์ด์๊ฐ์ด ํ๋ฉด ์๊น 2๋ฒ ๋ฐฉ๋ฒ๊ณผ ๋ค๋ฅผ๊ป ์์ง๋ง ๊ทธ๋๋ ์๋๋ฉด์์ ์กฐ๊ธ ์ฐ์ธํ๊ธดํ๋ค.
๊ทธ๋ฌ๋22 DOMContentLoaded ๋ฅผ ์ฌ์ฉํ์ ์ ํจ์๊ฐ ์ ์ธ์ ๋์์ง๋ง ์ฌ์ฉ์ด ์๋๋ค๋ ์๋ฌ๊ฐ ๋ฌ๋ค. ๊ทธ๋์ slide์ ๋ฐฉํฅํค๋ฅผ clickํด๋ ๋์์ด ๋์ง ์๋๋ค. ์ด๊ฒ ๋๋์ฒด ์๊ทธ๋ฐ๊ฑธ๊น ์๊ทธ๋ฐ๊ฑฐ์์?? ๊ทธ๋์ ์ต์ข ์ผ๋ก๋ 2๋ฒ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.!!
๐์ต์ข APMA ํ๋ก์ ํธ
๋ฉ์ธ ๋์์ธ๋ ์์ ๋งํฌ์ ์๋๋๋ก ์ํ๊ณ ๋ค์ ์ ๋ฉด์ ์ผ๋ก ์์ ํ๋ค. ์ฌ์ฉ์๋ค์ด ๋ฏธ์ ๊ด ์น์ฌ์ดํธ์ ๋ค์ด์์ ๋ ์ด๋ค ์ ๋ณด๋ค์ด ํ์ํ ๊น๋ฅผ ๊ณ ๋ฏผํ๋ค ๋ณด๋๊น ๋ฏธ์ ๊ด๊ณผ ์ ์์ํ์ ๋ํ ๋๋ต์ ์ธ ์ค๋ช ์ ๋ฃ์ด์ผ๊ฒ ๋ค๊ณ ๊ฒฐ์ฌํ๋ค.
https://apma-project.vercel.app/index.html
APMA
Katherine Bernhardt <์ค๋ ์ง ์์ด๋ก๋น ์ค์> 1975๋ ์ ๋ฏธ๊ตญ์์ ํ์ด๋ ์บ์๋ฆฐ ๋ฒํ๋๋ ํ์ฌ ๋ด์์ ์ค์ฌ์ผ๋ก ํ๋ํ๋ ์๊ฐ์ ๋๋ค. ํฌ๋ก์ค, ๋ค์ค๋ฒ ์ด๋, ํํฌ ํฌ๋, ํฌ์ผ๋ชฌ ๋ฑ ๋์ค๋ฌธํ ์ ์ด๋ฏธ์ง๋ค
apma-project.vercel.app
๐๋๋ ์
๋ค์ ๋ณด์์ ํ์์๋ ์ฌ์ ํ ์์ฌ์ด ๋ถ๋ถ๋ค์ด ์์๊ณ ์๊ฐ๋ง ์์ผ๋ฉด ๋ ์ถ๊ฐํ๊ณ ์ถ์ ๊ธฐ๋ฅ๋ ๋ง์๋ค. ๋ฏธ์ ๊ด์ ์ฃผ์ ๋ก ์ก์ ๋งํผ ๊ทธ์ ์๋ง๋ ๊ธฐ๋ฅ๋ค์ด ๋ ํ์ํ๋ ๊ฒ ๊ฐ๋ค.
๐ก์ด๋ฒคํธ ๋ฐ ์ ์ ์ ๋ณด ์ ๋ฐ์ดํธ: ๋ฏธ์ ๊ด์ ์ต์ ์ด๋ฒคํธ, ์ ์ ๋ฐ ํ๋ ์ ๋ณด๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ธฐ๋ฅ
๐ก ์จ๋ผ์ธ ํฐ์ผ ์๋งค ๋ฐ ๋ฉค๋ฒ์ญ ๊ธฐ๋ฅ: ๋ฐฉ๋ฌธ์๋ค์๊ฒ ํธ๋ฆฌํ ์จ๋ผ์ธ ํฐ์ผ ์๋งค ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ
โพ๏ธ ๋น๊ต์ ๋ฌด๊ฑฐ์ด ์ฌ์ง๋ค์ด ๋ค์ด๊ฐ๋๊น ๋ก๋ฉ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆผ
โ ์๋ฒ๋ฅผ ์ผ๋์ง ์์ผ๋ฉด ๋ก๊ทธ์ธ๊ณผ ํ์๊ฐ์ ๊ธฐ๋ฅ์ด ๋์ํ์ง ์์
โ DOMContentLoaded ๋ฅผ ์ฌ์ฉํ์ ์ ์ฌ์ฉ๋์ง ์๋ ํจ์ ๋ฐ์ ์ด์ ์ ํํ ์๊ธฐ
'ํ๋ก์ ํธ > APMA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
CORS๋? (0) | 2023.09.02 |
---|---|
Ajax๋ ๋ฌด์์ธ๊ฐ? (feat. success์ done์ ์ฐจ์ด) (0) | 2023.08.11 |