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

[7주차] 아지토 미션 제출합니다. #8

Open
wants to merge 110 commits into
base: master
Choose a base branch
from

Conversation

CSE-pebble
Copy link

@CSE-pebble CSE-pebble commented Jun 26, 2024

🐻 배포 링크

https://react-vote-19th.vercel.app/

👩‍💻 구현 기능

유담

  • 로그인
  • 회원가입
  • 토큰 관리

나현

  • 투표 기능 개발

기술 스택

  • nextJS
  • tailwindCSS
  • cva
  • typescript
  • react-query
  • react-hook-form

React-hook-form?

제어 컴포넌트 vs 비제어 컴포넌트

제어 컴포넌트:

  • React state를 신뢰 가능한 단일 출처로 사용하여 입력 폼 엘리먼트를 제어.
  • 실시간 값 동기화가 가능하지만, state가 증가하면 (인풋이 여러 개가 되면)컴포넌트 전체가 리렌더링되어 불필요한 연산이 발생.
  • 유효성 검사를 위해 추가적인 state와 함수가 필요, 코드 복잡성 증가.

비제어 컴포넌트:

  • React에 의해 값이 제어되지 않는 컴포넌트.
  • 실시간 동기화가 필요 없고, state로 값을 관리할 필요 없이 submit 시 값을 받아옴.
  • 입력 폼이 늘어나도 state가 늘어나지 않으며, 값이 변경되어도 리렌더링되지 않음.

React Hook Form 사용 이유

React Hook Form의 장점:

  • 비제어 컴포넌트의 장점 유지: 실시간 유효성 검사 및 동기화 기능 제공.
  • 최소한의 리렌더링: 마운팅 속도 향상.
  • 작은 패키지 크기: 종속성이 없는 가벼운 라이브러리.
  • 타입스크립트 지원: 타입 안전성 보장.
  • 친절한 공식 문서: 사용법과 예제를 쉽게 접근 가능.
  • 지속적인 업데이트: 높은 다운로드 수와 꾸준한 업데이트.

로그인, 회원가입 페이지

  • react-hook-form 이용

로직 설명

  1. 인풋 창 클릭 시 호버
  2. 인풋이 하나라도 비어있으면 버튼 disabled
  3. 각 인풋에 대한 유효성 검증 로직
    • 비밀번호, 비밀번호 확인 불일치
    • 아이디, 비밀번호, 이메일, 유저 이름에 대한 각각의 정규표현식 검증 로직 존재
    • 회원가입 : 아이디 중복, 이메일 중복 시 에러 띄우기
    • 로그인 : 비밀번호 불일치 시 에러 띄우기
  4. 회원가입 성공 시 자동으로 로그인이 되는 방식으로 구현
  5. 회원가입 및 로그인 성공 시 홈화면으로 이동

트러블 슈팅

  1. Mixed-content 에러 해결을 위한 rewrites 설정

    문제

    HTTPS로 배포된 사이트에서 HTTP 서버와 통신 시 Mixed-content 에러 발생.

    해결 방법

    next.config.jsrewrites 설정을 추가하여 모든 api 요청을 HTTP 서버로 프록시하도록 설정.

    예시

    Request URL: https://react-vote-19th.vercel.app/login
    Request Method: POST
    
    프록시 설정에 의해 실제 요청 URL:
    Request URL: http://<our-backend-server>/api/v1/login
    Request Method: POST

    그냥 백엔드가 https로 배포하면 안됨?

    맞아요..^^ 근데 도메인도 사야하고 이미 아지토는 운영중인 사이트라 그 도메인을 같이 쓰기도 애매했습니다. 사실 조유담 이름으로 된 도메인이 하나 있는데 그걸 쓸 걸 하는 생각도 드네요.

CSE-pebble and others added 30 commits June 20, 2024 16:43
- eslint : ++, -- 연산자 사용 허용
- prettier: Windows 스타일로 작성된 줄바꿈(CRLF) 감지 시 Unix/Linux 스타일로 작성된 줄바꿈(LF)으로 자동 변경
CSE-pebble and others added 27 commits June 26, 2024 21:43
Fix: 데이터 로딩 중일 때(isLoading) 처리
Copy link

@Rose-my Rose-my left a comment

Choose a reason for hiding this comment

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

이번 과제도 너무 수고많으셨어요 ...! 매번 코드리뷰할때마다 많이 배워갔는데 마지막까지 최고입니당
아지토 화이팅 > <

@@ -0,0 +1,68 @@
"use client";
import { useAtom } from "jotai";
Copy link

Choose a reason for hiding this comment

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

teamValue 상태를 jotai의 useAtom을 통해 관리하시는군요! 상태 관리에 대한 이해가 높으신것 같아요...! 배워갑니다 !!

import GenSelectBtn from "@/components/common/GenSelectBtn";
import { useMutation, useQueryClient } from "@tanstack/react-query";
import { postTeamVote } from "@/api/demo-day";
import toast from "react-hot-toast";
Copy link

Choose a reason for hiding this comment

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

토스트로 경고창 구현한 것도 멋져요...> <

Comment on lines +40 to +42
export const getUserInfo = async (): Promise<UserInfoRes> => {
return await instance.get("/auth");
};
Copy link

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.

Suggested change
export const getUserInfo = async (): Promise<UserInfoRes> => {
return await instance.get("/auth");
};
export const getUserInfo = async (): Promise<UserInfoRes> => {
try {
const response = await instance.get<UserInfoRes>("/auth");
return response.data;
} catch (error) {
console.error("GetUserInfo Error:", error);
throw error;
}

Copy link

@Dahn12 Dahn12 left a comment

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.

풀리퀘 템플릿까지...!

Copy link

Choose a reason for hiding this comment

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

아지토 팀은 항상 이런 기본 설정들(?)을 정말 잘 해주시는 거 같아요...! 👍

<BigSelectBtn btnTexts={["FRONT-END", "파트장 투표"]} />
</Link>
<Link href="/leader/result-front">
<GenSelectBtn>결과보기</GenSelectBtn>
Copy link

Choose a reason for hiding this comment

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

버튼과 같은 컴포넌트도 따로 빼주셨네요...! 정말 깔끔한거 같아요!

}
} catch (loginError) {
console.error("로그인 시도 실패:", loginError);
toast.error("회원가입은 성공했지만, 자동 로그인이 실패했습니다.");
Copy link

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