HTML

DOCTYPE는 무엇을 하나요?

DOCTYPE는 문서 유형(Document Type)의 약어입니다. DOCTYPE는 항상 DTD(문서 유형 정의)와 관련되어 있습니다.

DTD는 특정 유형의 문서가 어떻게 구조화되어야 하는지 정의합니다(예: buttonspan을 포함할 수 있지만 div는 포함할 수 없음). 반면 DOCTYPE는 문서가 어떤 DTD를 준수해야 하는지 선언합니다(예: 이 문서는 HTML DTD를 준수함).

웹페이지의 경우 DOCTYPE 선언이 필수입니다. 이는 사용자 에이전트에게 문서가 어떤 버전의 HTML 사양을 준수하는지 알려주는 데 사용됩니다. 사용자 에이전트가 올바른 DOCTYPE를 인식하면, 문서 읽기를 위해 해당 DOCTYPE와 일치하는 **표준 모드(no-quirks mode)**를 트리거합니다. 사용자 에이전트가 올바른 DOCTYPE를 인식하지 못하면 **호환 모드(quirks mode)**를 트리거합니다.

HTML5 표준의 DOCTYPE 선언은 <!DOCTYPE html>입니다.

여러 언어로 콘텐츠가 있는 페이지를 어떻게 제공하나요?

가장 일반적인 경우, 즉 여러 언어로 사용 가능한 콘텐츠가 있지만 페이지 내의 콘텐츠는 일관된 한 가지 언어로만 표시되어야 하는 페이지를 제공하는 방법에 대해 묻는 것으로 가정합니다.

서버에 HTTP 요청이 이루어지면 요청하는 사용자 에이전트는 일반적으로 Accept-Language 헤더와 같은 언어 선호도에 대한 정보를 보냅니다. 그러면 서버는 이 정보를 사용하여 적절한 언어로 된 문서 버전을 사용할 수 있는 경우 반환할 수 있습니다. 반환된 HTML 문서에는 <html lang="en">...</html>과 같이 <html> 태그에 lang 속성을 선언해야 합니다.

물론 이는 검색 엔진에 동일한 콘텐츠가 다른 언어로 제공된다는 것을 알리는 데는 쓸모가 없으므로 <head>hreflang 속성도 사용해야 합니다. 예: <link rel="alternate" hreflang="de" href="http://de.example.com/page.html" />

백엔드에서는 HTML 마크업에 i18n 플레이스홀더와 YML 또는 JSON 형식으로 저장된 특정 언어에 대한 콘텐츠가 포함됩니다. 그런 다음 서버는 일반적으로 백엔드 프레임워크의 도움을 받아 해당 특정 언어로 콘텐츠가 있는 HTML 페이지를 동적으로 생성합니다.

다국어 사이트를 설계하거나 개발할 때 주의해야 할 점은 무엇인가요?

  • HTML에 lang 속성을 사용하세요.
  • 사용자를 모국어로 안내하세요 - 사용자가 번거로움 없이 국가/언어를 쉽게 변경할 수 있도록 허용하세요.
  • 래스터 기반 이미지(예: png, gif, jpg 등)의 텍스트는 확장 가능한 접근 방식이 아닙니다 - 이미지에 텍스트를 배치하는 것은 여전히 모든 컴퓨터에서 멋진 비시스템 글꼴을 표시하는 인기 있는 방법입니다. 그러나 이미지 텍스트를 번역하려면 각 텍스트 문자열에 대해 각 언어마다 별도의 이미지를 생성해야 합니다. 이와 같은 교체가 몇 개 이상이면 빠르게 통제 불능이 될 수 있습니다.
  • 제한적인 단어/문장 길이 - 일부 콘텐츠는 다른 언어로 작성될 때 더 길어질 수 있습니다. 디자인에서 레이아웃 또는 오버플로 문제에 주의하세요. 텍스트 양이 디자인을 만들거나 망치는 디자인은 피하는 것이 가장 좋습니다. 문자 수는 헤드라인, 레이블, 버튼과 같은 것에서 중요합니다. 본문 텍스트 또는 주석과 같은 자유로운 텍스트에서는 덜 문제가 됩니다.
  • 색상이 어떻게 인식되는지 유의하세요 - 색상은 언어와 문화에 따라 다르게 인식됩니다. 디자인은 색상을 적절하게 사용해야 합니다.
  • 날짜 및 통화 형식 - 달력 날짜는 때때로 다른 방식으로 표시됩니다. 예: 미국에서는 "2012년 5월 31일" vs. 유럽 일부 지역에서는 "31 May 2012".
  • 번역된 문자열을 연결하지 마세요 - "오늘 날짜는 " + date와 같은 작업을 하지 마세요. 단어 순서가 다른 언어에서는 깨집니다. 대신 각 언어에 대해 매개변수 대체가 있는 템플릿 문자열을 사용하세요. 예를 들어, 영어와 중국어로 된 다음 두 문장을 살펴보세요: I will travel on {% date %}{% date %} 我会出发. 언어의 문법 규칙으로 인해 변수의 위치가 다릅니다.
  • 언어 읽기 방향 - 영어에서는 왼쪽에서 오른쪽으로, 위에서 아래로 읽지만, 전통적인 일본어에서는 위에서 아래로, 오른쪽에서 왼쪽으로 읽습니다.
  • 유용한 기능 - 경로에 로케일 포함 (예: en_US, zh_CN 등).

`data-` 속성은 무엇에 유용할까요?

JavaScript 프레임워크가 인기를 얻기 전에는 프런트엔드 개발자들이 data- 속성을 사용하여 비표준 속성, DOM의 추가 속성과 같은 다른 해킹 없이 DOM 자체에 추가 데이터를 저장했습니다. 이는 페이지 또는 응용 프로그램에 비공개로 사용자 지정 데이터를 저장하기 위한 것으로, 더 적절한 속성이나 요소가 없는 경우에 사용됩니다.

요즘에는 data- 속성 사용은 일반적으로 권장되지 않습니다. 한 가지 이유는 사용자가 브라우저에서 요소 검사를 사용하여 데이터 속성을 쉽게 수정할 수 있기 때문입니다. 데이터 모델은 JavaScript 자체 내에 저장되고 라이브러리나 프레임워크를 통해 데이터 바인딩을 통해 DOM과 업데이트되는 것이 더 좋습니다.

그러나 데이터 속성의 완벽하게 유효한 사용법 중 하나는 Selenium 및 Capybara와 같은 종단 간(end to end) 테스트 프레임워크에 의미 없는 클래스 또는 ID 속성을 만들 필요 없이 훅을 추가하는 것입니다. 요소는 특정 Selenium 사양에서 찾을 수 있는 방법이 필요하며 data-selector='the-thing'과 같은 것이 의미론적 마크업을 복잡하게 만들지 않고 그렇게 하는 유효한 방법입니다.

HTML5를 개방형 웹 플랫폼으로 간주하세요. HTML5의 구성 요소는 무엇인가요?

  • 시맨틱스(Semantics) - 콘텐츠를 더 정확하게 설명할 수 있도록 합니다.
  • 연결성(Connectivity) - 새롭고 혁신적인 방식으로 서버와 통신할 수 있도록 합니다.
  • 오프라인 및 저장소(Offline and storage) - 웹페이지가 클라이언트 측에 로컬로 데이터를 저장하고 오프라인에서 더 효율적으로 작동할 수 있도록 합니다.
  • 멀티미디어(Multimedia) - 비디오와 오디오를 개방형 웹에서 일등 시민으로 만듭니다.
  • 2D/3D 그래픽 및 효과(2D/3D graphics and effects) - 훨씬 더 다양한 프레젠테이션 옵션을 허용합니다.
  • 성능 및 통합(Performance and integration) - 더 빠른 속도 최적화 및 컴퓨터 하드웨어의 더 나은 사용을 제공합니다.
  • 장치 액세스(Device access) - 다양한 입력 및 출력 장치 사용을 허용합니다.
  • 스타일링(Styling) - 저자가 더 정교한 테마를 작성할 수 있도록 합니다.

`cookie`, `sessionStorage`, `localStorage`의 차이점을 설명하세요.

위에 언급된 모든 기술은 클라이언트 측의 키-값 저장 메커니즘입니다. 이들은 값만 문자열로 저장할 수 있습니다.

| | cookie | localStorage | sessionStorage | | --- | --- | --- | --- | | 시작자 | 클라이언트 또는 서버. 서버는 Set-Cookie 헤더를 사용할 수 있음 | 클라이언트 | 클라이언트 | | 만료 | 수동 설정 | 영구 | 탭 닫을 때 | | 브라우저 세션 간 지속성 | 만료 설정 여부에 따라 다름 | 예 | 아니요 | | 모든 HTTP 요청과 함께 서버로 전송 | 쿠키는 Cookie 헤더를 통해 자동으로 전송됨 | 아니요 | 아니요 | | 용량 (도메인당) | 4kb | 5MB | 5MB | | 접근성 | 모든 창 | 모든 창 | 동일한 탭 |

참고: 사용자가 브라우저에서 제공하는 메커니즘을 통해 탐색 데이터를 지우기로 결정하면 저장된 cookie, localStorage, sessionStorage가 모두 지워집니다. 특히 데이터베이스 또는 유사한 서버 측 저장소와 비교할 때 로컬 영구성을 설계할 때 이 점을 염두에 두는 것이 중요합니다 (물론 사용자 작업에도 불구하고 지속됩니다).

`<script>`, `<script async>`, `<script defer>`의 차이점을 설명하세요.

  • <script> - HTML 구문 분석이 차단되고 스크립트가 즉시 가져와 실행되며 스크립트 실행 후 HTML 구문 분석이 재개됩니다.
  • <script async> - 스크립트는 HTML 구문 분석과 병렬로 가져와 사용 가능해지자마자 실행됩니다 (잠재적으로 HTML 구문 분석이 완료되기 전). 페이지의 다른 스크립트와 독립적인 스크립트(예: 분석 스크립트)의 경우 async를 사용하세요.
  • <script defer> - 스크립트는 HTML 구문 분석과 병렬로 가져와 페이지 구문 분석이 완료되면 실행됩니다. 여러 개의 지연된 스크립트가 있는 경우 문서에서 발견된 순서대로 각 지연된 스크립트가 실행됩니다. 스크립트가 완전히 구문 분석된 DOM에 의존하는 경우 defer 속성은 HTML이 완전히 구문 분석된 후에만 스크립트가 실행되도록 하는 데 유용합니다. 지연된 스크립트에는 document.write가 포함되어서는 안 됩니다.

참고: asyncdefer 속성은 src 속성이 없는 스크립트에는 무시됩니다.

CSS `<link>`를 `<head></head>` 사이에, JS `<script>`를 `</body>` 바로 앞에 배치하는 것이 일반적으로 좋은 생각인 이유는 무엇인가요? 예외를 아시나요?

<link><head>에 배치하기

<link><head>에 넣는 것은 최적화된 웹사이트를 구축하기 위한 적절한 사양의 일부입니다. 페이지가 처음 로드될 때 HTML과 CSS는 동시에 구문 분석됩니다. HTML은 DOM(문서 객체 모델)을 생성하고 CSS는 CSSOM(CSS 객체 모델)을 생성합니다. 둘 다 웹사이트의 시각적 요소를 생성하는 데 필요하며, 빠른 "첫 의미 있는 렌더링(first meaningful paint)" 시간을 허용합니다. 이 점진적 렌더링은 최적화 사이트의 성능 점수가 측정되는 범주입니다. 스타일시트를 문서 하단에 배치하면 많은 브라우저에서 점진적 렌더링이 금지됩니다. 일부 브라우저는 스타일이 변경될 경우 페이지 요소를 다시 칠해야 하는 것을 방지하기 위해 렌더링을 차단합니다. 그러면 사용자는 빈 흰색 페이지를 계속 보게 됩니다. 다른 경우에는 스타일이 적용되지 않은 웹페이지를 표시하는 **스타일 없는 콘텐츠의 깜박임(FOUC)**이 발생할 수 있습니다.

<script></body> 바로 앞에 배치하기

<script> 태그는 다운로드 및 실행되는 동안 HTML 구문 분석을 차단하여 페이지 속도를 늦출 수 있습니다. 스크립트를 하단에 배치하면 HTML이 먼저 구문 분석되어 사용자에게 표시될 수 있습니다.

<script>를 하단에 배치하는 예외는 스크립트에 document.write()가 포함되어 있을 때이지만, 요즘에는 document.write()를 사용하는 것이 좋은 방법이 아닙니다. 또한, <script>를 하단에 배치하면 브라우저가 전체 문서가 구문 분석될 때까지 스크립트 다운로드를 시작할 수 없습니다. 이렇게 하면 DOM 요소를 조작해야 하는 코드가 오류를 발생시키거나 전체 스크립트를 중단시키지 않습니다. <script><head>에 넣어야 하는 경우 defer 속성을 사용하면 HTML이 구문 분석된 후에만 스크립트를 실행하는 동일한 효과를 얻을 수 있지만 브라우저는 스크립트를 더 일찍 다운로드할 수 있습니다.

닫는 </body> 태그 바로 앞에 스크립트를 배치하면 빈 캐시에서 페이지가 더 빠르게 로드되는 것처럼 보일 수 있습니다 (스크립트가 나머지 문서 다운로드를 차단하지 않기 때문입니다). 그러나 페이지 로드 중에 실행하려는 코드가 있는 경우 전체 페이지가 로드된 후에만 실행되기 시작합니다. 이러한 스크립트를 <head> 태그에 넣으면 더 일찍 실행되기 시작하므로 프라임 캐시에서는 페이지가 실제로 더 빠르게 로드되는 것처럼 보일 것입니다.

<head><body> 태그는 이제 선택 사항입니다.

HTML5 사양에 따라 <head><body>와 같은 특정 HTML 태그는 선택 사항입니다. Google의 스타일 가이드에서는 심지어 바이트를 절약하기 위해 이들을 제거할 것을 권장합니다. 그러나 이 관행은 아직 널리 채택되지 않았으며 성능 향상은 미미할 가능성이 있으며 대부분의 사이트에서는 중요하지 않을 것입니다.

점진적 렌더링이란 무엇인가요?

점진적 렌더링은 웹페이지의 성능을 향상시키기 위해 사용되는 기술(특히, 인지되는 로드 시간 개선)에 주어진 이름으로, 가능한 한 빨리 콘텐츠를 표시하도록 렌더링합니다.

광대역 인터넷 시대 이전에는 훨씬 더 널리 퍼져 있었지만, 모바일 데이터 연결이 점점 더 인기를 얻고(그리고 불안정해지고) 있기 때문에 현대 개발에서도 여전히 사용됩니다!

이러한 기술의 예:

  • 이미지 지연 로딩 - 페이지의 이미지가 한 번에 모두 로드되지 않습니다. 사용자가 이미지를 표시하는 페이지 부분으로 스크롤할 때 JavaScript를 사용하여 이미지를 로드합니다.
  • 보이는 콘텐츠 우선 순위 지정 (또는 폴드 위 렌더링) - 사용자의 브라우저에 최대한 빨리 표시될 수 있도록 페이지 양에 필요한 최소한의 CSS/콘텐츠/스크립트만 포함하고, 그런 다음 지연된 스크립트를 사용하거나 DOMContentLoaded/load 이벤트를 수신하여 다른 리소스와 콘텐츠를 로드할 수 있습니다.
  • 비동기 HTML 조각 - 백엔드에서 페이지가 구성될 때 HTML의 일부를 브라우저로 플러싱합니다. 이 기술에 대한 자세한 내용은 다음에서 찾을 수 있습니다.

이미지 태그에 `srcset` 속성을 사용하는 이유는 무엇인가요? 브라우저가 이 속성의 내용을 평가하는 과정을 설명하세요.

사용자 장치 디스플레이 너비에 따라 다른 이미지를 제공하려는 경우 srcset 속성을 사용합니다. 망막 디스플레이가 있는 장치에 고품질 이미지를 제공하면 사용자 경험이 향상되고, 저해상도 이미지를 저가형 장치에 제공하면 성능이 향상되고 데이터 낭비가 줄어듭니다 (더 큰 이미지를 제공해도 시각적으로 차이가 없기 때문입니다). 예를 들어: <img srcset="small.jpg 500w, medium.jpg 1000w, large.jpg 2000w" src="..." alt="">는 브라우저에게 클라이언트의 해상도에 따라 작거나 중간 또는 큰 .jpg 그래픽을 표시하도록 지시합니다. 첫 번째 값은 이미지 이름이고 두 번째 값은 픽셀 단위의 이미지 너비입니다. 장치 너비가 320px인 경우 다음 계산이 수행됩니다:

  • 500 / 320 = 1.5625
  • 1000 / 320 = 3.125
  • 2000 / 320 = 6.25

클라이언트의 해상도가 1x인 경우 1.5625가 가장 가깝고, small.jpg에 해당하는 500w가 브라우저에 의해 선택됩니다.

해상도가 망막(2x)인 경우 브라우저는 최소값 이상의 가장 가까운 해상도를 사용합니다. 즉, 500w(1.5625)는 1보다 크기 때문에 선택하지 않고 이미지가 안 좋게 보일 수 있습니다. 브라우저는 결과 비율이 2에 더 가까운 1000w(3.125)인 이미지를 선택합니다.

srcset은 데스크톱 디스플레이처럼 거대한 이미지가 필요 없는 좁은 화면 장치에 더 작은 이미지 파일을 제공하려는 문제와 고밀도/저밀도 화면에 다른 해상도 이미지를 선택적으로 제공하려는 문제를 해결합니다.

이전에 다른 HTML 템플릿 언어를 사용해 본 적이 있나요?

네, Pug (이전 Jade), ERB, Slim, Handlebars, Jinja, Liquid, EJS 등 몇 가지를 사용해 보았습니다. 제 생각에는 이들은 모두 비슷하며 콘텐츠를 이스케이프하고 표시할 데이터를 조작하는 데 유용한 필터를 제공하는 유사한 기능을 제공합니다. 대부분의 템플릿 엔진은 표시 전에 사용자 지정 처리가 필요한 경우 고유한 필터를 삽입할 수 있도록 허용합니다.

캔버스와 SVG의 차이점은 무엇인가요?

캔버스는 픽셀로 작동하는 래스터 기반인 반면, SVG는 모양의 수학적 설명을 사용하는 벡터 기반입니다. 캔버스는 각 단계가 JavaScript로 지정되는 명령형 그리기를 사용하며, 애니메이션 및 게임과 같은 동적이고 상호작용적인 그래픽에 이상적입니다.

반대로 SVG는 모양과 경로가 HTML에 직접 정의되는 선언형 그리기를 사용하며, 접근성이 뛰어나고 SEO 친화적입니다. 캔버스는 오버헤드가 낮아 복잡한 장면에 최적이지만, 크기 조정 시 이미지 품질 저하가 발생할 수 있습니다. SVG는 해상도에 독립적이므로 품질 저하 없이 다양한 화면 크기에 적응합니다.

궁극적으로 캔버스는 동적이고 성능 집약적인 그래픽에 적합하며, SVG는 확장 가능하고 해상도에 독립적인 그래픽에 탁월하며, 본질적인 접근성 및 SEO 이점을 제공합니다.

HTML에서 빈 요소란 무엇인가요?

HTML에서 빈 요소는 여는 태그와 닫는 태그 사이에 아무런 콘텐츠를 포함하지 않는 요소를 말합니다. 대신, 이들은 자체 닫힘 태그이며, 즉 닫는 꺾쇠 괄호(>) 앞에 슬래시(/)가 있습니다. 빈 요소의 몇 가지 일반적인 예는 다음과 같습니다:

  • <img>: 문서에 이미지를 포함하는 데 사용됩니다.
  • <input>: 사용자 입력을 받는 데 사용됩니다.
  • <br>: 줄 바꿈 또는 강제 줄 바꿈을 삽입하는 데 사용됩니다.
  • <hr>: 수평선 또는 구분선을 만드는 데 사용됩니다.