
아직 JavaScript가 무엇이고, 왜 필요한지 감이 잘 안 오실 수 있습니다. 그래서 이번에는 가능한 한 쉽고 자세하게, 길게 풀어서 설명해 드리겠습니다. 차근차근 따라와 보세요!
LiveScript라는 이름이었는데, 당시 인기 있던 Java의 이름을 일부러 따서 'JavaScript'로 바꿔 홍보 효과를 노렸습니다.이 방식은 서버에서 새로운 정보나 페이지를 받아오려면 항상 브라우저 → 서버로 요청을 다시 보내야 했습니다. 예를 들어, 상품 주문 페이지에서 '주문하기' 버튼을 누르면, 서버가 주문 데이터를 처리하고, 그 결과를 포함한 새로운 HTML 페이지를 돌려주는 식이죠.
JavaScript는
웹페이지에서의 역할
Java와는 별개
JavaScript는 웹페이지를 단순히 '보고 끝내는' 것이 아니라, 사용자와의 실시간 상호작용을 가능케 해 준 언어입니다.
HTML과 CSS가 정적인 구조와 디자인을 담당한다면,
JavaScript는 ‘움직임’과 ‘반응’, ‘동적 기능’을 담당한다고 생각하시면 이해하기 쉽습니다.
이제부터 JavaScript를 배우실 때, 다음과 같은 점을 기억하시면 좋습니다:
이렇게 전반적인 개념을 조금 길게, 쉽게 풀어봤습니다. 이제 어느 정도 “아, JavaScript가 이런 언어구나!” 하고 감이 잡히셨기를 바랍니다. 앞으로 구체적인 예제 코드나 실습을 통해, 실제로 웹페이지가 어떻게 동적으로 변하는지 체험해 보시면 훨씬 이해가 빠를 거예요.
이해가 잘 되셨길 바라며, 더 궁금한 점이 있다면 언제든 질문해 주세요!
아직 낯선 내용이 많아 보이실 수 있지만, 이제 이 예시를 통해 “JavaScript를 실제 웹페이지에 어떻게 적용하는지”를 조금 더 구체적으로 이해해 보겠습니다. 설명이 길지만 천천히 따라와 보세요!
여러분께서 받으신 예시 프로젝트에는 다음과 같은 구성요소가 있습니다.
images 폴더 (이미지가 들어 있음) styles 폴더 (CSS 파일들이 들어 있음) scripts 폴더 (JavaScript 파일이 들어 있음) 이 외에도 .gitignore나, 편집기 관련 설정 파일 등이 있을 수 있지만,
이들은 버전 관리나 편집기 설정을 위한 것으로 웹페이지 자체와는 무관합니다.
그러니 무시하셔도 괜찮아요.
app.css 등의 스타일(CSS) 파일을 보관합니다. app.js 파일이 있습니다.dynamic.html, weakly-typed.html 등 추가 설명을 담은 개별 HTML 파일들이 들어 있습니다. 원래 웹페이지에서 특정 링크를 클릭하면,
클릭된 링크의 경로(예: info/dynamic.html)로
브라우저가 다시 서버에 요청을 보냅니다.
서버는 해당 HTML 파일을 찾아서 브라우저로 돌려주고,
브라우저는 새 페이지 전체를 새로 띄우게 됩니다.
index.html 페이지에서 dynamic.html 링크를 클릭 → 서버에 새 요청 → dynamic.html 전체가 응답으로 옴 → 브라우저가 새로운 페이지를 표시이 방식도 전혀 문제가 없지만,
사용자 입장에서는 페이지가 전환되면서 끊기는 느낌이 있을 수 있고,
페이지 전환 로딩 때문에 기다려야 하는 경우가 생길 수도 있습니다.
이제 구체적인 예시를 살펴볼게요.
index.html 파일을 텍스트 편집기(메모장, VSCode 등)로 열어봅시다. <head> 태그 안에 보통 CSS 파일을 불러오는 <link> 태그들이 있죠. 그 아래나 적절한 위치에 <script> 태그를 추가합니다. 예시:<head>
<link rel="stylesheet" href="assets/styles/app.css" />
<!-- 여기에 스크립트 태그 추가 -->
<script src="assets/scripts/app.js" defer></script>
</head>
src="assets/scripts/app.js":app.js)에 우리가 직접 작성한 JavaScript 코드가 들어 있습니다.defer 속성:원래 dynamic.html이나 weakly-typed.html에 대한 링크는 이렇게 되어 있을 겁니다:
<a href="info/dynamic.html">dynamic</a>
<a href="info/weakly-typed.html">weakly typed</a>
이대로라면 클릭 시 새 페이지(dynamic.html)로 이동해 버립니다.
우리는 오버레이로 내용을 보여주고 싶으니, 다음과 같은 작업을 합니다.
href를 #(해시 기호) 로 바꿔, 새 페이지로 이동하지 않도록 만듭니다. dynamic.html 안에 있는 내용을 가져올 텍스트)를 data-text 같은 커스텀 속성으로 붙입니다. class="info-modal" 등을 부여합니다.<a href="#" class="info-modal" data-text="여기에 dynamic.html의 텍스트...">dynamic</a>
<a href="#" class="info-modal" data-text="여기에 weakly-typed.html의 텍스트...">weakly typed</a>
dynamic.html 파일을 열어서 <p>...</p> 내용을 복사해, data-text="..." 안에 넣을 수도 있습니다. 이렇게 하면, 클릭 시 JavaScript가 data-text에 담긴 내용을 읽어다가 모달창(오버레이)에 표시하게 만들 수 있습니다.
assets/scripts/app.js 파일을 열어보면, 초보자분께는 다소 낯선 문법들이 있을 겁니다.
document.querySelectorAll(...) forEach, addEventListener classList.add('open') 등등…자세한 내용은 차근차근 배워가실 텐데, 지금은
“아, 이 파일 안에는 오버레이(모달) 요소를 화면에 띄우거나 숨기는 로직이 들어 있구나” 정도로만 이해해 주시면 돼요.
핵심 아이디어
- HTML에서
<a href="#" class="info-modal" data-text="...">태그들을 찾는다.- 사용자가 이 링크를 클릭하면, data-text에 들어 있는 내용을 기반으로 팝업(오버레이) 창을 생성하여 화면에 띄운다.
- 배경을 클릭하거나 닫기 버튼을 누르면, 다시 창을 없앤다.
index.html을 브라우저로 엽니다. app.js를 <script> 태그로 불러온 상태라고 가정) dynamic 이나 weakly typed 링크를 클릭하면, data-text에 담긴 내용이 팝업창 안에 표시될 것입니다. 이것이 전통적인 페이지 전환과의 큰 차이점입니다.
서버로 가서 새 HTML 페이지를 가져오지 않고,
이미 로드된 페이지 안에서 JavaScript가 동적으로 화면을 변경하므로,
사용자 경험이 훨씬 자연스럽고 빠르게 느껴집니다.
여기까지 따라오셨다면,
“아, JavaScript가 이런 식으로 HTML에 새 기능을 붙이거나, 화면을 동적으로 변경할 수 있구나!”
라는 느낌을 잡으셨을 겁니다.
동적 약형 프로그래밍 언어
해석형(Interpreted) 언어이면서, 요즘은 런타임(JIT) 컴파일이 함께 이루어짐
호스팅(Hosted) 언어
브라우저에서 DOM 제어
이 개념들은 아직 추상적으로 느껴질 수 있어요.
다음 단계에서 이 용어들을 하나씩 풀어서 이해하게 될 겁니다.
걱정하지 마세요! 개념만 들어두시고, 직접 코드 예제를 반복하다 보면
어느 순간 “아, 이걸 이렇게 표현하는 거였구나.” 하고 머릿속에 연결이 되실 겁니다.
폴더 구조와 index.html, assets/scripts/app.js 파일을 연결해,
오버레이(모달) 형태로 내용을 표시하는 예시를 살펴봤습니다.
기존의 전통적인 “링크 → 새 페이지 로드” 방식을 대체하거나 보완하는 수단으로,
JavaScript가 동적으로 웹페이지를 바꾸는 모습을 확인했습니다.
이 과정을 통해 JavaScript란 무엇인가? 왜 필요한가? 에 대한 답을 조금 더 실제 사례로 이해할 수 있게 되었습니다.
이어서 “동적 언어, 약형 언어, 해석형 언어, 호스팅된 언어”가 어떤 의미인지,
그리고 실제로 JavaScript 문법을 어떻게 배우는지, 하나씩 익히면 됩니다.
이처럼 아주 간단한 예시 하나만으로도, JavaScript가 어떤 문제를 해결해주는지 알 수 있죠.
앞으로 배울 내용이 많지만,
“아, 우리는 이렇게 더 나은 사용자 경험을 제공하기 위해 JavaScript를 쓰는 거구나!”
라는 점을 기억하시면, 학습 동기가 훨씬 커지실 거예요.
이제부터 본격적으로 JavaScript 문법과 원리를 배워나가면서,
위와 같은 오버레이 외에도 애니메이션, 비동기 데이터 로딩, 사용자 입력 검증 등등
수많은 동적 기능들을 직접 만들어 보실 수 있습니다.
조금씩 해보시면서 부딪히고, 또 해결하다 보면 “JavaScript가 이렇게 편리한 도구였구나!” 하고 느끼실 날이 곧 오실 겁니다.
궁금한 점이나 막히는 부분이 생기면 언제든 질문해 주세요!
아래 예시는 “index.html”에서 클릭 시 새로운 페이지 전체를 로드하지 않고, 자바스크립트를 통해 오버레이(모달 창) 형태로 내용을 표시하도록 구현한 간단한 예시입니다.
폴더 구조 예시(최소한으로 구성):
my-example-project/
├─ index.html
├─ info/
│ ├─ dynamic.html
│ └─ weakly-typed.html
└─ assets/
├─ styles/
│ └─ app.css
└─ scripts/
└─ app.js
주의: 실제로는
images폴더나 기타 파일이 있을 수 있지만, 여기서는 핵심 코드만 담은 최소 예시 구조를 보여드립니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<title>JavaScript Overlay Example</title>
<!-- CSS 연결 -->
<link rel="stylesheet" href="assets/styles/app.css" />
<!-- 자바스크립트 연결 (defer 속성 주의) -->
<script src="assets/scripts/app.js" defer></script>
</head>
<body>
<h1>예시 페이지</h1>
<p>
이 페이지에서 <strong>JavaScript</strong>로 오버레이(모달) 창을 띄우는 기능을 시연합니다.
</p>
<p>
<!-- a 태그(링크)인데, href="#"로 설정하고,
클릭 시 모달을 띄우기 위해 data-text 속성에 내용을 담습니다. -->
<a
href="#"
class="info-modal"
data-text="여기는 dynamic.html의 텍스트라고 가정합니다.
JavaScript를 통해 이 내용이 모달에 표시됩니다."
>
dynamic
</a>
|
<a
href="#"
class="info-modal"
data-text="여기는 weakly-typed.html의 텍스트라고 가정합니다.
타입이 엄격하지 않고 유연한 자바스크립트 특징을 설명합니다."
>
weakly typed
</a>
</p>
<p>
원래라면 <code>info/dynamic.html</code>나 <code>info/weakly-typed.html</code>로
직접 이동했을 텐데,<br>
이제는 새로운 페이지 전체를 불러오지 않고,<br>
<strong>오버레이 창</strong>을 이용해 내용을 확인할 수 있습니다.
</p>
</body>
</html>
href="#"로 지정하여 페이지 새로고침/이동을 막습니다.data-text속성에 표시할 텍스트(본문 내용)를 넣어두고,class="info-modal"로 JavaScript가 인식할 수 있게 만듭니다.
/* assets/styles/app.css */
/* 본문 기본 스타일 */
body {
font-family: sans-serif;
margin: 20px;
line-height: 1.6;
}
/* 모달 배경(뒷배경) */
.modal-backdrop {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
/* 반투명 검정색 배경 */
background-color: rgba(0, 0, 0, 0.5);
/* 기본적으로 숨겨놓기 */
display: none;
justify-content: center;
align-items: center;
z-index: 9999; /* 다른 요소 위에 표시하기 위함 */
}
/* 모달 열림 상태에서 display를 바꿔줌 */
.modal-backdrop.open {
display: flex;
}
/* 실제 모달 창 */
.modal {
background-color: #fff;
padding: 20px;
width: 80%;
max-width: 500px;
border-radius: 8px;
position: relative;
box-shadow: 0 2px 8px rgba(0,0,0,0.3);
}
/* 닫기 버튼 */
.modal-close {
position: absolute;
top: 8px;
right: 8px;
background: none;
border: none;
font-size: 18px;
cursor: pointer;
}
.modal-close:hover {
color: red;
}
.modal-backdrop가 오버레이 배경을 담당합니다..modal-backdrop.open클래스가 붙으면display: flex;로 나타나도록 했습니다..modal은 실제 창(컨테이너) 역할을 하며,.modal-close는 X 버튼 스타일을 정의합니다.
// assets/scripts/app.js
document.addEventListener('DOMContentLoaded', function() {
// (1) .info-modal 클래스를 가진 모든 링크(앵커태그) 찾기
const infoLinks = document.querySelectorAll('a.info-modal');
// (2) 오버레이(배경) 역할을 할 div 생성
const backdrop = document.createElement('div');
backdrop.className = 'modal-backdrop';
// (3) 실제 모달 창(div) 생성
const modal = document.createElement('div');
modal.className = 'modal';
// (4) 모달 닫기 버튼 생성
const closeButton = document.createElement('button');
closeButton.className = 'modal-close';
closeButton.innerText = '✕'; // 또는 "닫기"
// (5) 모달 안에 내용이 들어갈 영역(div) 생성
const modalContent = document.createElement('div');
// (6) 구조 조합: 모달 안에 (닫기버튼, 컨텐츠) -> 백드롭에 모달 -> body에 백드롭
modal.appendChild(closeButton);
modal.appendChild(modalContent);
backdrop.appendChild(modal);
document.body.appendChild(backdrop);
// (7) 각 링크를 클릭했을 때 이벤트 처리
infoLinks.forEach(link => {
link.addEventListener('click', function(event) {
event.preventDefault(); // a 태그의 기본 동작(페이지 이동) 막기
// data-text 속성값 읽어오기
const text = link.getAttribute('data-text');
// 모달에 해당 텍스트를 넣기
modalContent.textContent = text;
// 모달 열기 (backdrop에 .open 클래스 추가)
backdrop.classList.add('open');
});
});
// (8) 모달 닫기 동작
// 배경을 누르면 닫히도록
backdrop.addEventListener('click', function() {
backdrop.classList.remove('open');
});
// 모달 자체를 클릭했을 땐 이벤트가 배경으로 전달되지 않도록(닫히지 않도록)
modal.addEventListener('click', function(event) {
event.stopPropagation();
});
// 닫기 버튼 누르면 모달 닫기
closeButton.addEventListener('click', function() {
backdrop.classList.remove('open');
});
});
- 핵심 포인트
document.querySelectorAll('.info-modal')로 해당 링크들을 모두 가져옴- 링크 클릭 시
event.preventDefault()로 페이지 이동을 막고,data-text속성에서 텍스트를 꺼내 모달 창 내용으로 넣음.modal-backdrop에.open클래스를 붙여서 표시/숨김 제어
실제로 info/dynamic.html 이나 info/weakly-typed.html을 따로 열어보면, 다음처럼 일반 HTML이 있을 수 있습니다. 이 예시에서는 페이지 이동 없이 data-text만 발췌해 사용하는 용도이므로, 꼭 필요하지는 않습니다. 그래도 참고용으로 보여드리면:
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Dynamic</title>
</head>
<body>
<h2>Dynamic Page 예시</h2>
<p>
이 페이지는 JavaScript의 동적(Dynamic) 특성을 설명합니다. <br>
하지만 오버레이로 보여주려면 data-text 속성에 직접 텍스트를 붙여넣고, <br>
이 파일을 굳이 새로 열지 않아도 됩니다.
</p>
</body>
</html>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Weakly Typed</title>
</head>
<body>
<h2>Weakly Typed Page 예시</h2>
<p>
JavaScript는 약형(Weakly Typed) 언어이므로, 변수의 타입을 엄격히 고정하지 않고, <br>
실행 도중에 유연하게 타입이 바뀔 수 있습니다.
</p>
</body>
</html>
만약 직접 링크로 이동하려면
<a href="info/dynamic.html">dynamic</a>처럼 원래대로 되돌리시면 됩니다.
하지만 현재 예시에서는 이 파일들을 새 페이지로 오픈하지 않고,data-text에 담아서 모달로만 띄우고 있습니다.
index.html을 크롬, 사파리, 파이어폭스 등 브라우저로 열어보세요(더블클릭 혹은 드래그 앤 드롭). dynamic / weakly typed 링크를 클릭하면, data-text에 넣어둔 내용이 표시됩니다. ✕ 버튼을 누르면 창이 닫힙니다.<script> 연결) data-text로 내용만 추출하여 사용 이 코드 구조를 통해, 새로운 HTML 페이지를 로드하지 않고도
JavaScript로 이미 로드된 페이지에 “동적”인 모달 창을 띄우는 방법을 이해하실 수 있습니다.
이렇게 자바스크립트를 통해 “화면 일부만 갱신”하거나 “오버레이 창을 띄우는 것”이,
요즘 모던 웹에서 사용자 경험을 개선하는 핵심 방법 중 하나입니다.
원하시는 대로 텍스트나 스타일을 변형하거나,
좀 더 복잡한 애니메이션 등을 추가해 보시며 연습해 보시면 좋습니다.
궁금하신 점이 있다면 언제든 질문해 주세요!