Document : 브라우저가 HTML을 읽어서 웹 페이지를 나타내면 등 여러 요소를 포함하여 Document Object를 형성하는데 이를 문서 객체 모델이라고 한다.(DOM, Document Object Model) 즉, 웹 페이지 내의 모든 컨텐츠를 객체로 나타내준다.
Document Object는 페이지의 URL을 얻거나 문서에 새로운 요소를 생성하는 등의 기능을 수행할 수 있다.
console.log(document);
// #document
// <!DOCTYPE html>
// <html>
// <head>...</head>
// <body>...</body>
// </html>
// document는 현재 페이지의 모든 요소를 객체로 나타내준다. 예를 들어 body 태그에 접근하고 싶다면
const bodyTag = document.body;
const bodyTag2 = document["body"];
// 이런 식으로 변수에 선언할 수 있고 접근할 수 있다.

위 처럼
bodyTag변수를 선언하고, 이를 콘솔에 입력하면 이미지처럼 페이지 내에 있는 모든 body 요소를 반환한다.
Document 객체는 HTML 요소와 관련된 작업을 도와주는 다양한 메소드를 제공한다. 아래와 같은 이벤트들을 Document 객체를 통해 사용할 수 있게 된다.

위 이미지처럼 현재 페이지에서 document.getElementsByTagName("script") 를 입력하면 HTML 태그 중 <script>태그를 모두 배열에 담아 반환한다.
HTML 요소의 생성
const newElement = document.createElement("p") // <p></p>
const newAttribute = document.createAttribute(style) // style=""
const newTextNode = document.createTextNode("새로운 텍스트") // "새로운 텍스트"
위 코드에서 처럼 변수에 선언할 수 있는데, 요소의 생성만으로는 아무런 작용을 하지 않는다. 생성했다면 노드를 append, insert 등의 메소드를 사용하여 HTML 요소 사이에 생성된 요소를 추가, 삽입할 수 있다.
HTML 요소에 새로운 노드 추가
const aChild = element.appendChild(aChild); // element 의 자식 노드 중 맨 마지막에 aChild 추가.
const insertedNode = parentNode.insertBefore(newNode, referenceNode); // parentNode의 자식인 referenceNode의 앞에 newNode 추가.
HTML 요소의 내용 수정
※ innerText vs textContent
innerText는 텍스트의 렌더링 후 모습을 인식할 수 있지만 textContent는 그렇지 않다. 예를 들어 "#source { color: red; }" 와 같은 입력값이 있다고 가정하고, 이를 innerText, textContent를 이용하여 요소를 텍스트 콘텐츠를 대입하면,
- innerText : id="source" 인 요소에 글자 색을 red로 바꾼다.
- textContent : 대입한 위치에 "#source { color: red; }" 문자열이 삽입된다.
처음 프론트엔드 개발자를 희망하면서 HTML, CSS, Javascript를 순서대로 공부했는데, HTML을 공부할 때 Tag의 의미에 대해 중점적으로 공부하고 그 외에도 시맨틱 마크업, Table 요소, Form 요소 등 Tag의 사용에 대한 부분만 공부하고 넘어갔었다.
그 이후에 Javascript의 매우 기초적인 부분만 학습한 후 개인적으로 팀 프로젝트 경험이 없기에, 개인적으로 프로젝트 경험을 해보고 싶기도 하고, 실제로 웹 페이지를 보면 대략적으로 어떻게 만들면 되겠다는 생각이 들다가도 막상 html 파일을 생성하여 만드려고 하면 어디서부터 무엇을 작성해 나가야될지 막막해서 개인 프로젝트를 진행했었다. 취미인 운동과 연관지어서 운동의 정보, 운동 기록 등을 할 수 있는 사이트를 만들고 싶어서 HTML, CSS, Javascript만을 이용하여 만들기 시작했다.
직접 페이지를 만들어 보면서(21. 8. 18 현재 진행 중) 정말 많은 것을 배웠다. 그러나 지금 다시 코드들을 살펴보면 정말 무식하게 작성한 것 처럼 보인다. Javascript로 HTML 요소를 컨트롤 하는 방법을 몰랐고, HTML 요소를 생성하여 적합한 위치에 추가, 삽입 시키는 동작을 할 줄 몰랐기 때문이다. 따라서 동적인 구현은 거의 CSS를 이용한 Animation, transition 효과가 전부였다.
오늘 Javascript를 이용하여 코드를 컴포넌트화하고 Todo List를 만들어보는 공부를 진행했는데, document, HTML 요소를 다루는 기초에 대해 좀 더 확실하게 짚고 넘어가야 겠다고 생각했고, 정리가 된 것 같다.
직접 코드를 작성하면서 개인적인 웹 사이트를 만드는 과정을 통해 하지 않았을 때 보다 많은 내용들을 배웠고, 반복하면서 익숙해 졌었다. 그러나 이런 기초를 모른다면 제자리 걸음일 뿐이라는 생각이 들었다.
웹 페이지 작성을 포기하지 않고 완성하되 중간중간 기초가 되는 지식들을 지속적으로 공부하고 정리하면서 성장해나갈 계획이다.
https://developer.mozilla.org/ko/docs/Web/API/Document
https://www.w3schools.com/jsref/dom_obj_document.asp
https://ko.javascript.info/browser-environment
http://tcpschool.com/javascript/js_dom_document