HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
📝
학습 TIL
/
📝
N일차 배운 것 정리
/
📝
11일차 배운 것 정리
📝

11일차 배운 것 정리

목차

목차1. 컴포넌트 방식으로 생각하기1-1. 컴포넌트 방식으로 생각하기란1-2. 실습 - simpleTodoList 작성2. Client Side에서 데이터 저장하기2-1. 쿠키를 통한 데이터 저장2-2. local Storage2-3 Session Storage2-4 localStorage 실습

💡
컴포넌트를 설계할 때, 컴포넌트 간의 의존성을 가지지 않도록 생각하고 설계하기

1. 컴포넌트 방식으로 생각하기

1-1. 컴포넌트 방식으로 생각하기란

컴포넌트란
  • UI를 선언적으로 표현하기 위해, 표현 부분을 추상화한 것
    • <TodoForm / >은 투두리스트 앱에서 폼을 제출하는 동작이 표현되어 들어가있다.
  • 독립적으로 기능할 수 있도록 묶어놓은 단위
    • 투두리스트 앱 → TodoList > TodoForm > Header 의 조합
  • 하나의 컴포넌트에 관련 기능이 묶이기 때문에, 특정 기능의 추가/수정 개발 시 해당 컴포넌트를 찾아 쉽게 수정/개발 할 수 있다.
  • 컴포넌트는 여러개의 다양한 데이터를 반영한 컴포넌트로 재생성이 가능하며, 서로의 컴포넌트의 간섭을 주지 않는다.
 

1-2. 실습 - simpleTodoList 작성

컴포넌트
<TodoList>
  • <TodoForm>에서 제출된 할 일을 화면에 보여주는 컴포넌트
  • params.$target - 컴포넌트가 추가 될 DOM 엘리먼트
  • params.initialState - 컴포넌트의 초기 상태
render함수
  • 명령형 방식: for문을 순회하며, html에 <li> 추가 후 innerHTML 변경
  • 선언형 방식: innerHTML은 state를 map으로 순회하며 <li>를 join 한 것을 리턴
<TodoForm>
  • 투두리스트에 할 일을 추가하는 동작을 담당하는 컴포넌트
onSubmit 함수를 외부에 선언하여 인자로 넘기기
  • e.preventDefault()
    • form태그의 경우 제출 시 항상 새로고침 되므로, 이를 방지하기 위함
  • isInit 변수로 이벤트 바인딩 관리
    • render 될 때마다 실행되는 것을 방지하기 위해서
 
 
Tip
  • object구조분해할당 하여 TodoList({$target, initialState})로 바로 사용하기
  • <script /> 의 위치
    • body태그 아래쪽 (script실행 동안 브라우저렌더링 멈추기 때문에, 빈화면 보여주지 않기 위해서)
    • 루트 script가 가장 아래쪽에 위치하도록 (위쪽의 js파일 부터 읽어지기 때문)
  • <Form> 태그는 onClick 뿐 아니라 폼안에서 엔터버튼 누르면 제출 된다.
  • <TodoForm> 과 <TodoList>가 서로 의존성을 가지지 않도록 하기 (up)
    • BAD!! - TodoForm 생성 파라미터로 TodoList를 넣어 직접 참조하여, 리스트에 반영하는 방법
    • GooD -(!) TodoForm의 외부에 onSubmit함수를 정의하고 인자로 onSubmit함수를 넘겨준다.
      • 해당 컴포넌트 안에서는 onSubmit() 함수가 어떤지 관련이 없다. 인자로 받아 실행시킬 뿐 구현은 todoForm 외부에 존재
    • TodoForm 관련 작업은 모두 TodoForm 에서만 고치면 되도록 되었다. (선언적)

2. Client Side에서 데이터 저장하기

2-1. 쿠키를 통한 데이터 저장

document.cookie = ‘내용’
쿠키의 유효기간 넣는 방법
  • expires : 만료일자를 직접 넣어준다. (expires: new Date().toGMTString()으로 로컬시간 반영하여 등록)
  • max-age : ms단위로 입력 (ex. max-age: 3600)
Tip
  • 쿠키는 긴 물자열로 이루어져있으며, 하나의 쿠키는 세미콜론(;)으로 구분되어 있기 때문에 split() 메소드를 통해 쿠키를 구분할 수 있다.
 

2-2. local Storage

key-value 기반으로 local에 데이터를 저장하는 방법
특징
  • 도메인 기반으로 Storage 생성
    • 도메인만 같다면, 여러탭 내에서 같은 Storage를 공유한다.
  • 삭제하거나, Storage를 직접 전근하지 않으면 탭을 닫아도 삭제되지 않는다.
  • 모든 키와 값은 문자열로만 받기 때문에, 객체와 같은 다른자료형을 사용시 JSON.stringify() & JSON.parse() 를 사용하여 저장 및 불러오기를 해야한다.
 
저장방법
💡
2가지 방법 가능하지만, setItem() 방식 지향 - localStorage를 지원하지 않는 브라우저에서 특정 내장함수들이 덮어 씌어질 수 있기 때문에
  • window.localStorage.name = ‘outwater’
    • or window.localStorage[’name’] = ‘outwater’
  • window.localStroage.setItem(’key’, ‘outwater’)
불러오기
  • localStorage.getItem(’key’)
 
가장 기본적인 사용법
const storedName = localStorage.getItem('key') || ''; if(storedName){ document.querySelector('#name').value = storedName } document.querySelector('#save').addEventListener('click', () => { localStorage.setItem('name', document.querySelector('#name').value) }) document.querySelector('#remove').addEventListener('click', () => { localStorage.removeItem('name') })
 

2-3 Session Storage

localStorage와 유사하지만, 브라우저 탭을 닫는 경우 모든 Storage가 삭제된다.
  • 로그인 유지, 임시값 저장등에 사용된다.
저장방법
  • window.sessionStroage.setItem(’key’, ‘outwater’)
불러오기
  • sessionStorage.getItem(’key’)
삭제
  • sessionStorage.removeItem('key')
 

2-4 localStorage 실습

💡
storage.js에서 관련 작업을 담당하도록 하여, 유지보수관리가 용이하도록 한다. - 모듈화를 통해, 관련 코드를 한 곳에 모을 수 있다. - defaultValue 처리등이 용이하다.
simpleTodoList에 적용하기
더미로 생성하여 기본값으로 사용하던 data를 삭제 후 localStorage에서 todos를 가져오도록 변경
특정 상황에 App이 뻗어버리는 상황 제어하기
try-catch를 이용한 빈값, 문자열이 아닌 값들 처리하기
storage의 용량이 가득 찰 경우, 중간에 저장하지 못하고 에러를 발생시키는 경우
  • catch 구문에서 return defalutValue 를 줌으로써 해결
Storage 전역 오염 방지를 위한 처리
  • IIFE 이용