다크모드 설정 저장하기(localStorage)

다크모드-설정-저장-썸네일


지난 글에서 다크모드 버튼을 만들어봤는데, 아쉬운 점이 하나 있었죠. 버튼을 눌러 다크모드로 바꿔도 새로고침하면 다시 라이트모드로 돌아가는 문제였습니다. 오늘은 이 문제를 해결해서, 방문자가 한 번 설정한 모드가 계속 기억되도록 만들어보겠습니다.

[왜 새로고침하면 초기화될까요?]

지난번 사용한 classList.toggle()은 그 순간 화면에만 클래스를 붙였다 뗐다 할 뿐, 그 정보를 어디에도 저장하지 않습니다. 그래서 페이지를 새로 열면 브라우저는 "다크모드였다"는 사실을 전혀 기억하지 못하고 처음 상태(라이트모드)로 되돌아갑니다.

이 정보를 기억하게 하려면, 브라우저에 따로 저장해둬야 합니다. 이때 쓰는 것이 localStorage입니다.

[localStorage란?]

브라우저가 방문자의 기기에 작은 정보를 저장해두는 공간입니다. 탭을 닫거나 컴퓨터를 재부팅해도 데이터가 지워지지 않고 남아있습니다. 로그인 상태 유지, 장바구니 정보 등 "다음에 다시 왔을 때도 기억해야 하는 정보"를 저장할 때 널리 쓰입니다.

localStorage.setItem('key', 'value');   // 저장
localStorage.getItem('key');            // 불러오기
localStorage.removeItem('key');         // 삭제

[실전: 다크모드 설정 저장하기]

지난 글의 버튼 코드를 아래처럼 수정합니다.

<button onclick="toggleDarkMode()">
  다크모드 전환
</button>

<script>
function toggleDarkMode() {
  document.body.classList.toggle('dark-mode');

  if (document.body.classList.contains('dark-mode')) {
    localStorage.setItem('theme', 'dark');
  } else {
    localStorage.setItem('theme', 'light');
  }
}

// 페이지가 열릴 때 저장된 설정을 확인해서 바로 적용
if (localStorage.getItem('theme') === 'dark') {
  document.body.classList.add('dark-mode');
}
</script>

동작 원리는 이렇습니다.

  1. 버튼을 누르면 다크모드 클래스가 켜지거나 꺼집니다.
  2. 동시에 지금 상태가 dark인지 light인지를 localStorage에 저장합니다.
  3. 페이지가 다시 열릴 때, 저장된 값이 dark이면 자동으로 다크모드 클래스를 붙여줍니다.

[깜빡임(Flash) 현상 줄이기]

위 코드만 적용하면, 페이지가 열릴 때 아주 잠깐 라이트모드로 보였다가 다크모드로 바뀌는 깜빡임이 생길 수 있습니다. 스크립트가 실행되는 타이밍 때문입니다. 이를 줄이려면, 위 자바스크립트 코드를 <body> 태그 맨 아래가 아니라 <head> 태그 안, 최대한 위쪽에 배치하는 것이 도움이 됩니다. 화면이 그려지기 전에 먼저 설정을 확인하게 되어 깜빡임이 줄어듭니다.

[초보자가 자주 하는 실수 2가지]

  1. 저장한 값과 불러올 때 값을 다르게 쓰는 경우: 저장할 땐 'dark'로 저장했는데 불러올 때 'Dark''DARK'로 비교하면 일치하지 않아 작동하지 않습니다. 대소문자까지 정확히 똑같아야 합니다.
  2. 시크릿(익명) 브라우징 모드에서 테스트하는 경우: 일부 브라우저의 시크릿 모드에서는 localStorage가 탭을 닫으면 초기화됩니다. 정상적으로 작동하지 않는다고 오해하기 쉬운데, 일반 브라우징 모드에서 다시 테스트해보세요.

핵심 요약

  • localStorage는 브라우저에 정보를 저장해서, 다시 방문해도 기억하게 해주는 기능입니다.
  • 버튼을 누를 때 localStorage.setItem()으로 상태를 저장하고, 페이지가 열릴 때 getItem()으로 불러와 적용합니다.
  • 깜빡임을 줄이려면 관련 스크립트를 <head> 안, 최대한 위쪽에 배치하세요.
  • 저장 값과 비교 값의 대소문자가 정확히 일치해야 합니다.

이제 여러분의 블로그는 방문자가 다크모드를 켜두면, 다음에 다시 와도 그 설정을 그대로 기억하게 됩니다. 작은 디테일이지만 사용자 경험에는 꽤 큰 차이를 만듭니다.

댓글 쓰기

자유롭게 질문해주세요. 단, 광고성 댓글 및 비방은 사전 통보 없이 삭제됩니다.

다음 이전