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 #120

Conversation

MELATONIN99
Copy link
Collaborator

요구사항

기본

로그인

  • 이메일 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들을 유효성 검사하는 기능 추가
  • 유효성 검사 충족 시에만 로그인/회원가입 버튼 활성화
  • 패스워드 input 칸의 눈 모양 아이콘 클릭 시 패스워드 보임/숨김 전환 기능 추가

스크린샷

멘토에게

  • 직접 요소 노드를 만들거나 수정하지 않고 css, class를 사용하여 기능을 구현하였는데, JS로 직접 요소 노드를 건드리는 게 좋았을까요?
  • 다양하게 에러 핸들링을 할 수 있었을 것 같은데 기능구현만 하려고 하다 보니 아쉬움이 많습니다
    이런 경우 추천하시는 방법이나 패턴이 있을까요?
  • 셀프 코드 리뷰를 통해 질문 이어가겠습니다.

* 기존에 Script로 불러오던 폰트를 Link태그를 사용하여 불러오게
  변경하였습니다. (모든 html파일, css파일에 적용)

* 메인 페이지 footer 태그가 2개여서 좀 더 시맨틱 한 구조를 위해 하단부
  html 태그명, class명, css값을 수정하였습니다.
* 유효성 검사 결과에 따라 로그인, 회원가입 버튼 활성/비활성화되는 기능을
  추가했습니다.

* 패스워드 인풋칸의 눈 모양 클릭 시 패스워드 보임/숨김 기능을
  추가했습니다.
@MELATONIN99 MELATONIN99 requested a review from lisarnjs June 14, 2024 09:05
@MELATONIN99 MELATONIN99 added the 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. label Jun 14, 2024
Copy link
Collaborator

@lisarnjs lisarnjs left a comment

Choose a reason for hiding this comment

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

기본적으로 성진님이 예측할 수 있는 에러(value 값이 빈 string이던지, null 값이라던지 등등)들은 조건을 통해서 에러처리해줄 수 있을 것 같네요!
예측할 수 없는 에러가 있다는 것은 코드가 잘못되었을 확률이 높아요! 우리는 우선 예측할 수 있는 에러처리만 꼼꼼하게 해주는 것이 가장 좋아요 👍

그 외 성진님 코드 스타일이 너무 깔끔하고 좋네요!
다만 중복 if문만 한번 더 고민해보시면 좋을 것 같습니다
이번주도 화이팅!

<nav class="sns-links">
<ul>
<li>
<a href="/facebook" target="_blank">
Copy link
Collaborator

Choose a reason for hiding this comment

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

targe="_blank"rel="noopener norefferer" 와 함께 사용됩니다(거의 세트로)
이유는 아래 아티클로 첨부해드릴게요!
https://velog.io/@parkseonup/noopener%EC%99%80-noreferrer

const $conditionMessage = document.querySelectorAll('.condition-message');
const $passwordEye = document.getElementById('passwordEye');
const $checkPasswordEye = document.getElementById('checkPasswordEye');
const pattern = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/;
Copy link
Collaborator

Choose a reason for hiding this comment

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

이런 정규표현식 혹은 변하지 않는 값들은 "상수화" 시켜주는 것이 일반적인 방법이에요.
예를 들어 PATTERN 이라는 대문자 변수명을 사용하면 우린 보통 상수화 시켜줬다 라고 생각합니다!

*참고
대문자 상수 : 기억하기 힘든 값을 변수에 할당해 별칭으로 사용되는 관습으로 대문자 상수는 ‘하드 코딩한’ 값의 별칭을 만들 때 사용

const $target = e.target;
const $errorMesaage = $target.nextElementSibling;
if ($target.value === '') {
$target.classList.add('error2');
Copy link
Collaborator

Choose a reason for hiding this comment

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

전 훨씬 좋다고 생각해요!
dom에 직접적인 style을 지정해주는 것이 아닌 classList 추가를 해줌으로써 더 직관적인 코드가 된 것 같아요!

// 이메일 정규식 체크
function emailCheck() {
if ($email.value === '') {
$conditionMessage[0].classList.remove('waring');
Copy link
Collaborator

Choose a reason for hiding this comment

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

하지만 결국 conditionMessage 처럼 querySelector로 가져온 친구들도 DOM 자체이기 때문에 어쨌든 DOM에 클래스명을 추가하는 것이에요 :)
다만, style 속성을 직접 부여하지 않고 class명을 지정해줌으로써 다양한 css를 적용하기 더 편해졌다는 장점이 있죠 👍

function passwordCheck(e) {
if (e.target.id === 'password') {
const $target = e.target;
const $Message = $target.nextElementSibling.nextElementSibling;
Copy link
Collaborator

Choose a reason for hiding this comment

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

앞으로는 변수명에도 컨벤션 (일정한 규칙) 이 있어야해요
얘만 대문자로 시작하는 이유가 따로 있을까요!? (한번 고민해보세요! 없다면 소문자로 바꿔보세요 👍 )

// 조건 충족했는지 체크
function meetsCondition() {
for (let i = 0; i < $input.length; i++) {
if ($input[i].value !== '') {
Copy link
Collaborator

Choose a reason for hiding this comment

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

const isError = $input[i].classList.contains('error') || $input[i].classList.contains('error2')

pass.splice(i,  1, isError ? false : true)

요런식으로 코드를 바꿔볼 수 있겠네요
중첩 if문이 나온다면 다시 한번 고민해보는 것을 추천할게요!

제가 위에서 사용한 건 "삼항 연산자"입니다!

function meetAallConditions() {
if ($input.length === 2) {
const loginPass = pass.slice(0, 2);
if (loginPass.every((value) => value === true)) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

요기도 if문이 중복으로 쓰였는데 다른 방법은 없을까요!?


// 모든 조건 만족 시 submit 하여 페이지 이동
$loginForm.addEventListener('submit', (e) => {
e.preventDefault();
Copy link
Collaborator

Choose a reason for hiding this comment

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

혹시 e.preventDefault() vs e.stopPropagination()의 차이점을 아시나요?

모르신다면 아래 아티클을 공부해보시면 좋을 것 같아요 👍
https://velog.io/@yiyb0603/JS-e.preventDefault%EC%99%80-e.stopPropagation%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90

meetsCondition();
meetAallConditions();
if ($loginBtn[0].classList.contains('accept')) {
if ($input.length === 2) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

여기서도 삼항연산자로 한번 바꿔보시겠어요!?

<input
type="password"
placeholder="비밀번호를 입력해주세요"
class="input"
Copy link
Collaborator

Choose a reason for hiding this comment

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

클래스명은 태그명과 다른 것이 좋아요!

@lisarnjs lisarnjs merged commit 707dcfe into codeit-bootcamp-frontend:Basic-염성진 Jun 17, 2024
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