
IsNavigatorVisible = false; // T/F
...
onClickNavigator(event) {
    this.IsNavigatorVisible = !event.currentTarget.classList.contains('active'); 
    event.currentTarget.classList.toggle('active');
    this.navigatorImageContainerEl.classList.toggle('hide');
    // console.log(this.canvasEl.toDataURL());
  updateNavigator() {
    if (!this.IsNavigatorVisible) return;
    this.navigatorImageEl.src = this.canvasEl.toDataURL();
  }
assignElement() {
	...
    
    this.undoEl = this.toolbarEl.querySelector('#undo');
  }
  
addEvent() {
    ...
    
    this.undoEl.addEventListener('click', this.onClickUndo.bind(this));
  }
default는 빈 배열에서 시작
undoArray = [];
  onClickUndo() {
     // 최초인 경우 alert, return
    if (this.undoArray.length === 0) {
      alert('더 이상 실행취소는 불가합니다.');
      return;
    }
    let previousDataUrl = this.undoArray.pop(); // 배열의 마지막 요소 제거
    let previousImage = new Image(); // 이전 이미지 객체 생성
    
    previousImage.onload = () => {
      // clearRect : 캔버스의 특정 영역 지우는 메소드
      // clearRect(x, y, w, h)
      this.context.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);
      // drawImage : 캔버스에서 이미지를 그리는 메소드
      // drawImage(image, ix, iy, iw, ih, cx, cy, cw, ch)
      this.context.drawImage(
        previousImage,
        0,
        0,
        this.canvasEl.width,
        this.canvasEl.height,
        0,
        0,
        this.canvasEl.width,
        this.canvasEl.height,
      );
    };
    previousImage.src = previousDataUrl;
  }
  saveState() {
    if (this.undoArray.length > 4) {
      this.undoArray.shift(); // 배열의 첫번째 요소 제거
      this.undoArray.push(this.canvasEl.toDataURL()); // 배열의 끝에 추가
    } else {
      this.undoArray.push(this.canvasEl.toDataURL());
    }
    // console.log(this.undoArray);
  }
참고자료
캔버스 상태를 모두 초기화
assignElement() {
	...
    
    this.clearEl = this.toolbarEl.querySelector('#clear');
  }
  
addEvent() {
    ...
    
    this.clearEl.addEventListener('click', this.onClickClear.bind(this));
  }
  onClickClear() {
    this.context.clearRect(0, 0, this.canvasEl.width, this.canvasEl.height);
    this.undoArray = [];
    this.updateNavigator();
    this.initCanvasBackgroundColor();
  }
캔버스에 그린 내용을 jpeg 확장자의 파일로 저장하는 기능
assignElement() {
	...
    
    this.donwloadLinkEl = this.toolbarEl.querySelector('#download');
  }
  
addEvent() {
    ...
    
    this.donwloadLinkEl.addEventListener(
      'click',
      this.onClickDonwload.bind(this),
    );
  }
 onClickDonwload() {
    this.donwloadLinkEl.href = this.canvasEl.toDataURL('image/jpeg', 1);
    this.donwloadLinkEl.download = 'example.jpeg';
  }
class field쪽에 탐색 요소 코드 정리
class DrawingBoard {
  MODE = 'NONE'; // 브러시 모드 : NONE BRUSH ERASER
  IsMouseDown = false; // T/F
  eraserColor = '#FFFFFF'; // 지우개 변수
  backgroundColor = '#FFFFFF'; // 배경색 변수
  IsNavigatorVisible = false; // T/F
  undoArray = [];
  containerEl;
  canvasEl;
  toolbarEl;
  brushEl;
  colorPickerEl;
  brushPanelEl;
  brushSliderEl;
  brushSizePreviewEl;
  eraserEl;
  navigatorEl;
  navigatorImageContainerEl;
  navigatorImageEl;
  undoEl;
  clearEl;
   ......
}
gif 변환/업로드 에러가 있었지만 어쨌든 completed!!