본문 바로가기

웹 기초

[내일 배움 캠프, 웹 기초] html, <script> 태그의 위치

<html> 안에서 <script>의 위치는 중요하다. 그 이유는 <script>의 위치에 따라서 화면에 스크립트가 적용되지 않는 경우가 생기기 때문이다.

 

1. head 태그 안에 script 태그가 있는 경우

<head>
    <script>
        console.log(document.getElementById("title")); // null 반환 (HTML 아직 로드 전)
    </script>
</head>
<body>
    <h1 id="title">안녕하세요</h1>
</body>
  • ✅ HTML을 읽기 전에 스크립트가 실행됨
  • ✅ 보통 선언적 스크립트(전역 변수, 함수 정의)에 사용
  • ❌ DOM 요소가 아직 로드되지 않음 → document.getElementById() 같은 DOM 조작 불가능

 

  • html은 위에서부터 순차적으로 파싱이 된다.
  • html 파싱 중 script를 만나면, 파싱을 중단하고 script를 다운 및 실행한다.
  • 파싱이 끝나지 않은 상태에서 Script가 실행되기 때문에 Script가 제대로 실행되지 않게 된다. 정확하게는 DOM 요소를 사용하는 경우 제대로 실행되지 않게 된다.

 

 

2. body 내부에 위치한 경우

(1) body 시작 부분

<body>
    <script>
        console.log(document.getElementById("title")); // null 반환 (아직 로드 안됨)
    </script>
    <h1 id="title">안녕하세요</h1>
</body>
  • ✅ HTML 문서가 로드되는 초기에 실행
  • ❌ 여전히 DOM이 완전히 로드되지 않는다.

 

(2) body 끝 부분 (</body> 앞)

<body>
    <h1>안녕하세요</h1>
    <script>
        console.log("이 스크립트는 body 끝 부분에서 실행됩니다.");
    </script>
</body>
  • ✅ DOM이 모두 로드된 후 실행됨 → document.getElementById() 같은 DOM 조작 가능
  • ✅ 일반적으로 성능상 가장 추천되는 위치

 

 

 

 

3. async vs defer 속성

<script async src="script.js"></script>  // 비동기 실행 (다운로드 완료 즉시 실행)
<script defer src="script.js"></script>  // HTML 파싱 후 실행
  • async: HTML 파싱과 동시에 다운로드, 다운로드 완료 즉시 실행 (순서 보장 X)
  • defer: HTML 파싱과 동시에 다운로드, HTML 파싱 완료 후 실행 (순서 보장 O)

 

 

 

4. 정리

위치 특징 추천 여부
<head> 내부 HTML 파싱 전 실행 → DOM 조작 불가 ❌ (단, defer 사용 시 가능)
<body> 시작 부분 일부 DOM이 로드된 상태에서 실행될 수도 있음
<body> 끝 부분 모든 DOM이 로드된 후 실행 ✅ 추천
<script defer> HTML 파싱 후 실행 (순서 보장) ✅ 추천
<script async> 다운로드 즉시 실행 (순서 보장 X) ⚠️ 주의

가장 추천되는 방식은 <body> 끝 부분에 <script>를 배치하거나 defer 속성을 사용하는 것이다.