Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[17팀 석금용][Chapter1-2] 프레임워크 없이 SPA 만들기 #115

Open
wants to merge 31 commits into
base: chapter1-2
Choose a base branch
from

Conversation

geum-yong
Copy link

@geum-yong geum-yong commented Oct 3, 2024

과제 체크포인트

기본과제

1) createVNode

  • 올바른 구조의 vNode를 생성해야 한다
  • 여러 자식을 처리해야 한다
  • 자식 배열을 평탄화해야 한다
  • 중첩 구조를 올바르게 표현해야 한다
  • JSX로 표현한 결과가 createVNode 함수 호출과 동일해야 한다

2) createElement

  • 문자열 입력에 대해 텍스트 노드를 생성해야 한다
  • 숫자 입력에 대해 텍스트 노드를 생성해야 한다
  • null 입력에 대해 빈 텍스트 노드를 생성해야 한다
  • false 입력에 대해 빈 텍스트 노드를 생성해야 한다
  • 배열 입력에 대해 DocumentFragment를 생성해야 한다
  • 함수 컴포넌트를 처리해야 한다
  • 올바른 속성으로 요소를 생성해야 한다
  • 이벤트 리스너를 연결해야 한다
  • 중첩된 자식 요소를 올바르게 처리해야 한다
  • 깊게 중첩된 구조를 처리해야 한다
  • 혼합 콘텐츠(텍스트와 요소)를 처리해야 한다
  • 빈 자식 배열을 처리해야 한다
  • undefined 자식을 무시해야 한다
  • 불리언 속성을 처리해야 한다
  • 데이터 속성을 처리해야 한다

3) 컴포넌트를 jsx로 정의하여 사용했는지 확인하기

  • Post
  • PostForm
  • Header
  • Navigation
  • Footer
  • HomePage
  • LoginPage
  • NotFoundPage
  • ProfilePage
  • HomePage를 렌더링 했을 때 html 문자열로 잘 변환되는지 확인

심화 과제

1) Diff 알고리즘 구현

  • 초기 렌더링이 올바르게 수행되어야 한다
  • diff 알고리즘을 통해 변경된 부분만 업데이트해야 한다
  • 새로운 요소를 추가하고 불필요한 요소를 제거해야 한다
  • 요소의 속성만 변경되었을 때 요소를 재사용해야 한다
  • 요소의 타입이 변경되었을 때 새로운 요소를 생성해야 한다

2) 이벤트 위임 구현

  • 이벤트가 위임 방식으로 등록되어야 한다
  • 동적으로 추가된 요소에도 이벤트가 정상적으로 작동해야 한다
  • 이벤트 핸들러가 제거되면 더 이상 호출되지 않아야 한다

리뷰 받고 싶은 내용

  • 멘토님의 의도대로 구현을 했는지 궁금합니다. (처음에 멘토님께서 어떤 의도로 해당 과제를 주셨고 어떤 기준에 채점을 하실지 고민이 많아요)
  • 모든 과제에서도 그렇지만, 변수명 혹은 함수명이 적절하지 않은게 있는지 알려주시면 도움이 될거 같습니다.
  • 이벤트 위임 로직이 제대로 구현됐는지 리뷰받고 싶습니다.

궁금한 점

  • 저희가 이벤트위임을 구현했는데, 리액트에서는 이런 이벤트 위임을 자동적으로(?) 해주는지 궁금합니다.
  • 다른 멘티분들 코드를 보면 저 같은 경우에는 하나의 함수에 많은 로직이 들어가 있는거 같다는 느낌이 듭니다. 현재 코드에서 로직을 분리해서 함수를 추가하는 형식으로 하는게 좋을까요?
  • 해당 과제를 보시고 추가로 부족한 부분이나 어느 개념을 더 알아봤으면 하는게 있으신지 알려주시면 적극적으로 공부해보겠습니다. (개인적으로 코딩하는 방식이 너무 부족하다는 생각이 있습니다...)

과제를 수행하면서 느낀점

  • React를 하면서 Virtual DOM에 대해서 대략적인 느낌으로만 알고 있었습니다. 매일 다음에 확실히 공부해봐야지 했는데 이번 기회에 하나의 숙제를 끝낸거 같습니다. virtual DOM에 대해 많은걸 알 수 있었고, 이벤트위임 파트에서도 생각지도 못한 메모리 소모를 하고 있었다는걸 느꼈습니다.
  • 이번 과제는 너무 개념이 없고 무지하다보니 실패를 많이 경험했습니다. 빨간날이 없었으면... 정말 성공했을 수 있었을까라는 생각이 드네요 :)
  • 너무 알찬 과제였습니다. React에 대해서 깊게 공부한다는 느낌이 들어요.

과제 시작 전 생각

오... virtual DOM을 만들어야 된다? 그걸 내가? 어떻게 만들어야지? 시작을 어떻게 해야 돼?
이번주 빨간날은 죽었다 생각해야겠다.

과제 제출 후 생각

오... 이게 되네...? 이런 개념이구나.
이렇게 해서 필요한 부분만 렌더링이 되는구나.

기타

  • 멘토님 앞으로도 알찬 과제 부탁드려요 :)

과제 난이도

5점 만점에 5점

const PageComponent = targetPage ?? NotFoundPage;
const error = globalStore.getState().error;

const closeError = (e) => {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

관련된 로직이 main.jsx 에도 있는데 별도로 추가하신 이유가 있으실까요?

image

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NotFoundPage 처리는 처리되지 않는 URL로 접근했을 경우에 처리하고, 에러바운더리는 런타임 도중에 에러처리하려고 추가했어요!

const handler = handlers.get(target);
if (handler) {
handler(event);
if (event.cancelBubble) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 event.cancelBubble 가 있군요!
cancelBubble은 이벤트의 버블링 설정이 되어 있냐 아니냐를 나타내는 걸까요?
해당 코드가 있고 없고의 차이는 어떤걸까요?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 타겟에서 이벤트가 실행되면 그 후에 버블링을 할 필요가 없을거 같아서 추가했습니답!

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

새로 추가한 파일도 lib/index.js에 추가해서 사용해주시면 좋을 것 같아요!

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 감사합니다! 제가 빼먹었네요!

}

const handlers = eventMap.get(eventType);
handlers.set(element, handler);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Map의 키로 객체도 쓸 수 있다는 걸 처음 알았네요!
금용님 코드 참고해서 eventMap 내부 구현 리팩토링 해보려구요! 감사합니다 👍👍


export const addEvent = (element, eventType, handler) => {
if (!eventMap.has(eventType)) {
eventMap.set(eventType, new Map());
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 금용님은 Map으로 구현해주셨군요! Map으로 구현하니 불필요한 filter 작업이나 for문을 돌리지 않아도 바로 찾을 수 있어서 너무 좋네요!! 좋은 방법 알아갑니다 감사합니다!:)

@soyoonJ
Copy link

soyoonJ commented Oct 3, 2024

금용님 코드는 항상 읽으면 직관적이고 읽기 쉽다는 생각이 드네요 :)
저랑은 또 다르게 구현하신 부분들도 있어서 덕분에 좋은 참고가 되었습니다. 이번주도 너무 수고하셨어요!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants