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

[오정민] sprint11 #319

Merged

Conversation

ojm51
Copy link
Collaborator

@ojm51 ojm51 commented Aug 23, 2024

요구사항

  • Github에 PR(Pull Request)을 만들어서 미션을 제출합니다.
  • 피그마 디자인에 맞게 페이지를 만들어 주세요.
  • 기존의 스프린트 미션 8에 이어서 React, Typescript를 사용합니다.

기본

회원가입

  • 유효한 정보를 입력하고 스웨거 명세된 “/auth/signUp”으로 POST 요청해서 성공 응답을 받으면 회원가입이 완료됩니다.
  • 회원가입이 완료되면 “/login”로 이동합니다.
  • 회원가입 페이지에 접근시 로컬 스토리지에 accessToken이 있는 경우 ‘/’ 페이지로 이동합니다.

로그인

  • 회원가입을 성공한 정보를 입력하고 스웨거 명세된 “/auth/signIp”으로 POST 요청을 하면 로그인이 완료됩니다.
  • 로그인이 완료되면 로컬 스토리지에 accessToken을 저장하고 “/” 로 이동합니다.
  • 로그인/회원가입 페이지에 접근시 로컬 스토리지에 accessToken이 있는 경우 ‘/’ 페이지로 이동합니다.

메인

  • 로컬 스토리지에 accessToken이 있는 경우 상단바 ‘로그인’ 버튼이 판다 이미지로 바뀝니다.

심화

  • 로그인, 회원가입 기능에 react-hook-form을 활용해봅니다.

추가할 것

  • 액세스 토큰 interceptor 활용
  • 조건부 렌더링에 ts-pattern 적용
  • 라이브러리를 이용해 클래스 이름 관리
  • refreshToken으로 accessToken을 갱신
  • 디자인: 랜딩 페이지, 오류 메시지(컴포넌트로 만들기)
  • 로그아웃 기능
  • 로그인 실패 이유(메일 or 비번 오류, 중복? 등)
  • 유저 확인용 토스트 메시지
  • 에러 처리
  • 로직과 ui 관련 코드 분리
  • 페이지네이션
  • 반응형(window.matchMedia?)

주요 변경사항

  • 리액트가 아닌 Next.js로 구현하였습니다.
  • react-hook-form과 day.js를 활용하였습니다.

스크린샷

image
image
image
image

멘토에게

  • 코드리뷰 사항을 반영하지 못했습니다.
  • refreshToken으로 accessToken을 갱신하는 것을 아직 구현하지 못했습니다.
  • 리뷰 전까지 계속 수정하겠습니다!
  • 셀프 코드 리뷰를 통해 질문 이어가겠습니다.

@ojm51 ojm51 requested a review from wlgns2223 August 23, 2024 14:13
@ojm51 ojm51 self-assigned this Aug 23, 2024
@ojm51 ojm51 added the 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. label Aug 23, 2024
@@ -37,7 +38,7 @@ function AddComment({ id, setCommentList }: AddCommentProps) {
let newComment: IComment;
try {
const response = await axios.post(
`/articles/${id}/comments`,
API_PATH.articleComments(id),
Copy link
Collaborator

Choose a reason for hiding this comment

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

피드백대로 잘 바꾸어 주셨네요 !!!

@@ -0,0 +1,30 @@
import Image, { StaticImageData } from "next/image";

interface Data {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Data보다 좀 더 구체적인 네이밍이면 좋겠습니다 ! ^^

Comment on lines +16 to +22
if (typeof window !== "undefined") {
const isSignedIn = !!localStorage.getItem("user_information");
useEffect(() => {
setIsLogin(isSignedIn);
}, [isSignedIn]);
}

Copy link
Collaborator

Choose a reason for hiding this comment

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

이 코드가 잘 동작하나요... ? useEffect는 조건문안에서 사용 할 수 없는 걸로 기억이 납니다.
에러가 안났어요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

오잉 그렇네요...??? 에러는 없었는데 이상하네요
일단 수정해두었습니다!

Comment on lines +16 to +19
import dayjs from "dayjs";
import "dayjs/locale/ko";

dayjs.locale("ko");
Copy link
Collaborator

Choose a reason for hiding this comment

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

dayjs 사용 잘 하셨어용 !

Comment on lines +144 to +146
Home.getLayout = function getLayout(page: ReactElement) {
return <>{page}</>;
};
Copy link
Collaborator

Choose a reason for hiding this comment

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

Layout 이렇게 하신거 잘 하신 것 같아요. 조건부 렌더링도 있지만 Next에서 권장하는 방법대로 잘 하셨네용 !

Comment on lines +113 to +118
{errors.email && errors.email.type === "required" && (
<p>이메일을 입력해주세요</p>
)}
{errors.email && errors.email.type === "pattern" && (
<p>잘못된 이메일 형식입니다</p>
)}
Copy link
Collaborator

Choose a reason for hiding this comment

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

꼼곰한 에러 처리 잘 하셨네용. 따로 컴포넌트로 만드는 것도 좋을 것 같아요.

const EmailErros = () => {
   return <>
                  {errors.email && errors.email.type === "required" && (
                 <p>이메일을 입력해주세요</p>
               )}
               {errors.email && errors.email.type === "pattern" && (
                 <p>잘못된 이메일 형식입니다</p>
               )}
</>
}

Comment on lines +151 to +156
{errors.password && errors.password.type === "required" && (
<p>비밀번호를 입력해주세요</p>
)}
{errors.password && errors.password.type === "minLength" && (
<p>비밀번호를 8자 이상 입력해주세요</p>
)}
Copy link
Collaborator

Choose a reason for hiding this comment

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

여기두 에러 보여주기용 컴포넌트를 따로 만들어서 렌더링하면 좀 더 깔끔 할 것 같아요 !

Comment on lines +79 to +83
const isSignedUp = !!localStorage.getItem("user_information");
if (isSignedUp) {
// TODO: toast 메시지 - 회원가입 내역 존재
router.push(`/login`);
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

이 부분은 useEffect로 컨트롤해야 잘 동작 할 것 같아요.

Comment on lines +60 to +62
const isFormCompleted = email && nickname && password && passwordConfirmation;
const isPasswordValid = password === passwordConfirmation;
const isButtonDisabled = !isFormCompleted || !isPasswordValid || isSubmitting;
Copy link
Collaborator

Choose a reason for hiding this comment

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

ts-patterns를 사용하면 좀 깔금하게 해결 될 것 같은 부분처럼 보여요 ㅎㅎㅎ

@wlgns2223
Copy link
Collaborator

피드백도 잘 적용해주시고 완성까지 해주셨네요 ! 수고하셨습니다.

@wlgns2223 wlgns2223 merged commit 54053ff into codeit-bootcamp-frontend:Next-오정민 Aug 26, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants