Skip to content

Conversation

@nizoo0516
Copy link
Collaborator

@nizoo0516 nizoo0516 commented Aug 7, 2025

요구사항

기본

로그인

  • 이메일 input에서 focus out 할 때, 값이 없을 경우 input에 빨강색 테두리와 아래에 "이메일을 입력해주세요." 빨강색 에러 메세지를 보입니다.
  • 이메일 input에서 focus out 할 때, 이메일 형식에 맞지 않는 경우 input에 빨강색 테두리와 아래에 "잘못된 이메일 형식입니다" 빨강색 에러 메세지를 보입니다.
  • 비밀번호 input에서 focus out 할 때, 값이 없을 경우 아래에 "비밀번호를 입력해주세요." 에러 메세지를 보입니다.
  • 비밀번호 input에서 focus out 할 때, 값이 8자 미만일 경우 아래에 "비밀번호를 8자 이상 입력해주세요." 에러 메세지를 보입니다.
  • input 에 빈 값이 있거나 에러 메세지가 있으면 '로그인' 버튼은 비활성화 됩니다.
  • input 에 유효한 값을 입력하면 '로그인' 버튼이 활성화 됩니다.
  • 활성화된 '로그인' 버튼을 누르면 "/items" 로 이동합니다.

회원가입

  • 이메일 input에서 focus out 할 때, 값이 없을 경우 input에 빨강색 테두리와 아래에 "이메일을 입력해주세요." 빨강색 에러 메세지를 보입니다.
  • 이메일 input에서 focus out 할 때, 이메일 형식에 맞지 않는 경우 input에 빨강색 테두리와 아래에 "잘못된 이메일 형식입니다" 빨강색 에러 메세지를 보입니다.
  • 닉네임 input에서 focus out 할 때, 값이 없을 경우 input에 빨강색 테두리와 아래에 "닉네임을 입력해주세요." 빨강색 에러 메세지를 보입니다.
  • 비밀번호 input에서 focus out 할 때, 값이 없을 경우 아래에 "비밀번호를 입력해주세요." 에러 메세지를 보입니다.
  • 비밀번호 input에서 focus out 할 때, 값이 8자 미만일 경우 아래에 "비밀번호를 8자 이상 입력해주세요." 에러 메세지를 보입니다.
  • 비밀번호 input과 비밀번호 확인 input의 값이 다른 경우, 비밀번호 확인 input 아래에 "비밀번호가 일치하지 않습니다.." 에러 메세지를 보입니다.
  • input 에 빈 값이 있거나 에러 메세지가 있으면 '회원가입' 버튼은 비활성화 됩니다.
  • input 에 유효한 값을 입력하면 '회원가입' 버튼이 활성화 됩니다.
  • 활성화된 '회원가입' 버튼을 누르면 로그인 페이지로 이동합니다.

심화

  • 눈 모양 아이콘 클릭시 비밀번호의 문자열이 보이기도 하고, 가려지기도 합니다.
  • 비밀번호의 문자열이 가려질 때는 눈 모양 아이콘에는 사선이 그어져있고, 비밀번호의 문자열이 보일 때는 사선이 없는 눈 모양 아이콘이 보이도록 합니다.

주요 변경사항

  • 미션 요구사항 외에 변경한 사항은 login.css와 signup.css 파일 코드에 공통된 부분이 너무 많아 auth.css 파일을 생성해 공통 CSS를 관리하도록 수정한 것 정도로, 특별한 변경사항은 없었습니다 !

멘토에게

  • 스프린트 미션4의 경우 6월 초(리액트 배우기 이전) 까지 85% 정도 진행해 놓았다가 이번에 이슈 해결과 마무리 정도 하고 PR올리게 된거라 현재 커리큘럼 진도를 고려했을 때 수정하면 좋을 부분이 많을 수도 있을 것 같습니다..🥲
  • 셀프 코드 리뷰를 통해 질문 이어가겠습니다.

@nizoo0516 nizoo0516 added the 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. label Aug 7, 2025
@nizoo0516 nizoo0516 requested a review from ByungyeonKim August 7, 2025 14:43
Copy link
Collaborator

@ByungyeonKim ByungyeonKim left a comment

Choose a reason for hiding this comment

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

안녕하세요 희수님~!
다음이 드디어 리액트 미션이군요! 🤩
고생 많으셨어요.

먼저, 개략적으로 피드백 드릴게요. 자세한 내용은 아래 리뷰를 참고해 주세요. 😀


  • CSS 파일을 나눈 것처럼 JS 파일도 비슷하게 구성하면 좋을 것 같아요. 현재는 기능이 작아서, 기능마다 모듈을 분리하기 보다는 공통 로직은 auth.js, 페이지별 로직은 login.js, signup.js로 나누는 건 어떨까요? 구조가 더 일관성 있게 될 것 같아요.
  • 인라인 스타일이 아닌, 태그마다 클래스명은 왜 지어주는 걸까요? 여러 이유가 있지만, 재사용 측면에서도 생각해보면 좋을 것 같아요. 현재 로그인 페이지와 회원가입 페이지의 UI가 같은 게 많기 때문에, 통일할 클래스명이 몇몇 보입니다.
  • 이벤트 위임 패턴과 버블링을 이해하면 현재 코드를 개선 시킬 수 있어요.
  • 좋은 사용자 경험(UX)을 위한 기능을 추가해보면 좋을 것 같아요! 예를 들어, 즉각적인 유효성 검사를 추가해보는 건 어떨까요? 필드 입력이 제대로 됐는지 필드를 벗어날 때 알 수 있을 뿐만 아니라, 타이핑하면서 즉시 알 수 있도록 개선 시켜보면 좋을 것 같아요.

Copy link
Collaborator

Choose a reason for hiding this comment

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

공통 CSS를 auth.css로 분리하신 점, 너무 좋습니다!
폴더 구성을 현재 프로젝트 크기에 맞게 잘 구성해주셨네요. 👍

여기서, 각 클래스에 폰트 패밀리를 선언하지 않고 reset.css같은 파일에서 body 태그에 한번에 적용시키는 건 어떨까요? 텍스트 관련 속성은 body에서 정의 시 기본적으로 자식 요소에 상속되어 적용돼요.

다만 폼 컨트롤 관련 요소는 상속이 되지 않기 때문에 아래 선언들도 필요해요.

input,
button,
textarea,
select {
  font-family: inherit;
}

최신 CSS Reset에 대한 더 많은 내용은 아래 링크를 참고해 주세요.

Comment on lines +63 to +64
.eye_wrapper_re {
position: relative;
Copy link
Collaborator

Choose a reason for hiding this comment

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

클래스명을 좀 더 직관적인 password_container, password_box, password_wrapper와 같은 이름은 어떨까요?

그리고 .eye_wrapper_re.eye_wrapper는 하나의 클래스로 사용해도 좋을 것 같아요!

Comment on lines +5 to +7
const inputSelector = button.dataset.target;
const input = document.querySelector(inputSelector);
const img = button.querySelector('.eye_icon_img');
Copy link
Collaborator

Choose a reason for hiding this comment

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

오 dataset 속성을 활용해서 해결 하셨네요. 👍

앞서 말씀드린 것처럼, 비밀번호와 비밀번호 확인 클래스를 통일시키면 이전 방법으로도 아래처럼 구현이 가능해요:

const wrapper = button.closest('.eye_wrapper');
const input = wrapper.querySelector('.password_input');
const img = button.querySelector('.eye_icon_img');

checkButtonState();
});

passwordInput?.addEventListener("focusout", () => {
Copy link
Collaborator

Choose a reason for hiding this comment

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

focusout 이벤트도 구현이 가능하지만, blur 이벤트로 구현도 가능해요. 둘의 차이점은 이벤트 버블링 유무예요.

focusout 이벤트는 버블링이 되지만, blur 이벤트는 버블링이 되지 않습니다. 따라서 현재 코드에서는 각 요소마다 이벤트를 등록하고 있기 때문에, blur 이벤트가 좀 더 적합해요.

그럼 focusout 이벤트는 버블링이 되기 때문에 이벤트 위임 시 사용하면 되겠죠! 😀

Comment on lines +1 to +14
const emailInput = document.querySelector(".email_input");
const emailError = document.querySelector(".email_error");

const passwordInput = document.querySelector(".password_input");
const passwordError = document.querySelector(".password_error");

const passwordReInput = document.querySelector(".password_re_input");
const passwordReError = document.querySelector(".password_re_error");

const nicknameInput = document.querySelector(".nickname_input");
const nicknameError = document.querySelector(".nickname_error");

const loginBtn = document.querySelector(".login_btn");
const signupBtn = document.querySelector(".signup_btn");
Copy link
Collaborator

Choose a reason for hiding this comment

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

회원가입 페이지처럼 입력 필드가 많은 경우, 각 필드에 개별적으로 이벤트 리스너를 등록하면 코드가 금방 복잡해지고, 셀렉터도 많아져요. 여기서 실시간 유효성 검사를 위해 input 이벤트까지 처리하려고 하면 복잡도는 더 커지게 되죠.

이처럼 코드가 늘어나는 상황에서는 이벤트 위임(Event Delegation) 패턴을 적용하는 것이 좋아요. 특정 부모 요소에 단 하나의 이벤트 리스너만 등록하면, 자식 요소에서 발생하는 이벤트들을 효율적으로 처리할 수 있어, 코드를 훨씬 간결하고 유지보수하기 쉽게 만들 수 있습니다. 😀

@ByungyeonKim ByungyeonKim merged commit dbd28d3 into codeit-bootcamp-frontend:Basic-김희수 Aug 11, 2025
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