만들면서 학습하는 리액트(react):준비편 - 순수JS - 002

1 분 소요

준비편 - 순수JS

비교와 대조를 통해 리액트에 대한 이해력을 높일 수 있음

리액트 라이브러리가 없으면 어떻게 개발할까 > 순수 자바스크립트, 바닐라 자바스트립트로 개발함

따라서 결과물을 순수 자바스크립트로 개발해봄으로 리액트의 역할과 이점을 더 확실하게 배워보려고 함

[순수JS 1] MVC 패턴

프로그래밍 세상에서는 문제를 해결하는 접근법을 디자인 패턴 이라고 함

화면 개발에서 많이 쓰이는 디자인 패턴 중 하나가 MVC 패턴

모델(Model), 뷰(View), 컨트롤러(Controller) 라는 3개의 역할이 서로 협력해 문제를 해결하는 방식

모델(Model)은 데이터를 관리(CRUD), 뷰(View)는 사용자가 보는 화면을 관리(데이터의 출력, 이벤트 처리), 컨트롤러(Controller)는 모델과 뷰를 연결하고 움직이는 주체

[순수JS 1] 폴더 구조

  1. 저장소로부터 코드 가져오기

     $ git clone https://github.com/jeonghwan-kim/lecture-react.git
    
  2. 브랜치 이동

     $ git checkout -f ready/scaffoding
    

index.html

  • html 구조
  • ./style.css
    • 학습할 때 css는 수정하지 않음
  • ./js/main.js
  • 본문에 <header>, <div> 있음

storage.js

  • 데이터가 있는 곳
  • Model 역할

store.js

  • class 로 정의되어 있음
  • 생성 시 storage 받아서 저장

views/View.js

  • class 로 정의되어 있음
  • Views는 많아서 폴더로 관리
  • 생성 시 element 받아서 저장
  • View 역할
  • 화면을 숨기고, 보여주는 역할(hide, show)
  • element.style.display를 originalDisplay로 저장
  • 이벤트를 수신하고, 발행하는 역할(on, emit)

helper.js

  • 돔 api를 wrapping 해놓은 것
  • qs는 document.querySelector()를 호출
  • qsAll은 document.querySelectorAll()을 호출해서 배열로 반환
  • on은 target.addEventListener()를 호출
  • delegate은 on과 유사, 특정 엘리먼트의 하위 엘리멘트의 이벤트를 처리할 때 사용
  • emit은 target.dispatchEvent()를 호출
  • formatRelativeDate은 상대날짜 생성 포매터
  • createPastDate은 하루전, 이틀전 날짜 객체 생성
  • createNextId은 아이디값을 +1

Controller.js

  • class로 정의
  • store와 view를 받음

js/main.js

  • DOM 로딩이 완료되면 main 함수 호출
  • storage 객체를 사용해서 store 객체 생성
  • view 객체 생성
  • store, view 객체를 사용해서 Controller 객체 생성

개발서버 동작확인

$ npx lite-server --baseDir 1-vanilla/

tag 추가하기

main.js

// main.js
...
import storage from "./storage.js";

const tag = "[main]"; // add
ducument.addEventListener("DomContentLoaded", main);
function main() {
    console.log(tag, "main"); // add
    const store = new Store(storage);
    ...
}

참고