inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

인프런 워밍업 클럽 1기 FE 4번 과제 (책 리스트 나열 앱)

다식
0

4번 과제 (Day4)(책 리스트 나열 앱)

깃허브 저장소 주소 :

https://github.com/devellybutton/frontEnd_warmingUp_study/tree/master/04.%EC%B1%85%EB%AA%A9%EB%A1%9D

image기능 :

  1. '책 이름', '책 저자', '읽은 날짜'를 입력하고 버튼을 누르면 표 아래에 하나씩 등록이 됨.

  2. 각 항목별로 수정, 삭제가 가능함. (연필: 수정, 디스켓: 수정완료)

  3. CSV 파일로 저장 가능함. (화면 맨 오른쪽 첫 번째 아이콘)

  4. 리스트 내 전체 내용 삭제 가능함. (화면 맨 오른쪽 두 번째 아이콘)

  5. LocalStorage에 임시저장하여 페이지 로딩시 불러옴. (화면 맨 오른쪽 세 번째 아이콘)

 

GIF:

  1. '책 이름', '책 저자', '읽은 날짜'를 입력하고 버튼을 누르면 표 아래에 하나씩 등록이 됨.

image

  1. 각 항목별로 수정, 삭제가 가능함.

image

  1. LocalStorage에 임시저장하여 페이지 로딩시 불러옴.

image

  1. CSV 파일로 저장 가능함.

image

  1. 리스트 내 전체 내용 삭제 가능함.

     

image

 

간단한 후기 :

트러블슈팅 :

굵직하게 3개의 문제점이 있었습니다.

 

  1. 이벤트 위임

버튼을 클릭하여 행을 삭제하려면 클릭 이벤트를 추가하여 행을 삭제하는 함수를 호출해야 하였습니다.

각 항목 생성 후, row.innerHTML을 사용하면 행이 삭제될 때 HTML이 완전히 새로 고쳐지므로 이벤트 리스너도 함께 삭제되어 제대로 적용이 되지 않는 문제가 있었습니다.

이때 버튼의 상위 요소에 클릭 이벤트 리스너를 추가하고, 클릭된 버튼에 따라 수행처리를 하여 해결하였습니다.

수정 전 (위) / 수정 후 (아래)

if (deleteBtn) {
  deleteBtn.addEventListener("click", (e) => {
    e.preventDefault();
    removeBook(e); 
  });
}

// 책 목록 개별 삭제
function removeBook(e) {
  const row = e.target.closest("tr");
  if (row) row.remove();
}
table.addEventListener("click", (e) => {
  if (e.target.id === "delete-btn") {
    e.preventDefault();
    removeBook(e);
  }
});

// 책 목록 개별 삭제
function removeBook(e) {
  const row = e.target.closest("tr");  // 하위에 있는 tr 선택하도록 함
  if (row) row.remove();
}

 

  1. 클래스의 초기화 방법 수정

ConvertToCSV 클래스의 getCSV 메소드에서 tbody와 thead에서 tr을 모두 찾아 반환되어야 하였습니다.

하지만 초기에 페이지 로딩 시에는 tbody에 내용이 없어서 이 메소드를 사용하여 tr을 찾으면 tbody에 있는 내용이 없는 상태이기 때문에 정상적으로 작동하지 않았습니다.

이에 따라 이 클래스의 constructor에서가 아닌 내부 메소드에서 tr을 찾도록 수정하였습니다. 브라우저에서는 tbody의 td가 있는 상태이므로 이 방법으로 문제가 해결되었습니다.

image

image

  1. CSV 파일 생성 시 한글만 깨지는 오류

Blob 객체를 생성할 때 type에 charset=UTF-8을 넣어 주지 않아, 한글이 깨진 것이 아닌가 생각하였습니다.

하지만 charset=UTF-8을 넣어도 같은 문제가 발생하여 [csv]를 ["\uFEFF" + csv]로 변경하니 해결되었습니다.

    csvFile = new Blob([csv], { type: "text/csv; charset=UTF-8" });
    downloadLink = document.createElement("a");
    downloadLink.download = filename;

image

image

 

이미지 출처 :

https://www.flaticon.com/free-icon/download_9153957?term=download&page=1&position=16&origin=search&related_id=9153957

https://www.flaticon.com/free-icon/restart_6532052?term=reset&page=1&position=18&origin=search&related_id=6532052

https://www.flaticon.com/free-icon/bookmark_10238285?term=bookmark&page=2&position=38&origin=tag&related_id=10238285


개발할 때 참고한 링크 :

https://beomi.github.io/2017/11/29/HTML-Table-to-CSV/

https://stackoverflow.com/questions/31959487/utf-8-encoding-issue-when-exporting-csv-file-in-javascript

웹 개발 워밍업클럽 FE 과제

답변 0