아래 내용은 CSS 적용 방법(인라인/내부/외부)과 선택자(selector)의 기본을 정리한 뒤, JavaScript 적용 방법(인라인/내부/외부)과 DOM 로드 순서에 따른 실행 차이를 실습 코드로 한 번에 확인하는 글이다.
CSS(Cascading Style Sheets)는 HTML 요소의 스타일(디자인/레이아웃)을 정의하는 스타일시트 언어다.
HTML 구조(내용)와 CSS(표현)를 분리하면 유지보수와 재사용성이 좋아진다.
CSS는 보통 아래 3요소로 구성된다.
HTML 태그에 style=""로 직접 스타일을 준다.
예제:
<h4 style="color: green;">디자인 적용 방법(1) : 인라인 스타일</h4>
<head> 내부의 <style>에 작성해서 문서 전체에 적용한다.
예제(일부):
li { color: palevioletred; }
.c1 { font-size: 18px; color: orange; }
#i1 { color: gray; font-weight: bold; }
별도의 .css 파일을 만들고 <link rel="stylesheet" href="...">로 연결한다.
예제:
<link rel="stylesheet" href="css/myStyle.css">
특정 태그 전체에 적용된다.
li { color: palevioletred; }
그래서 아래 리스트의 모든 li가 기본적으로 해당 색으로 찍힌다.
<ol>
<li>태그 선택자 적용 예시</li>
...
</ol>
class="..."가 붙은 요소에 적용된다.
동일한 클래스를 여러 요소에 재사용할 수 있다.
.c1 { font-size: 18px; color: orange; }
.c2 { text-decoration: underline; }
그리고 예제처럼 클래스는 중첩도 가능하다.
<li class="c1 c2">클래스 중첩 적용 예시</li>
id="..."에 적용된다.
한 문서에서 id는 보통 유일해야 하며, DOM 접근(JS)에서도 자주 사용된다.
#i1 { color: gray; font-weight: bold; }
<li id="i1" class="c1">아이디 선택자 적용 예시</li>

“직계 자식”만 대상으로 한다.
div > p { color: green; }
예제에서 div 바로 아래의 p만 초록색이 된다.
“아래에 포함된 모든 후손”이 대상이다.
div section p { color: purple; }
즉 div 아래 section 아래의 p는 보라색이 된다.

요소에 onclick="..."처럼 바로 코드를 적는다.
<button onclick="alert('alert 인라인 이벤트 핸들러 실행')">인라인 적용 버튼</button>

<script> 태그로 HTML 문서 안에 함수를 정의하고 이벤트에서 호출한다.
예제(Head에 선언된 함수):
<script>
const update = () => { alert('update 함수 실행'); }
const update2 = () => {
document.getElementById("update2").innerHTML = "내용이 변경되었습니다.😍😍😍";
}
</script>
예제(Body에 선언된 함수):
<script>
const update3 = () => {
document.getElementById("update3").innerHTML = "내용이 변경되었습니다.😀😀😀";
}
</script>


별도의 .js 파일로 분리한 뒤 src로 연결한다.
<script src="js/myJs.js"></script>
이 방식은 여러 페이지에서 재사용하기 좋고 유지보수에도 유리하다.

HTML은 위에서 아래로 순차적으로 파싱되기 때문에, head에서 DOM을 아직 만들기 전에 document.getElementById(...)를 실행하면 원하는 요소를 못 찾는 문제가 생길 수 있다.
예제의 이 부분이 대표적으로 위험하다.
<script>
document.getElementById("load1").innerHTML = "head에서 선언된 스크립트가 실행되었습니다.";
</script>
<p id="load1">은 아직 body에 나오지도 않았는데 head에서 접근하려고 하기 때문에, 실행 시점에 따라 오류가 날 수 있다.
반대로 body 아래쪽에서 실행하면 이미 DOM이 만들어진 뒤라 접근이 가능하다.
<script>
document.getElementById("load2").innerHTML = "body에서 선언된 스크립트가 실행되었습니다.";
</script>

실무에서는 보통 다음 중 하나로 해결한다.
DOMContentLoaded 이후에 실행되도록 감싼다.<script defer src="..."> 같은 로딩 전략을 사용한다.