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주차 기본/공유 과제 ] #4

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

[ 4주차 기본/공유 과제 ] #4

wants to merge 23 commits into from

Conversation

seueooo
Copy link
Contributor

@seueooo seueooo commented May 12, 2024

✨ 구현 기능 명세

🧩 기본 과제

  1. 메인 페이지
  • 메인 이미지 or 비디오 넣기
  • 내정보페이지와 회원가입 페이지로 이동할 수 있는 버튼 구현
  1. 로그인 페이지

    • 아이디와 비밀번호를 입력할 수 있는 input구현
    • Login page 이미지 넣기
    • 로그인 버튼(기능)과 회원가입 페이지 이동 버튼 구현
    • 로그인 실패시 해당 에러메세지를 alert로 띄어주기
    • useParam 활용해서 id값 보유하고 있기.
  2. 회원가입 페이지

    • 아이디, 패스워드, 닉네임, 핸드폰 번호를 입력 받는 페이지 구현
    • 회원가입 버튼 클릭시 post api 통신을 진행하고 성공시 회원가입이 완료되었다는 메시지를 보여주는 alert 띄워준 후, 로그인 메인페이지로 이동
    • 아이디 중복, 비밀번호 형식 오류, 전화번호 형식 오류 등 모든 에러 alert로 메세지 보여주기
    • 비밀번호와 전화번호 형식은 input 아래에 보여주기
  3. 마이페이지

    • get 메소드를 사용해 사용자 정보를 가져오기
    • 서버에서 받아온 ID, 닉네임, 전화번호 데이터를 렌더링
    • 비밀번호 변경 토글을 사용해 비밀번호 변경 폼을 on/off할 수 있도록 구현
    • 기존 비밀번호 입력, 새로운 비밀번호 입력, 새로운 비밀번호 확인 input 구현
    • input이 비어있을 경우 api 작동되지 않도록 구현
    • 에러 발생시 api error객체 안 error message를 사용해 alert 띄우기
    • 홈 이동 버튼 구현

🔥 심화 과제

  1. 메인페이지

    • 비디오에 여러 기능을 적용
  2. 로그인 페이지

    • input이 비어있을 경우 api요청 보내지 않고 아래 error message를 띄워주기
  3. 회원가입 페이지
    input이 비어있는 상태로 api연결 시도했을시

    • 해당 input 테두리 색상 변경

    • input에 focus 맞추기

    • api요청 금지

    • 전화번호 양식 정규표현식으로 자동입력되도록 설정 (숫자만 입력해도 "-"가 붙도록)

    • 비밀번호 검증 유틸 함수 구현 (검증 통과되지 않을시 api요청 금지)

공유과제

  • prettier, eslint, styleLint에 대해
  • lighthouse에 대해

링크 첨부(팀 블로그 링크) :
https://forweber.palms.blog/eslint-prettier-hs


📌 내가 새로 알게 된 부분

  1. useParams()로 헤더값 저장해서 불러오는 법
  2. get메소드로 데이터 불러오는 법
  3. 값 수정은 patch 메소드로 하는 법
  4. 에러메세지 api에서 바로 불러오는 법

💎 구현과정에서의 고민과정(어려웠던 부분) 공유!

데이터를 화면에 불러오는 건 되는데 다른 부분을 구현하려고 하자 화면 렌더링이 계속 안되고 untyped caught error가 계속 떠서 물음표 연산자로 해결했다.

<p>ID : {user.data?.authenticationId}</p>
      <p>닉네임 : {user.data?.nickname} </p>
      <p>전화번호 : {user.data?.phone}</p>

- useParams() 이용하는 법

🥺 소요 시간

  • ``

🌈 구현 결과물

https://chill-lemon-56c.notion.site/4-768db5395fcb4eaaa029612976ce7398?pvs=4

@seueooo seueooo requested review from j-nary and wuzoo May 12, 2024 04:26
@seueooo seueooo self-assigned this May 12, 2024
Copy link

@wuzoo wuzoo left a comment

Choose a reason for hiding this comment

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

전체적으로 깔끔하게 코드 작성하신 게 느껴지네요. axios를 통한 API request를 많이 접해보시지 않았음에도 불구하고, 고민해보신 흔적이 남아있어서 좋습니다. 고생하셨고 합세도 화이팅입니다. !

Copy link

Choose a reason for hiding this comment

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

안쓰는 파일 지워주면 좋을 것 같네요 !

return (
<LogInStyled>
<h1>Login</h1>
<img src={props.src}></img>
Copy link

Choose a reason for hiding this comment

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

img의 alt 속성 넣어주시면 더 좋을 것 같네요 ㅎㅎ. 접근성과 SEO 측면에서 좋을 것 같습니다 !

Comment on lines +32 to +34
<input type="text" value={userId} onChange={(e) => setUserId(e.target.value)} />
<p>PW </p>
<input type="text" value={userPw} onChange={(e) => setUserPw(e.target.value)} />
Copy link

Choose a reason for hiding this comment

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

onChangesetter를 바로 넘기는 것 보다, handle로 시작하는 이벤트 핸들러 함수를 만들어 연결해주는 것이 더욱 가독성 측면에서 좋을 것 같다고 생각이 드네요 !

Comment on lines +70 to +74
<input type="text" value={nowPw} onChange={(e) => setNowPw(e.target.value)} />
<p>새로운 비밀번호</p>
<input type="text" value={newPw} onChange={(e) => setNewPw(e.target.value)} />
<p>비밀번호 확인</p>
<input type="text" value={confirmPw} onChange={(e) => setConfirmPw(e.target.value)} />
Copy link

Choose a reason for hiding this comment

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

특정 정보를 입력하기 위한 input 태그가 존재한다면, 해당 정보의 제출을 위한 form 태그도 꼭 써주는 것을 추천드려요 ! method, action, onSubmit 등의 프로퍼티들과 같이, 특정 정보들의 제출과 관련된 api 또는 핸들러를 쉽게 연결해줄 수 있습니다.
또한 접근성과 가독성 측면에서도 더 좋을 것 같네요

Copy link
Contributor

Choose a reason for hiding this comment

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

https://jsdev.kr/t/form/5468/2 요것도 한 번 읽어보시면 좋을 것 같습니다!

Comment on lines +16 to +30
const submitBtn = async () => {
try {
const response = await axios.post(`${baseURL}/member/join`, {
authenticationId: userId,
password: userPw,
nickname: userName,
phone: number,
});
navigate('/login');
alert(response.data.message);
return response.data;
} catch (e) {
alert(e.response.data.message);
}
};
Copy link

Choose a reason for hiding this comment

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

핸들러이기 때문에, 이전에 한서님이 작성하신 것처럼 handle로 시작하게끔 통일시키는게 좋아보이네요 !

Copy link
Member

@j-nary j-nary left a comment

Choose a reason for hiding this comment

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

전체적으로 코드가 깔끔하고 시맨틱 구조를 굉장히 잘 신경써주신 게 느껴집니다.
폴더 분리밖에 코드리뷰드릴 게 없었네요 !
이번주차 고생많으셨습니다 좋은 코드 감사합니다 :)


const base_URL = 'http://34.64.233.12:8080';

const LogIn = (props) => {
Copy link
Member

Choose a reason for hiding this comment

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

props에 src밖에 없어보이는데 이 부분은 구조분해할당으로 src라는 변수로 바로 받아오면 더 좋을 것 같습니다!
props.src 보다는 src가 코드가 더 간결해보이니까요!


export default LogIn;

const LogInStyled = styled.div`
Copy link
Member

Choose a reason for hiding this comment

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

style 관련된 코드는 Login.style.js 파일로 분리시키면 가독성이 더 좋을 것 같아요 !! 어떻게 생각하시나요?

const [isOpen, setIsOpen] = useState(false);
const navigate = useNavigate();
const toggleModal = () => {
setIsOpen((isOpen) => !isOpen);
Copy link
Member

Choose a reason for hiding this comment

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

isOpen 상태변수랑 이름이 겹쳐서 혼란을 줄 수 있을 것 같아요!
prevIsOpen 이라는 변수명 사용에 대해서 어떻게 생각하시나요?

return;
}
try {
const pwData = await axios.patch(
Copy link
Member

Choose a reason for hiding this comment

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

api 받아오는 부분은 api 폴더에서 따로 관리해주는 게 함수형 프로그래밍의 취지와도 맞을 것 같아요!
어떻게 생각하시나요?

<p>ID : {user.data?.authenticationId}</p>
<p>닉네임 : {user.data?.nickname} </p>
<p>전화번호 : {user.data?.phone}</p>
<span onClick={() => toggleModal()}>▾ 비밀번호 변경</span>
Copy link
Member

Choose a reason for hiding this comment

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

p태그, span태그등 시맨틱 태그를 정말 잘 활용하신 것 같아요!
저는 구현에 급급해서 div로 다 일관했는데 반성하고 갑니다 ㅎㅎ

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