Semantic Tags로 리팩토링 하기

Contents

  • Semantics란?
  • HTML5의 Semantic Tags
  • 대표적인 Semantic Tags 블로그에 적용하기
  • 마무리

Computer Science에서의 Semantics란?

컴퓨터 공학에서 프로그램의 의미론(Semantics) 은 프로그램이 실행될 때 그 의미가 무엇인지를 설명하는 개념이다.

시맨틱스는 프로그램의 명령어가 어떤 의미로 동작하는지에 초점을 맞추며, 이는 프로그램의 구조와 형태를 다루는 구문론(Syntax) 과 대조된다.

구문론은 프로그램이 어떤 형식으로 표현되는지를 정의하고, 시맨틱스는 그 형식이 실행될 때 프로그램이 무엇을 하게 되는지를 설명한다.

예를 들어, 자바스크립트에서 i += 1과 i = i + 1은 구문론적으로 다른 표현이지만, 시맨틱스적으로는 'i에 1을 더한다'는 동일한 의미를 가진다.

Semantic Tags

시맨틱 태그(Semantic Tags) 는 HTML5에서 도입된 개념이다.

이 태그들은 웹 페이지의 구조와 내용에 의미를 부여하는 역할을 한다.

예를들어 <h1>은 시맨틱 태그이며, 페이지의 최상위 제목이라는 역할을 갖는다.

하지만 우리는 구문론적으로 <h1> 태그와 같은 역할을 하는 태그를 우리는 스타일 적용을 통해 만들 수 있다.

<h1>h1 태그입니다</h1>
<span style="font-size: 32px; margin: 21px 0;">h1 태그입니다</span>

위의 두 태그는 기능적으로는 정확하게 일치하지만, <span> 태그는 '프로그램이 어떻게 동작하는가'의 의미론적 측면에서는 가치가 없다.

따라서 기능에 적합한 HTML 요소를 사용하는 것이 좋다.
HTML은 채워질 데이터를 나타내도록 코딩해야한다.

어떻게 보여지는가는 CSS만의 단독 역할이다.

시맨틱 태그의 사용 이점

  • 검색 엔진은 시맨틱 태그를 검색 순위에 영향을 주는 중요한 키워드로 간주한다
  • 시각 장애가 있는 사용자가 화면 판독기로 페이지를 탐색할 때 시맨틱 태그를 가이드로 사용할 수 있다
  • 의미없는 <div>들을 탐색하는 것 보다, 시맨틱 태그를 찾는 것이 훨씬 쉽다
  • 개발자들간의 태그 안에 채워질 데이터에 관하여 의사소통에 유리하다

대표적인 시맨틱 태그와 블로그에 적용하기

  • <header>: 페이지 또는 섹션의 머리말
  • <nav>: 네비게이션 링크 모음
  • <main>: 페이지의 주요 내용
  • <article>: 독립적인 콘텐츠 (예: 블로그 포스트)
  • <section>: 관련 콘텐츠의 그룹화
  • <aside>: 주요 내용과 간접적으로 관련된 부가 정보
  • <footer>: 페이지 또는 섹션의 꼬리말

1. 네비게이션 컴포넌트 리팩토링

<>
  <div className={styles.container}>
    <NavLink
      to="/"
      className={({ isActive }) => (isActive ? styles.activeLink : undefined)}
    >
      Home
    </NavLink>
    <NavLink
      to="/post"
      className={({ isActive }) => (isActive ? styles.activeLink : undefined)}
    >
      Post
    </NavLink>
    <NavLink
      to="/about"
      className={({ isActive }) => (isActive ? styles.activeLink : undefined)}
    >
      About
    </NavLink>
  </div>
</>
<header>
  <nav className={styles.container}>
    <ul>
      <li>
        <NavLink
          to="/"
          className={({ isActive }) =>
            isActive ? styles.activeLink : undefined
          }
        >
          Home
        </NavLink>
      </li>
      <li>
        <NavLink
          to="/post"
          className={({ isActive }) =>
            isActive ? styles.activeLink : undefined
          }
        >
          Post
        </NavLink>
      </li>
      <li>
        <NavLink
          to="/about"
          className={({ isActive }) =>
            isActive ? styles.activeLink : undefined
          }
        >
          About
        </NavLink>
      </li>
    </ul>
  </nav>
</header>

적용된 부분은 다음과 같다

  • 전체 컴포넌트를 <header> 태그로 감싸고 웹사이트의 헤더 부분임을 명시했다
  • 네비게이션 링크들을 <nav>로 감싸고 네비게이션 메뉴임을 명시했다
  • 링크들을 <ul><li>로 감싸고, 네비게이션 메뉴가 링크의 리스트라는 것을 시맨틱하게 표현했다.
  • 불필요한 React Fragment를 제거했다.

2. 게시글 목록 컴포넌트 리팩토링

<div>
  <ul className={styles.postList}>
    {posts.map(({ title, date }, index) => (
      <li key={`${title}-${date}`} className={styles.postItem}>
        <Link
          to={`/post/${totalPostsNumber - index}`}
          className={styles.postTitle}
        >
          {title}
        </Link>
        <PostDate date={date} className={styles.postDate} />
      </li>
    ))}
  </ul>
</div>
<main>
  <ul className={styles.postList}>
    {posts.map(({ title, date }, index) => (
      <li key={`${title}-${date}`}>
        <article className={styles.postItem}>
          <Link
            to={`/post/${totalPostsNumber - index}`}
            className={styles.postTitle}
          >
            {title}
          </Link>
          <PostDate date={date} className={styles.postDate} />
        </article>
      </li>
    ))}
  </ul>
</main>

적용된 부분은 다음과 같다

  • 전체 컴포넌트를 <main> 태그로 감싸고 각 페이지의 주요 콘텐츠 영역임을 명시했다
  • 각 게시물을 <article> 태그로 감쌌다

3. 메인 페이지 컴포넌트 리팩토링

<section>
  <div className={styles.audioContainer}>
    <a
      href="https://music.apple.com/kr/playlist/24%EB%85%84-9%EC%9B%94/pl.u-AkAmPNyt27LV71x"
      target="_blank"
    >
      <img src="/audio.jpg" className={styles.audio} alt="audio" />
    </a>
  </div>
  <h1 className={styles.recentPostsTitle}>Recently Posted</h1>
  <ul className={styles.recentPostsList}>
    {recentPostsTitles.map(({ title }, index) => (
      <li key={index} className={styles.recentPostItem}>
        <Link to={`/post/${totalPostsNumber - index}`}>{title || 'None'}</Link>
      </li>
    ))}
  </ul>
</section>
<main>
  <section className={styles.audioContainer}>
    <a
      href="https://music.apple.com/kr/playlist/24%EB%85%84-9%EC%9B%94/pl.u-AkAmPNyt27LV71x"
      target="_blank"
    >
      <img src="/audio.jpg" className={styles.audio} alt="audio" />
    </a>
  </section>
  <h1 className={styles.recentPostsTitle}>Recently Posted</h1>
  <section>
    <nav>
      <ul className={styles.recentPostsList}>
        {recentPostsTitles.map(({ title }, index) => (
          <li key={index} className={styles.recentPostItem}>
            <Link to={`/post/${totalPostsNumber - index}`}>
              {title || 'None'}
            </Link>
          </li>
        ))}
      </ul>
    </nav>
  </section>
</main>

적용된 부분은 다음과 같다

  • 전체 컴포넌트를 <main> 태그로 감싸고 각 페이지의 주요 콘텐츠 영역임을 명시했다
  • 오디오 섹션과 최근 게시글 영역을 <section> 태그로 감쌌다
  • 최근 게시글 목록을 <nav> 태그로 감쌌다

마무리

시맨틱 태그는 HTML의 가독성과 접근성을 향상시키고, 웹 페이지의 구조를 명확하게 정의하여 다양한 이점들을 제공한다.

특히, 검색 엔진 최적화(SEO) 가 웹 페이지의 퀄리티에 있어 중요한 요소로 자리잡은 지금, Semantic Tags의 활용은 더욱 중요해졌다.

앞으로 SEO까지 고려한 블로그 최적화를 시도하며, 시맨틱한 코드를 적용하는 습관을 길러야겠다.

Reference