본문 바로가기
JavaScript

[Javascript] localStorage를 활용한 메모 애플리케이션

by teamnova 2023. 8. 13.

안녕하세요 이번 포스트에서는 JavaScript와 localStorage를 활용하여 간단한 메모 애플리케이션을 만들어보겠습니다.

localStorage를 사용하면 웹 브라우저에서 데이터를 영구적으로 저장할 수 있으므로, 페이지를 새로고침해도 메모가 유지됩니다. 사용자는 입력 필드에 메모를 작성하고 추가할 수 있으며, 추가된 메모는 화면에 표시됩니다. 또한, 각 메모 옆에는 삭제 버튼이 있어 메모를 삭제할 수 있습니다. 이를 통해 JavaScript와 localStorage 의 기능을 익히고, 실제로 활용할 수 있는 예제를 만들어보겠습니다.

 

localStorage는 웹 브라우저에서 제공하는 클라이언트 측 데이터 저장소입니다. 

이를 사용하면 웹 애플리케이션에서 데이터를 영구적으로 저장하고 유지할 수 있습니다. 

localStorage는 HTML5의 일부로서, JavaScript를 사용하여 간단하게 접근하고 조작할 수 있습니다.

localStorage의 주요 특징은 다음과 같습니다:

- 데이터 영구 보관: 로컬 스토리지에 저장된 데이터는 웹 브라우저를 종료하고 다시 실행해도 유지됩니다. 사용자가 페이지를 새로고침하거나 다른 페이지로 이동해도 데이터가 사라지지 않습니다.

- 용량 제한: 로컬 스토리지는 일반적으로 5MB 정도의 용량을 가지며, 브라우저마다 다를 수 있습니다. 너무 많은 데이터를 저장하면 용량 제한에 도달하여 추가적인 데이터 저장이 불가능할 수 있습니다.

- 도메인 기반: 로컬 스토리지는 도메인 기반으로 동작합니다. 즉, 도메인 내의 모든 페이지에서 동일한 로컬 스토리지에 접근할 수 있습니다. 하지만 다른 도메인의 페이지는 로컬 스토리지에 직접 접근할 수 없으며, 도메인 간 데이터 공유는 웹 스토리지 API의 다른 기능인 세션 스토리지 등을 활용해야 합니다.

localStorage 를 사용하기 위해 JavaScript의 localStorage 객체를 사용합니다.

 

 

 

 

전체코드 입니다.

index.html

 

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Memo Application</title>
    <style>
      /* 스타일 */
      .memo-container {
        max-width: 400px;
        margin: 0 auto;
        padding: 20px;
      }

      .memo-input {
        width: 100%;
        margin-bottom: 10px;
      }

      .memo-list {
        list-style: none;
        padding: 0;
      }

      .memo-item {
        display: flex;
        align-items: center;
        justify-content: space-between;
        padding: 10px;
        background-color: #f1f1f1;
        margin-bottom: 10px;
      }

      .memo-item .memo-content {
        flex-grow: 1;
      }

      .memo-item .memo-actions {
        display: flex;
        gap: 10px;
      }

      .memo-item .delete-button {
        color: red;
        cursor: pointer;
      }
    </style>
  </head>
  <body>
    <div class="memo-container">
      <h1>Memo Application</h1>
      <form id="memo-form">
        <input
          type="text"
          id="memo-input"
          class="memo-input"
          placeholder="Enter memo..."
          required
        />
        <button type="submit">Add Memo</button>
      </form>
      <ul id="memo-list" class="memo-list"></ul>
    </div>

    <script>
      // 필요한 요소들을 변수로 참조
      const memoForm = document.getElementById("memo-form");
      const memoInput = document.getElementById("memo-input");
      const memoList = document.getElementById("memo-list");

      // 로컬 스토리지에서 메모를 가져옴, 없을 경우 빈 배열로 초기화
      const memos = JSON.parse(localStorage.getItem("memos")) || [];

      // 페이지 로드 시 메모를 렌더링
      renderMemos();

      // 메모 추가 이벤트 리스너
      memoForm.addEventListener("submit", function (e) {
        e.preventDefault();

        const memoContent = memoInput.value.trim();

        if (memoContent) {
          // 메모 객체 생성
          const memo = {
            id: Date.now(),
            content: memoContent,
          };

          // 메모 배열에 추가
          memos.push(memo);

          // 메모를 로컬 스토리지에 저장
          saveMemos();

          // 입력 필드 초기화
          memoInput.value = "";

          // 메모를 다시 렌더링
          renderMemos();
        }
      });

      // 메모 삭제 이벤트 리스너
      memoList.addEventListener("click", function (e) {
        if (e.target.classList.contains("delete-button")) {
          const memoId = parseInt(
            e.target.parentElement.parentElement.dataset.id
          );

          // 메모 배열에서 해당 메모를 삭제
          memos.splice(
            memos.findIndex((memo) => memo.id === memoId),
            1
          );

          // 메모를 로컬 스토리지에 저장
          saveMemos();

          // 메모를 다시 렌더링
          renderMemos();
        }
      });

      // 페이지에 메모를 렌더링
      function renderMemos() {
        memoList.innerHTML = "";

        if (memos.length === 0) {
          memoList.innerHTML = "<li>No memos found.</li>";
          return;
        }

        memos.forEach((memo) => {
          const memoItem = document.createElement("li");
          memoItem.classList.add("memo-item");
          memoItem.dataset.id = memo.id;

          const memoContent = document.createElement("div");
          memoContent.classList.add("memo-content");
          memoContent.textContent = memo.content;

          const memoActions = document.createElement("div");
          memoActions.classList.add("memo-actions");

          const deleteButton = document.createElement("span");
          deleteButton.classList.add("delete-button");
          deleteButton.textContent = "Delete";

          memoActions.appendChild(deleteButton);
          memoItem.appendChild(memoContent);
          memoItem.appendChild(memoActions);
          memoList.appendChild(memoItem);
        });
      }

      // 메모를 로컬 스토리지에 저장
      function saveMemos() {
        localStorage.setItem("memos", JSON.stringify(memos));
      }
    </script>
  </body>
</html>