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

[김영주] Sprint4 #121

Merged

Conversation

purplenib
Copy link
Collaborator

@purplenib purplenib commented Jun 14, 2024

요구사항

  • Github에 PR(Pull Request)을 만들어서 미션을 제출합니다.
  • 피그마 디자인에 맞게 페이지를 만들어 주세요.
  • React와 같은 UI 라이브러리를 사용하지 않고 진행합니다.

기본

로그인

  • 이메일 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 에 유효한 값을 입력하면 ‘회원가입' 버튼이 활성화 됩니다.
  • 활성화된 ‘회원가입’ 버튼을 누르면 “/signup” 로 이동합니다

심화

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

주요 변경 사항

  • 각 input 태그의 유효성 검사 및 에러 메시지 기능 추가
  • 비밀번호 및 비밀번호 재확인 태그 부분에 있는 눈 모양 아이콘에 Visibility Controler 기능 추가

변경 예정 사항

  • html, css 모듈화하여 파일 분리
  • PC 화면에서 글 내용의 줄 바꿈이 안 되어있음
    ➡️ 스프린트 미션 3 코드 리뷰를 받은 후 아직 수정하지 못한 부분입니다.
  • '로그인' 버튼 클릭 후 "/items"로 이동
    ➡️ 버튼 태그에 링크 속성을 추가하는 코드를 입력했으나 '로그인' 버튼 클릭 후 해당 페이지로 이동하지 않았습니다.

스크린샷

스크린샷 2024-06-14 184534
스크린샷 2024-06-14 192202

사이트

https://sprint-mission1-kyj.netlify.app/

멘토에게

  • 스프린트 미션3 후 피드백 받았던 부분은 아직 수정하지 못했습니다. 🙏

  • 함수 이름은 명령어로 짓고 변수 이름은 명사로 짓도록 통일해봤는데 이름을 적절하게 지은 건지 모르겠습니다.

  • errorMessage를 생성하는 함수와 errorMessage를 지우는 함수를 따로 만든 후 각 input 태그의 유효성을 검사하는 함수에서 앞에 만들어 두었던 함수들을 호출하여 errorMessage를 수정하도록 구현했습니다. 작동은 잘 되는 것 같은데 가독성이 떨어지는 방식인지 접근이 잘못된 건지 궁금합니다.

  • 배열과 배열 메서드를 활용해보고 싶었는데 어디서 사용하면 좋을지 짐작이 안 가 잘 사용하지 못한 것 같습니다. 지금 코드에서 메서드를 활용하면 효율적인 부분이 있는지 궁금합니다.

@purplenib purplenib added the 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. label Jun 14, 2024
@purplenib purplenib requested a review from wlgns2223 June 14, 2024 10:28
Copy link
Collaborator

Choose a reason for hiding this comment

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

중복된 코드가 있더라도 로그인 페이지와 회원가입 페이지 자바스크립트 파일을 각각 나눠주시는게 좋습니다.
실무에서는 로그인 및 회원가입 각각에 더 복잡한 로직이 존재 할 수 있습니다.

}

// login eventListener
email.addEventListener('blur', validateEmail);
Copy link
Collaborator

Choose a reason for hiding this comment

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

같은 맥락의 코드는 서로 가깝게 위치시켜주면 가독성을 높여줍니다.

Suggested change
email.addEventListener('blur', validateEmail);
function validateName() {
removeErrorMessage('nameErrorEmpty', nickname);
if (nickname.value.trim() === "") {
showErrorMessage(nickname, "닉네임을 입력해주세요.", 'nameErrorEmpty');
}
activateButton();
}
const email = document.querySelector('#email');
email.addEventListener('blur', validateEmail);

Copy link
Collaborator

Choose a reason for hiding this comment

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

비슷한 역할을 하는 focusout 이벤트가 있습니다. 어떤 차이가 있을까요?
( https://mygumi.tistory.com/321 )

캡쳐링/버블링을 이용해 좀 더 좋은 코드를 작성 할 수 있으므로 focusout을 사용하는게 더 모던한 것 같습니다.

Comment on lines +11 to +29
function showErrorMessage(element, message, errorClass) {
removeErrorMessage(errorClass, element);
let errorMessage = document.querySelector(`.${errorClass}`);
if (!errorMessage) {
errorMessage = document.createElement('p');
errorMessage.textContent = message;
errorMessage.classList.add('errorColor', errorClass);
element.classList.add('errorOutline');
element.after(errorMessage);
}
}

function removeErrorMessage(errorClass, element) {
let errorMessage = document.querySelector(`.${errorClass}`);
if (errorMessage) {
errorMessage.remove();
element.classList.remove('errorOutline');
}
}
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 +13 to +20
let errorMessage = document.querySelector(`.${errorClass}`);
if (!errorMessage) {
errorMessage = document.createElement('p');
errorMessage.textContent = message;
errorMessage.classList.add('errorColor', errorClass);
element.classList.add('errorOutline');
element.after(errorMessage);
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

DOM에서 요소를 생성/제거를 반복하는 것보다. DOM 객체를 만들어 놓고 디폴트로 숨긴 다음 에러가 있을때 DOM 객체 보여주는 CSS 클래스를 부여하는 방식이 어떨까요?

DOM에 요소를 추가/제거하는 작업은 CSS조작보다는 리소스가 많이 들어갑니다.

} else if (!regex.test(email.value)) {
showErrorMessage(email, "잘못된 이메일 형식입니다.", 'emailErrorForm');
}
activateButton();
Copy link
Collaborator

Choose a reason for hiding this comment

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

activateButton이 각 함수에 반복되고 있는데
input 이벤트와 form 태그에서 버블링 페이즈를 이용하면 1번만 작성 할 수 있습니다.
혹시 해볼 수 있을까요?

@wlgns2223
Copy link
Collaborator

함수 이름은 명령어로 짓고 변수 이름은 명사로 짓도록 통일해봤는데 이름을 적절하게 지은 건지 모르겠습니다.

네이밍은 잘 하고 계십니다 ! 이대로 유지해주시면 좋습니다 !

@wlgns2223
Copy link
Collaborator

wlgns2223 commented Jun 17, 2024

errorMessage를 생성하는 함수와 errorMessage를 지우는 함수를 따로 만든 후 각 input 태그의 유효성을 검사하는 함수에서 앞에 만들어 두었던 함수들을 호출하여 errorMessage를 수정하도록 구현했습니다. 작동은 잘 되는 것 같은데 가독성이 떨어지는 방식인지 접근이 잘못된 건지 궁금합니다.

showErrorremoveError를 각각 만드셨고, 예를들면 아래의 코드와 같이 validateEmail에서 사용하신게 좋은 방법인지 궁금하신거죠?

function validateEmail() {
  const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
  removeErrorMessage('emailErrorEmpty', email); <--- 이부분
  removeErrorMessage('emailErrorForm', email); < --- 이부분
  if (email.value.trim() === "") {
    showErrorMessage(email, "이메일을 입력해주세요.", 'emailErrorEmpty'); < -- 이부분 
  } else if (!regex.test(email.value)) {
    showErrorMessage(email, "잘못된 이메일 형식입니다.", 'emailErrorForm');
  }
  activateButton();
}

제가 이해한게 맞다면,
저는 이 방법이 아주 좋은 방법이라고 생각합니다. 오히려 제가 읽기에도 쉬웠어요.

  1. showErrorMessage, removeErrorMessage는 각각 하나의 일만합니다.
  • 내부적으로 조건에 따른 다른 로직들이 들어 가 있지 않아서, showError가 나오면 "에러 엘레먼트를 생성하고 보여주는구나"라고 바로 이해 할 수 있었습니다. 다른 생각을 할 필요없으니 한번만 이해하면 코드가 쭉쭉 읽혀집니다.
  1. 코드의 재사용성이 높습니다. 에러메세지를 만드는 공통로직을 사용함으로서 재사용을 잘 하셨어요.

@wlgns2223
Copy link
Collaborator

배열과 배열 메서드를 활용해보고 싶었는데 어디서 사용하면 좋을지 짐작이 안 가 잘 사용하지 못한 것 같습니다. 지금 코드에서 메서드를 활용하면 효율적인 부분이 있는지 궁금합니다.

굳이 배열을 활용하고자 한다면 각 input 엘레먼트들을 참조한 뒤
email.value, password.value, nickname.value, passwordConfirm.value들을 배열에 담은 뒤 , every 또는 some 메소드를 활용하여 submit 활성화 검증을 할 수 있습니다.

간단한 예로

const isAllFieldsWritten = [email.value, nickname.value, password.value, passwordConfirm.value].every((text) => text !== "");

@wlgns2223 wlgns2223 merged commit 270212c into codeit-bootcamp-frontend:Basic-김영주 Jun 17, 2024
@wlgns2223
Copy link
Collaborator

스프린트 수고 하셨습니다 ! 피드백을 무조건 다음 미션에 적용해야지 ! 라고 부담을 가지기 보다, 한번 쓱 읽어보고 바로 코드로 옮길 수 있는것들부터 차근차근 의식적으로 실행에 옮겨 보세요 ~

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