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

💫 Sprint Mission 4 Complete #119

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion login.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,20 @@
<div class="email">
<h3>이메일</h3>
<input type="text" placeholder="이메일을 입력해주세요" />
<span id="email-error" class="error-message"></span>
</div>
<div class="password">
<h3>비밀번호</h3>
<div class="password-input">
<input type="password" placeholder="비밀번호를 입력해주세요" />
<img src="image/hidden.png" width="24px" height="24px" alt="" />
</div>
<span id="password-error" class="error-message"></span>
</div>
</div>
<button>로그인</button>
<a>
<button id="login-button">로그인</button>
</a>
<div class="easy-login">
<h2>간편 로그인하기</h2>
<div class="social-login">
Expand All @@ -46,5 +50,6 @@ <h2>간편 로그인하기</h2>
<a href="/signup.html">회원가입</a>
</div>
</div>
<script src="login.js"></script>
</body>
</html>
56 changes: 56 additions & 0 deletions login.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
const emailInput = document.querySelector('.email input');
const emailError = document.querySelector('#email-error');
const loginButton = document.querySelector('#login-button');

const passwordInput = document.querySelector('.password input');
const passwordError = document.querySelector('#password-error');

function validateEmail() {
if (emailInput.value.trim() === '') {
emailError.textContent = '이메일을 입력해주세요.';
emailError.style.display = 'block';
emailInput.style.border = '1px solid red';
return false;
} else if (!emailInput.value.includes('@')) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

p3;
단순히 @ 유무 여부로 이메일 값을 검사하기보다는 정확하게 이메일 패턴에 맞는지 확인하는게 좋을 것 같아요!
요럴때 정규표현식을 많이 사용하게 됩니다!

const emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/;
...
else if (!emailPattern.test(emailInput.value)) {...}

emailError.textContent = '잘못된 이메일 형식입니다.';
emailError.style.display = 'block';
emailInput.style.border = '1px solid red';
return false;
} else {
emailError.textContent = '';
emailError.style.display = 'none';
emailInput.style.border = 'none';
return true;
}
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

p3;
목적에 맞게 기능을 잘 구현하신 것 같아요!
다만, 이 함수를 더 개선하기 위해서는 아래와 같은 것들을 고민해보면 좋을 것 같아요!

validateEmail는 현재 크게는 두 가지 일을 하고 있어요!
첫 번째는 이메일의 값을 통해 유효하지 않은 경우 errorMessage UI를 적용하고 있고,
두 번째는 유효성 여부의 결과 불리언 값을 리턴하고 있어요!

함수를 더 유지보수 및 재사용하기 용이하게 구성하려면, 더 작은 단위로 나누는게 좋아요!

우선 예시로

  1. 불리언을 리턴하는 validate 부분
  2. blur 되었을 때 UI를 변경하는 부분

이 2가지로 함수를 재구성해보겠습니다.

// 이메일 값의 유효성만 딱 검증하는 함수
const validateEmail = (emailValue) => {
  if (emailValue === '') return {isValid: false, message: '이메일을 입력해주세요.'};
  // --> 요렇게 조건에 따라 값을 리턴해버리면 함수가 종료되며 else나 else if 조건을 쓰지 않아도 되는 효과가 있습니다.
  // --> 이에 따라, 함수가 조금 더 깔끔해질 수 있어요!
  if (!emailValue.includes('@')) return {isValid: false, message: '잘못된 이메일 형식입니다.'};
  // --> 객체로 값을 리턴하는 이유는, 이렇게 했을 때, isValid 여부 뿐만이 아니라, isValid가 false인 경우에 변경되어야 하는 textContent 등도 한 번에 처리가능하여 좋습니다.
  return {isValid: true, message: ''};
}

// 이메일 값의 유효성에 따라 UI를 변경하는 부분
const �changeEmailInputStyleByValidation = () => {
  const eamilValidation = validateEmail(emailInput.value);

  if (eamilValidation.isValid) {
    emailError.textContent = '';
    emailError.style.display = 'none';
    emailInput.style.border = 'none';
    return;
  }

  emailError.textContent = eamilValidation.message;
  emailError.style.display = 'block';
  emailInput.style.border = '1px solid red';
}

emailInput.addEventListener('blur', changeEmailInputStyleByValidation);


function validatePassword() {
Copy link
Collaborator

Choose a reason for hiding this comment

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

p4;
요 부분도 한 번 제가 email에서 작성했던 내용을 보고 생각해보시고,
조금 더 작은 단위로 함수를 나누는 연습을 해보셔도 좋을 것 같아요!

if (passwordInput.value.trim() === '') {
passwordError.textContent = '비밀번호를 입력해주세요.';
passwordError.style.display = 'block';
return false;
} else if (passwordInput.value.length < 8) {
passwordError.textContent = '비밀번호를 8자 이상 입력해주세요.';
passwordError.style.display = 'block';
return false;
} else {
passwordError.textContent = '';
passwordError.style.display = 'none';
return true;
}
}

function validateForm() {
const isEmailValid = validateEmail();
Copy link
Collaborator

Choose a reason for hiding this comment

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

p4;
요 부분도 위에서 제가 예시로 작성했던 코드를 기준으로 하면, 아래와 같이 사용할 수 있을 것 같아요!

const { isValid: isEmailValid } = validateEmail(emailInput.value);

const isPasswordValid = validatePassword();
if (isEmailValid && isPasswordValid) {
loginButton.parentNode.href = '/items.html';
} else {
loginButton.removeAttribute('href');
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

p4;
요 부분도 조건문에 else를 붙여 다른 조건을 작성하는 대신, return으로 함수를 종료시켜서 else를 제거할 수 있습니다!
참고로 if, else if, else 방식으로 사용하는게 절대 틀린 방식이 아닙니다!
아주 자연스러운 코드입니다. 다만, 조금의 논쟁 여지가 있지만 일찍 return 시키는 패턴이 일반적으로는 더 깔끔하다고 간주되곤 합니다!
요걸 얼리 리턴 패턴이라고 해요!

if (isEmailValid && isPasswordValid) {
  loginButton.parentNode.href = '/items.html';
  return;
} 
  
loginButton.removeAttribute('href');

}

emailInput.addEventListener('blur', validateEmail);
passwordInput.addEventListener('blur', validatePassword);

loginButton.addEventListener('click', validateForm);
Loading
Loading