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

[ 4주차 기본/생각 과제 ] 로그인/회원가입 🍁 #7

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

Conversation

nayujin-dev
Copy link
Member

@nayujin-dev nayujin-dev commented Nov 17, 2023

✨ 구현 기능 명세

🌱 기본 조건

  • .env 파일 사용하기

🧩 기본 과제

[ 로그인 페이지 ]

  1. 로그인
    • 아이디와 비밀번호 입력후 로그인 버튼을 눌렀을시 성공하면 /mypage/:userId 로 넘어갑니다. (여기서 userId는 로그인 성공시 반환 받은 사용자의 id)
  2. 회원가입 이동
    • 회원가입을 누르면 /signup으로 이동합니다.

[ 회원가입 페이지 ]

  1. 중복체크 버튼

    • ID 중복체크를 하지 않은 경우 검정색입니다.
    • ID 중복체크 결과 중복인 경우 빨간색입니다.
    • ID 중복체크 결과 중복이 아닌 경우 초록색입니다.
  2. 회원가입 버튼

    • 다음의 경우에 비활성화 됩니다.
    • ID, 비밀번호, 닉네임 중 비어있는 input이 있는 경우
    • 중복체크를 하지 않은 경우
    • 중복체크의 결과가 중복인 경우
    • 회원가입 성공시 /login 으로 이동합니다.

[ 마이 페이지 ]

  1. 마이 페이지
    • /mypage/:userId 의 userId를 이용해 회원 정보를 조회합니다.
    • 로그아웃 버튼을 누르면 /login으로 이동합니다.

🌠 심화 과제

[ 로그인 페이지 ]

  1. 토스트
    • createPortal을 이용합니다.
    • 로그인 실패시 response의 message를 동적으로 받아 토스트를 띄웁니다.

[ 회원가입 페이지 ]

  1. 비밀번호 확인

    • 회원가입 버튼 활성화를 위해서는 비밀번호와 비밀번호 확인 일치 조건까지 만족해야 합니다.
  2. 중복체크

    • 중복체크 후 ID 값을 변경하면 중복체크가 되지 않은 상태(색은 검정색)로 돌아갑니다.

생각과제

  • API 통신에 대하여
  • 로딩 / 에러 처리를 하는 방법에는 어떤 것들이 있을까?
  • 패칭 라이브러리란 무엇이고 어떤 것들이 있을까?
  • 패칭 라이브러리를 쓰는 이유는 무엇일까?

💎 PR Point

  • 로그인 화면 중 회원가입 버튼을 처음에는 usenavigate로 구현했는데, 굳이 함수를 하나 더 만드는건가? 싶어서 로 구현했습니당. 다른분은 어떻게 했을지 궁금해요!
    •        <St.RegisterButton type="button">회원가입</St.RegisterButton>
           </Link>
           // 초반 구현 방법
           {/* <St.RegisterButton onClick={onRegisterBtnClick}>
             회원가입
           </St.RegisterButton> */}  ```
      
  • 회원가입 페이지에서 input을 하나의 객체로 관리했습니당. 이러면 state랑 onchange 함수를 여러개 만들 필요가 없어서 편했는데, 생각해보니 onchage 이벤트가 너무 많이 발생할 수 있겠다고 생각했어요. 다른분들 어떻게 구현했을지 궁금!!
    •        id: "",
             password: "",
             nickname: "",
           });  ``` 
      
    •         setUserInfo({ ...userInfo, [e.target.name]: e.target.value.toString() });
            }; ```
      
  • 회원가입 페이지에서 회원가입 버튼 활성화되게끔 하는 로직 다들 어떻게 하셨나용?? 저는 회원정보를 하나의 객체로 받아서 아래처럼 구현했는데 생각보다 얘가 복잡하게 느껴지더라구요 ,,
    •        if (
               isExist === false && // 중복 체크 했을 때 중복 아닌경우
               !Object.values(userInfo).some((each) => each === "") // input값 모두 입력된경우
             ) {
               setDisabled(false);
             } else {
               setDisabled(true);
             }
           }, [isExist, userInfo]); ```
      

🥺 소요 시간, 어려웠던 점

  • 5h
  • 이번주 몸이 안좋아서 ㅜ.ㅜ 심화 얼렁 마저 하겠습니닷!!

🌈 구현 결과물

https://www.notion.so/dosopt/4-f1ce1b05d2594c57851ebe92b5585a01?pvs=4

Copy link

@Yeonseo-Jo Yeonseo-Jo left a comment

Choose a reason for hiding this comment

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

수고했습니댜!!!!

우리 리팩하구 머지도 해보쟝 (나한테 하는 말)
함세도 하이팅 🖤

Comment on lines +12 to +15
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
},

Choose a reason for hiding this comment

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

오잉 axios가 설치가 안되어 있나용 ?! 확인 해보면 좋을것 같습니댜

import axios from "axios";
import React, { useState } from "react";
import { Link, useNavigate } from "react-router-dom";
import { St } from "../styles/Design";

Choose a reason for hiding this comment

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

혹시 스타일 파일을 따로 만든 이유가 이쓸까요 ?!
궁금합니댜 💭!!

Copy link
Member Author

Choose a reason for hiding this comment

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

저는, , ,, 여러파일에서 동일한 styled component가 반복해서 쓰이면 그걸 매 파일마다 작성하기 귀찮아증후군이 있기 때문에 ,, 분리해서 import해서 사용하곤합니당 ,,

Comment on lines +57 to +59
<Link to={"/signup"}>
<St.RegisterButton type="button">회원가입</St.RegisterButton>
</Link>

Choose a reason for hiding this comment

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

Link 자체를 스타일링 하는 방법두 있어용!
RegisterLink = styled(Link) 이런식으로 가능합니다!
참고참고 ~

Copy link
Member Author

Choose a reason for hiding this comment

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

헐랭! 합세때 바로 써먹어봐야징 ,,

Comment on lines +60 to +62
{/* <St.RegisterButton onClick={onRegisterBtnClick}>
회원가입
</St.RegisterButton> */}

Choose a reason for hiding this comment

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

주석 지우기 얍!

Comment on lines +19 to +20
setUserName(response.data.username);
setNickName(response.data.nickname);

Choose a reason for hiding this comment

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

const {username, nickname} = responose.data
=> 이런식으로 구조분해 할당으로 가져오는것도 가능합니당!

});
useEffect(() => {
if (
isExist === false &&

Choose a reason for hiding this comment

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

요건 이렇게도 쓸 수 있을것 같아요!
!isExist &&

useEffect(() => {
if (
isExist === false &&
!Object.values(userInfo).some((each) => each === "")

Choose a reason for hiding this comment

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

헉 대박 이런 깔끔한 방법이 ?!

Copy link
Member Author

Choose a reason for hiding this comment

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

tmi... 코테스터디에서 배운 some함수 과제할때 쏠쏠하게 활용중임니다 ..

Comment on lines +99 to +100
// value={userInfo.password}
// onChange={onInfoChange}

Choose a reason for hiding this comment

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

주석 지우깅 !

Comment on lines +115 to +123
{disabled ? (
<St.SubmitButton type="button" disabled isdisabled={disabled}>
회원가입
</St.SubmitButton>
) : (
<St.SubmitButton type="button" onClick={onRegisterBtnClick}>
회원가입
</St.SubmitButton>
)}

Choose a reason for hiding this comment

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

disable 설정은 props로 내려줘서 props에 따라 styled-component에서 버튼 색을 다르게 구현해줄수 있구,
onClick도 disabled가 아닌 경우에만 가능하게 함수에서 설정 해줘도 좋을것 같습니당!
참고하깅 !

Comment on lines +1 to +7
{
"dependencies": {
"axios": "^1.6.2",
"react-router-dom": "^6.19.0",
"styled-components": "^6.1.1"
}
}

Choose a reason for hiding this comment

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

오잉 여깄다..! 왜 package.json이 두 개가 생겼지 ?!?!
확인 해봅시다!!!1

Copy link
Member

@SooY2 SooY2 left a comment

Choose a reason for hiding this comment

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

이번주도 넘 고생했댜!! 합세 파이팅팅

useEffect(() => {
if (
isExist === false &&
!Object.values(userInfo).some((each) => each === "")
Copy link
Member

Choose a reason for hiding this comment

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

이런 방법도 있었구만!!!

}, [isExist, userInfo]);

const onInfoChange = (e) => {
setUserInfo({ ...userInfo, [e.target.name]: e.target.value.toString() });
Copy link
Member

Choose a reason for hiding this comment

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

문자열로 바꿔주는 섬세함 좋댜

<St.InputCategory>ID</St.InputCategory>
<St.InputBox
required
name="id"
Copy link
Member

Choose a reason for hiding this comment

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

required는 뭔가여??

Copy link
Member Author

Choose a reason for hiding this comment

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

원래 form 태그 + input 이런식으로 활용할때, input에 required가 추가되어있으면, 저 input을 채워야만 form이 제출되는걸로 알고있어용!! 이번엔 필요없던 내용같당 빼야겠다 헤헹

const [username, setUserName] = useState("");
const [nickname, setNickName] = useState("");
useEffect(() => {
userId !== "" && getUserInfo();
Copy link
Member

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
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants