Skip to content
This page has been auto-translated and may contain errors.View in English

당신의 첫 HTML 페이지

docs.scrimba.com

모든 HTML 문서는 동일한 구조를 공유합니다: 문서 유형을 선언하는 한 줄, 모든 것을 감싸는 루트 요소, 페이지 정보를 담는 head, 그리고 사람들이 보는 콘텐츠를 담는 body입니다. 이 장에서는 이 구조를 한 줄씩 분해하고 브라우저에서 열 수 있는 파일로 저장합니다.

문서 스켈레톤

모든 페이지가 시작하는 스켈레톤입니다. 정확히 복사하고 body 안의 부분만 변경하면 됩니다:

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>내 첫 페이지</title>
  </head>
  <body>
    <h1>안녕하세요</h1>
    <p>이것이 내 첫 웹 페이지입니다.</p>
  </body>
</html>

첫 줄인 <!DOCTYPE html>은 브라우저에 이것이 최신 HTML 페이지라고 알립니다. 그 다음에는 페이지의 다른 모든 것을 감싸는 루트 요소 <html>이 옵니다. 그 안에는 두 개의 상자가 있습니다: <head>는 뒤에서 숨겨진 정보용이고, <body>는 방문자가 보는 단어와 그림용입니다. 당신의 제목과 단락은 body에 들어가야 합니다. 왜냐하면 그것이 보여지는 부분이기 때문입니다.

전체를 라벨이 붙은 소포로 생각하세요. doctype은 어떤 배송 시스템을 사용할지 말해주는 우표이고, <html>은 상자이며, head는 바깥쪽 라벨이고, body는 안에 들어있는 것입니다.

모든 문서는 동일한 네 부분으로 구성되며, 각 부분을 그 역할로 이름 지으면 도움이 됩니다:

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>내 첫 페이지</title>
  </head>
  <body>
    <h1>안녕하세요</h1>
    <p>이것이 내 첫 웹 페이지입니다.</p>
  </body>
</html>

<!DOCTYPE html>은 **문서 타입 선언**입니다. 이것은 HTML 태그가 아니라 스위치입니다: 이것이 있으면 브라우저가 1990년대 페이지를 위해 유지된 이전의 quirks mode가 아닌 표준 mode로 렌더링하도록 알립니다. <html>은 루트 요소이며, 다른 모든 요소를 포함하는 단 하나의 요소입니다. lang="en" 속성은 페이지의 언어를 나타냅니다. 그 다음 <head>는 페이지에 관한 정보를 담고 <body>는 콘텐츠를 담습니다. 들여쓰기는 필수는 아니지만, head와 body를 <html> 안에, 그리고 그들의 자식들을 그 안에 중첩시키면 구조를 읽기 쉽게 유지할 수 있습니다.

스켈레톤은 표준 모음처럼 보이지만, 각 줄은 브라우저가 문서를 처리하는 방식을 변경합니다.

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>내 첫 페이지</title>
  </head>
  <body>
    <h1>안녕하세요</h1>
    <p>이것이 내 첫 웹 페이지입니다.</p>
  </body>
</html>

<!DOCTYPE html>은 문서 타입 선언이며, 꺾쇠괄호가 있지만 요소가 아닙니다. 이것은 모드 스위치입니다. 이것이 있으면 브라우저는 **표준 mode**를 사용하므로 현재 레이아웃 및 박스 크기 조정 명세를 따릅니다. 이것을 생략하면 브라우저는 quirks mode로 돌아가는데, 이것은 박스 너비 같은 세부 사항을 잘못 처리하는 1990년대 동작의 에뮬레이션입니다. 오늘날 HTML에는 정확히 하나의 올바른 doctype만 있으며, 이것이 짧은 것입니다. XHTML 시대의 긴 버전의 doctype은 더 이상 사용되지 않습니다.

<html>은 루트 요소이며, 전체 문서 트리가 내려오는 단일 노드입니다. 다른 모든 것은 이것의 자손입니다. lang 속성은 여기에 있습니다. 왜냐하면 전체 문서의 기본 언어를 설정하기 때문입니다. <head><body>는 이 순서대로 그것의 유일한 두 개의 허용된 자식입니다: 메타데이터 먼저, 콘텐츠 다음. <head> 또는 <body> 태그를 생략하면 파서가 자동으로 삽입합니다 (그것이 다시 관용적 파싱입니다). 하지만 이들을 작성하면 당신의 소스와 결과 트리가 일치하므로, 둘 중 하나를 추론할 때 이것이 당신이 원하는 것입니다.

Juno문서 스켈레톤 모든 페이지는 동일한 틀로 시작합니다: <!DOCTYPE html>, 그 다음 <html><head><body>를 감싸는 것입니다. 그대로 복사하고 body에 당신의 말을 넣으세요. 아직 이것을 암기해야 할 필요는 없습니다. 당신이 충분히 여러 번 입력하면 자연스럽게 기억됩니다.
Juno문서 스켈레톤 네 부분, 각각 하나의 역할: doctype은 표준 mode를 켭니다. <html>은 루트이고, <head>는 페이지의 정보이고, <body>는 콘텐츠입니다. lang 속성은 <html>에 있습니다. 왜냐하면 전체 문서를 설명하기 때문입니다. 이 모양을 당신의 손가락에 익히면 모든 새로운 페이지가 동일한 신뢰할 수 있는 방식으로 시작합니다.
Juno문서 스켈레톤 doctype은 태그가 아닌 모드 스위치입니다: 이것이 있으면 표준 mode를, 없으면 quirks mode와 잘못된 박스 크기 조정을 얻습니다. <html>은 정확히 두 개의 자식을 가진 루트이고, head가 먼저 body가 다음이며, 파서가 당신이 깜빡하면 삽입합니다. 당신의 소스가 당신이 실제로 추론하고 있는 트리와 일치하도록 어쨌든 이들을 작성하세요.

head와 body에 무엇이 들어가는가

<html> 안의 두 상자는 다른 역할을 합니다. <head>는 브라우저가 알아야 하지만 방문자가 페이지에서 읽지 않는 것들을 담습니다. <body>는 방문자가 보는 모든 것을 담습니다.

html
<head>
  <title>내 레시피 노트</title>
</head>
<body>
  <h1>바나나 브레드</h1>
  <p>섞고, 붓고, 한 시간 동안 구우세요.</p>
</body>

<title>은 head에 있으며, 이것이 페이지의 이름입니다: 페이지 중간이 아니라 브라우저 탭에 나타납니다. 제목과 단락은 body에 있으므로 페이지 자체에 나타납니다. 시작할 때의 간단한 규칙: 방문자가 읽어야 하면 body에 들어갑니다.

이것은 페이지에 관한 정보 대 페이지의 콘텐츠입니다. <head>는 **메타데이터**용입니다: 문서의 콘텐츠가 아닌 문서에 관한 데이터입니다. <body>는 콘텐츠 자체이며, 브라우저 창에서 렌더링되는 부분입니다.

html
<head>
  <title>바나나 브레드 레시피</title>
</head>
<body>
  <h1>바나나 브레드</h1>
  <p>섞고, 붓고, 한 시간 동안 구우세요.</p>
</body>

가장 명확한 예는 <title>입니다. 이것은 페이지의 콘텐츠의 일부가 아니기 때문에 head에 있지만, 실제 작업을 합니다: 탭의 이름을 지정하고, 누군가가 페이지를 북마크할 때 저장되는 라벨이며, 검색 엔진이 결과에 표시하는 제목입니다. 다른 head 요소들도 동일한 논리를 따릅니다. 이들은 페이지를 구성하거나 설명합니다. head의 아무것도 페이지 영역에 그려지지 않으므로, 만약 당신이 head에 제목이나 이미지를 넣고 싶다면, 그것은 대신 body에 속합니다.

head는 문서가 자신을 설명하고 구성하는 곳입니다. body는 그 설명이 적용되는 콘텐츠입니다. head의 모든 것은 메타데이터이며, 페이지 영역에 표시되는 콘텐츠가 아닌 문서에 관한 데이터입니다.

html
<head>
  <title>바나나 브레드 레시피</title>
  <meta name="description" content="빠른 로프: 섞고, 붓고, 구으세요." />
</head>
<body>
  <h1>바나나 브레드</h1>
  <p>섞고, 붓고, 한 시간 동안 구우세요.</p>
</body>

<title>은 여러 번에 걸쳐 자신의 자리를 얻습니다. 브라우저 탭의 이름을 지정하고, 페이지가 북마크되거나 공유될 때의 기본 텍스트이며, 검색 결과의 클릭 가능한 제목이므로, 이것은 페이지에서 가장 높은 가치의 문자열 중 하나입니다. <meta name="description"> 요소는 검색 엔진이 그 제목 아래에 표시할 수 있는 요약 줄을 제공합니다. 이것은 페이지에서 절대 렌더링되지 않습니다. 이것이 핵심입니다.

head는 또한 당신의 다른 파일을 가져오는 요소들을 담습니다: CSS의 경우 <link rel="stylesheet">, JavaScript의 경우 <script>입니다. 물론 스크립트는 콘텐츠가 먼저 파싱되도록 body의 끝에 위치하곤 합니다. head는 body보다 먼저 파싱되므로, 이 규칙이 이것을 깨끗하게 유지합니다: 페이지가 콘텐츠를 읽기 전에 구성이 필요한 것 (인코딩, 스타일시트, 제목)은 거기에 속하고, 실제로 사람이 읽는 모든 것은 body에 속합니다.

Junohead와 body에 무엇이 들어가는가 Head는 뒤에서 숨겨지고, body는 보입니다. <title>은 head에 있고 브라우저 탭의 이름입니다. 당신의 제목과 단락은 사람들이 읽는 body에 있습니다. 방문자가 봐야 하면 body에 들어갑니다. 이 한 가지 질문으로 거의 모든 것이 분류됩니다.
Junohead와 body에 무엇이 들어가는가 Head는 메타데이터이고, 페이지에 관한 정보입니다. Body는 페이지의 콘텐츠입니다. <title>은 탭 이름이고, 북마크 라벨이고, 검색 제목이 모두 한 번에이므로, 이것이 head에 자리를 얻는 이유입니다. head의 아무것도 페이지에 그려지지 않으므로, 당신이 보여주려고 의도한 제목이나 이미지는 body에 속합니다.
Junohead와 body에 무엇이 들어가는가 Head는 문서를 설명하고 구성하고, body는 그 구성이 적용되는 콘텐츠이며, head가 먼저 파싱됩니다. <title><meta name="description">은 검색 엔진이 읽는 높은 가치의 문자열이며, 페이지에 절대 그려지지 않습니다. 페이지가 콘텐츠 읽기 전에 설정이 필요한 것, 인코딩과 스타일시트는 head에 들어가고, 사람이 읽는 모든 것은 body에 들어갑니다.

문자 집합과 뷰포트

거의 모든 페이지의 head에 두 줄 더 들어갑니다. 그대로 복사하면 됩니다:

html
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>내 첫 페이지</title>
</head>

첫 번째 줄은 브라우저에 당신의 텍스트를 읽는 방법을 알려서 악센트가 있는 글자, 구부러진 따옴표, 그리고 이모지가 이상한 기호로 바뀌지 않고 올바르게 표시되도록 합니다. 두 번째 줄은 브라우저에 페이지를 화면의 너비에 맞추도록 알려서, 데스크톱 페이지의 작은 축소 버전이 아닌 휴대폰에서 이해하기 쉽게 보이도록 합니다. 아직 모든 단어를 이해할 필요는 없습니다. 둘 다 head의 상단 근처에 넣으면 당신의 페이지가 제대로 동작합니다.

두 개의 <meta> 요소는 본질적으로 모든 페이지의 head에 속합니다. <meta> 요소는 속성에 메타데이터 한 조각을 담는 void 요소입니다.

html
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>내 첫 페이지</title>
</head>

첫 번째는 **문자 인코딩**을 설정합니다: 브라우저가 저장된 바이트를 다시 글자로 변환하는 데 사용하는 스킴입니다. UTF-8은 영어부터 이모지까지 사용할 수 있는 모든 문자를 포함하는 인코딩이며, 현대의 기본값입니다. 이 줄을 head의 첫 번째에 넣으세요.

두 번째는 뷰포트 태그이며, 페이지가 모바일 화면에 매핑되는 방식을 제어합니다. width=device-width는 브라우저에 페이지의 너비를 실제 기기 너비로 취급하도록 말하고, initial-scale=1.0은 시작 확대/축소를 100%로 설정합니다. 이것이 없으면 휴대폰은 페이지가 데스크톱용으로 설계되었다고 가정하고 전체를 축소하므로, 당신의 텍스트는 읽을 수 없을 정도로 작게 도착합니다. 이 두 줄은 거의 협상 불가능하므로, 스타터 템플릿이 기본적으로 이들을 포함합니다.

두 개의 <meta> 요소는 효과적으로 필수이며, 이유는 브라우저가 파일을 처리하는 방식에서 비롯됩니다.

html
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>내 첫 페이지</title>
</head>

<meta charset>은 문자 인코딩을 선언합니다. 이것은 브라우저가 파일의 원본 바이트를 당신이 입력한 문자 (글자, 구두점, 기호)로 변환하는 데 사용하는 매핑입니다. 이것은 head의 첫 번째여야 하며, 이상적으로는 문서의 첫 1024 바이트 이내여야 합니다. 이것은 시퀀싱 문제 때문입니다: 파서는 바이트를 텍스트로 디코딩해야 그 중 어느 것이든 (charset 선언 자체 포함) 읽을 수 있습니다. 브라우저는 임시 디코딩으로 시작한 다음 선언된 charset이 다르면 다시 파싱하여 모순을 해결합니다. 선언을 먼저 놓으면 다시 파싱할 것이 없습니다. UTF-8을 사용하세요. 이것은 전체 Unicode를 인코딩하며 현대 웹의 기본값으로 간주됩니다.

뒤로 돌아간 <html>lang 속성도 파싱 문제인데, 의미론적인 것입니다. 이것은 문서의 자연 언어를 소프트웨어가 추론할 수 없을 때를 위해 명명합니다: 스크린 리더 (보지 못하는 사람들을 위해 페이지를 큰 소리로 읽는 소프트웨어)는 올바른 발음 규칙과 음성을 선택하기 위해 lang을 사용하고, 번역 도구는 소스 언어를 알기 위해 이것을 사용합니다. 누락되거나 잘못된 lang은 시각 장애 사용자에게 잘못된 악센트로 읽혀지는 페이지를 제공하거나, 더 나쁘게는 음성으로 무의미한 페이지를 제공합니다.

<meta name="viewport">는 모바일 렌더링 기본값을 다룹니다. 초기 스마트폰은 데스크톱 전용 페이지에 대처하기 위해 약 980 픽셀 너비의 가상 캔버스로 렌더링한 다음 화면에 맞도록 축소했습니다. width=device-width는 이를 재정의하여 페이지의 레이아웃 너비를 기기의 자체 너비로 매핑하므로 당신의 반응형 CSS는 실제 화면 크기를 가지고 작업할 수 있습니다. initial-scale=1.0은 초기 확대/축소를 1:1로 설정합니다. 이 태그를 생략하면 반응형 레이아웃이 여전히 980픽셀 가정에 대해 계산되므로, 당신이 신중하게 구축한 모바일 디자인은 데스크톱 너비로 렌더링된 다음 축소되어 전체 운동을 무산시킵니다. 태그 자체는 스타일링을 하지 않습니다. 당신의 CSS가 스타일을 지정할 올바른 차원을 전달하는 것입니다.

Juno문자 집합과 뷰포트 두 줄은 거의 모든 페이지의 head 상단 근처에 들어갑니다: 하나는 당신의 텍스트가 올바르게 읽혀지도록 (악센트와 이모지 포함), 다른 하나는 페이지가 휴대폰 화면에 맞도록 축소되지 않도록. 둘 다 복사하고 아직 표현을 과도하게 생각하지 마세요. 이들은 조용히 당신이 다른 방식으로는 오후 내내 쫓아야 할 문제들을 고칩니다.
Juno문자 집합과 뷰포트<meta charset="UTF-8">은 바이트가 어떻게 글자가 되는지를 설정하므로 head에 먼저 놓으세요. UTF-8은 평문 영어부터 이모지까지 모든 것을 포함합니다. width=device-width가 있는 뷰포트 태그는 휴대폰이 데스크톱 크기의 페이지를 축소하는 것을 멈춥니다. 뷰포트 줄을 건너뛰면 당신의 모바일 레이아웃은 아무것도 아닌 곳에 작게 도착합니다. 이것이 고전적인 "왜 내 사이트가 휴대폰에서 깨져 보이는가" 버그입니다.
Juno문자 집합과 뷰포트charset이 먼저 옵니다. 왜냐하면 파서가 텍스트로 바이트를 디코딩해야 선언 자체를 읽을 수 있기 때문입니다. 위에 놓으면 다시 파싱할 것이 없습니다. <html>lang은 스크린 리더가 발음을 선택하는 데 사용하는 것이므로, 잘못된 값은 페이지를 잘못된 악센트로 읽습니다. 뷰포트 태그를 빼면 당신의 반응형 CSS는 980px 캔버스에 대해 계산되므로, 당신이 구축한 모바일 디자인은 데스크톱 너비로 렌더링되고 축소됩니다.

.html 파일 저장 및 열기

HTML 페이지는 평문 파일이므로 모든 텍스트 편집기에서 만들 수 있습니다. 중요한 한 가지는 이름입니다: .html로 끝나도록 저장하세요.

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>내 첫 페이지</title>
  </head>
  <body>
    <h1>안녕하세요</h1>
    <p>이것이 내 첫 웹 페이지입니다.</p>
  </body>
</html>

이것을 index.html로 저장하세요. 그 다음 당신의 컴퓨터에서 파일을 찾아 더블 클릭하세요: 브라우저에서 열리고 당신의 제목과 단락을 표시합니다. 시작할 서버가 없고 설치할 것도 없습니다. .html 끝은 당신의 컴퓨터에 이것을 코드의 벽이 아닌 웹 페이지로 열도록 알려주는 신호입니다. 단어를 변경하고 저장한 다음 브라우저 탭을 새로 고쳐서 업데이트를 보세요.

HTML 문서는 평문 파일입니다. 모든 편집기에 작성하고 .html 확장자로 저장하세요. 파일 확장자, 점 뒤의 이름 부분은 운영 체제와 브라우저에 파일을 HTML로 취급하도록 알려줍니다.

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>내 첫 페이지</title>
  </head>
  <body>
    <h1>안녕하세요</h1>
    <p>이것이 내 첫 웹 페이지입니다.</p>
  </body>
</html>

이것을 index.html로 저장하세요. index 이름은 초기부터 채택할 만한 규칙입니다: 웹 서버가 폴더를 제공할 때 기본적으로 index.html을 찾으므로, 나중에 당신이 구축하는 모든 사이트의 홈 페이지가 됩니다. 지금 보려면 파일을 더블 클릭하거나 브라우저 창에 드래그하세요. 주소 표시줄은 file:///Users/당신/index.html 같은 것으로 읽혀질 것입니다. file://은 브라우저가 네트워크 대신 디스크에서 직접 읽고 있다고 알려줍니다. 편집은 루프입니다: 파일을 변경하고, 저장하고, 탭을 새로 고치세요.

HTML 문서는 평문이며, 브라우저는 파일 자체만 필요합니다. .html 확장자로 저장하세요. 그러면 운영 체제가 파일을 브라우저와 연결하고 브라우저가 이것을 문자 그대로 표시할 텍스트가 아닌 HTML로 제공합니다.

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>내 첫 페이지</title>
  </head>
  <body>
    <h1>안녕하세요</h1>
    <p>이것이 내 첫 웹 페이지입니다.</p>
  </body>
</html>

로컬 파일을 열면 file:// 프로토콜을 사용합니다: 주소는 file:///Users/당신/index.html 같은 것이 되고, 브라우저는 디스크에서 직접 읽습니다. 이것은 단일 페이지에는 완벽하지만, 천장이 있습니다. file:// 아래에서 브라우저는 엄격한 동일 출처 정책 (페이지가 다른 위치에서 로드할 수 있는 것을 제한하는 보안 규칙)을 적용하고, 모든 로컬 파일을 별도의 출처로 취급하므로 데이터를 로드하기 위한 fetch 요청과 ES 모듈 임포트와 같은 것들이 차단됩니다. http:// 제공에 의존하는 기능은 더블 클릭된 파일에서는 작동하지 않습니다.

이 지점에 도달했을 때 수정은 **로컬 개발 서버**입니다: 당신의 폴더를 http://localhost에 제공하여 브라우저가 이것을 실제 사이트로 취급하는 작은 프로그램입니다. 편집기 확장과 한 줄짜리 명령이 이것을 당신을 위해 합니다. 평문 첫 페이지의 경우 file://이 정확히 맞습니다: 서버 없음, 빌드 단계 없음, 의존성 없음. 파일을 저장하고, 더블 클릭하고, 브라우저가 이것을 렌더링합니다. index.html 이름은 서버가 디렉토리를 반환할 때 기본적으로 index.html을 반환하므로, 당신이 http://로 이동했을 때 진입점이 되기 때문에 유지할 가치가 있습니다.

Junohtml 파일 저장 및 열기 웹 페이지는 이름이 .html로 끝나는 텍스트 파일입니다. 당신의 것을 index.html로 저장하고, 더블 클릭하면, 브라우저가 즉시 열어줍니다. 셋업이 전혀 없습니다. 변경을 보려면 파일을 저장하고 탭을 새로 고치세요. 그 저장-그리고-새로-고침 루프는 페이지를 구축하는 전체 리듬입니다.
Junohtml 파일 저장 및 열기.html 확장자로 파일을 저장하면 브라우저가 이것을 페이지로 렌더링해야 한다는 것을 알고 있습니다. 더블 클릭하거나 드래그하면 주소 표시줄에 file://이 표시되므로 디스크에서 읽고 있다는 의미입니다. 나중에 기본 홈 페이지로 취급하므로 index.html 이름입니다. 그 다음 이것은 루프입니다: 편집, 저장, 새로 고침.
Junohtml 파일 저장 및 열기 더블 클릭하면 file:// 위에 파일을 열기 때문에 한 페이지에는 좋지만 엄격한 동일 출처 정책을 시행하므로 fetch와 ES 모듈 임포트가 차단됩니다. 그 벽에 닥쳤을 때, 로컬 개발 서버를 실행하세요. 페이지가 http://localhost 위에 로드되어 실제 사이트처럼 동작합니다. 서버가 폴더에 대해 기본적으로 반환하므로 index.html 이름을 유지하세요.