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

[3팀 김나연] [Chapter 1-1] 프레임워크 없이 SPA 만들기 #34

Open
wants to merge 11 commits into
base: main
Choose a base branch
from

Conversation

Blue-Kite
Copy link

@Blue-Kite Blue-Kite commented Dec 19, 2024

과제 체크포인트

기본과제

1) 라우팅 구현:

  • History API를 사용하여 SPA 라우터 구현
    • '/' (홈 페이지)
    • '/login' (로그인 페이지)
    • '/profile' (프로필 페이지)
  • 각 라우트에 해당하는 컴포넌트 렌더링 함수 작성
  • 네비게이션 이벤트 처리 (링크 클릭 시 페이지 전환)
  • 주소가 변경되어도 새로고침이 발생하지 않아야 한다.

2) 사용자 관리 기능:

  • LocalStorage를 사용한 간단한 사용자 데이터 관리
    • 사용자 정보 저장 (이름, 간단한 소개)
    • 로그인 상태 관리 (로그인/로그아웃 토글)
  • 로그인 폼 구현
    • 사용자 이름 입력 및 검증
    • 로그인 버튼 클릭 시 LocalStorage에 사용자 정보 저장
  • 로그아웃 기능 구현
    • 로그아웃 버튼 클릭 시 LocalStorage에서 사용자 정보 제거

3) 프로필 페이지 구현:

  • 현재 로그인한 사용자의 정보 표시
    • 사용자 이름
    • 간단한 소개
  • 프로필 수정 기능
    • 사용자 소개 텍스트 수정 가능
    • 수정된 정보 LocalStorage에 저장

4) 컴포넌트 기반 구조 설계:

  • 재사용 가능한 컴포넌트 작성
    • Header 컴포넌트
    • Footer 컴포넌트
  • 페이지별 컴포넌트 작성
    • HomePage 컴포넌트
    • ProfilePage 컴포넌트
    • NotFoundPage 컴포넌트

5) 상태 관리 초기 구현:

  • 간단한 상태 관리 시스템 설계
    • 전역 상태 객체 생성 (예: 현재 로그인한 사용자 정보)
  • 상태 변경 함수 구현
    • 상태 업데이트 시 관련 컴포넌트 리렌더링

6) 이벤트 처리 및 DOM 조작:

  • 사용자 입력 처리 (로그인 폼, 프로필 수정 등)
  • 동적 컨텐츠 렌더링 (사용자 정보 표시, 페이지 전환 등)

7) 라우팅 예외 처리:

  • 잘못된 라우트 접근 시 404 페이지 표시

심화과제

1) 해시 라우터 구현

  • location.hash를 이용하여 SPA 라우터 구현
    • '/#/' (홈 페이지)
    • '/#/login' (로그인 페이지)
    • '/#/profile' (프로필 페이지)

2) 라우트 가드 구현

  • 로그인 상태에 따른 접근 제어
  • 비로그인 사용자의 특정 페이지 접근 시 로그인 페이지로 리다이렉션

3) 이벤트 위임

  • 이벤트 위임 방식으로 이벤트를 관리하고 있다.

과제 셀프회고

리액트 라우터 라이브러리의 사용법만 알고 사용하다가 이렇게 직접 비슷한 기능을 구현해보면서 관련 기능을 더 고민할 수 있었습니다.
라이브러리의 소중함(?)도 얻었습니다.

기술적 성장

  • 이벤트 위임
    해당 개념을 배우고 적용해 볼 수 있었습니다.
  • 명령형 vs 선언형
    멘토링 시간에 경로에 따른 랜더링 관련되어 리펙토링을 여쭈어보았고 명령형/선언형 키워드를 말씀해주셔서 고민해볼 수 있었습니다.
  • 테스트 코드
    테스트 경험이 없었는데 이번에 테스트 코드를 구경할 수 있어서 좋았습니다. 사이드 프로젝트를 끄적이고 있었는데 vitest를 살짝이라도 얹어보고자 합니다.

코드 품질

학습 효과 분석

과제 피드백

리뷰 받고 싶은 내용

선언형을 조건에 따라 화면을 조작하는 것이 아닌 약간 상수처럼 특정 상황의 ui를 정의해버린(?) 느낌으로 이해했는데 맞을까요...?
추천해주실 자료가 있다면 감사하겠습니다.

@Blue-Kite Blue-Kite changed the title [3팀 이정은] [Chapter 1-1] 프레임워크 없이 SPA 만들기 [3팀 김나연] [Chapter 1-1] 프레임워크 없이 SPA 만들기 Dec 19, 2024
src/main.js Show resolved Hide resolved
Copy link

@hdlee0619 hdlee0619 left a comment

Choose a reason for hiding this comment

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

1주차 고생하셨습니다~!

import Header from "./Header";
import Footer from "./Footer";

const DefaultLayout = (component) => {

Choose a reason for hiding this comment

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

DefaultLayout으로 따로 분리하니까 더 깔끔해보이고 좋은 것 같아요..! 수정하기도 편할 것 같아요ㅎㅎ

const activateStyle = "text-blue-600 font-bold";
const deactivateStyle = "text-gray-600";
const handleActivate = (x) => (x === path ? activateStyle : deactivateStyle);
const path = window.location.pathname;

Choose a reason for hiding this comment

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

Nav를 컴포넌트로 분리하고 주소에 따라 다르게 해주셨네요..! 저는 이렇게 못했는데 배워갑니다!

Comment on lines +33 to +44
e.preventDefault();
const form = e.target;
const formData = new FormData(form);
const data = Object.fromEntries(formData);

if (form.id == "login-form") {
handleLogin(data);
}
if (form.id == "profile-form") {
handleChangeProfile(data);
}
handleProfile();

Choose a reason for hiding this comment

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

여기서 처리하는 이벤트가 각 컴포넌트에서 정의되면 더 좋을 지 않을까 싶은데 어떻게 생각하시나요??
제가 위 처럼 생각한 이유는 유지보수와 확장성 측면에서 이벤터가 동작하는 컴포넌트에서 정의하는게 더 좋다고 생각이 되어요. 만약 현재 프로젝트에서 추가로 페이지가 만들어진다면 여기 이벤트가 커지게 될테고 유지보수와 확장이 어려워 질 수 있는 것이죠

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.

4 participants