Skip to content

Conversation

@Kimheabin
Copy link
Collaborator

@Kimheabin Kimheabin commented Jun 14, 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 에 유효한 값을 입력하면 '회원가입' 버튼이 활성화 됩니다.
  • 활성화된 '회원가입' 버튼을 누르면 로그인 페이지로 이동합니다

체크리스트 [심화]

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

스크린샷

사진 1 : image

사진 2 : image

멘토에게

  1. (사진 1)비밀번호와 비밀번호 확인을 작성하거나 작성 안할때 상자 안에 있는 눈 모양의 위치가 달라집니다. 작성을 했을때와 작성을 안했을때 눈 모양의 위치가 언제나 중앙정렬이 되려면 어떻게 해야하는지 궁금합니다.
  2. html파일에서 <script>를 작성할 때 어떤 위치에 작성해야 올바른 코드인지 궁금합니다.
  3. (사진 2) panda_home에서
    부분을 반응형으로 제작하려면 각각 @media의 구간을 나눠서 따로 작성하는 방법만 있는건지 궁금합니다.
  4. 현재 제가 작성한 js 코드가 올바르게 작성되었는지 궁금합니다.
  • 셀프 코드 리뷰를 통해 질문 이어가겠습니다.

@Kimheabin Kimheabin added the 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. label Jun 14, 2025
@baeggmin
Copy link
Collaborator

첫 js 미션 수행하느라 고생 많으셨습니다!👍👍 질문에 대한 답변은 아래 내용 참고 부탁드립니다.

1. 비밀번호와 비밀번호 확인을 작성하거나 작성 안할때 상자 안에 있는 눈 모양의 위치가 달라집니다.

이런 이슈는 보통 placeholder 글자 유무, 입력 폰트 크기/줄높이, 또는 input padding 변화 때문입니다.

CSS에서 눈 아이콘을 absolute로 위치시키고, input 요소를 기준으로 항상 정중앙에 위치하도록 고정해주면 해결될거에요. 아래 코드 참고해보세요!


.input-wrapper {
  position: relative;
}

.input-wrapper input {
  padding-right: 40px; /* 아이콘 영역 확보 */
  height: 48px; /* 높이를 고정하면 아이콘도 일정해집니다. */
  line-height: 48px;
}

.input-wrapper .eye-icon {
  position: absolute;
  top: 50%;
  right: 12px;
  transform: translateY(-50%); /* 정확히 가운데 정렬 */
  cursor: pointer;
}

2. html파일에서 <script>를 작성할 때 어떤 위치에 작성해야 올바른 코드인지 궁금합니다.

기본적으로 <body> 끝에 두는 방식을 제일 권장합니다. 이렇게 하면 HTML이 다 로드된 후에 JS가 실행되어서 DOM 요소에 안전하게 접근할 수 있고, 별도로 DOMContentLoaded 이벤트를 걸지 않아도 되는 경우도 많습니다.

3. 반응형으로 제작하려면 각각 @media의 구간을 나눠서 따로 작성하는 방법만 있는건지 궁금합니다.

꼭 그런 건 아니지만 대부분의 반응형 처리는 여전히 미디어 쿼리 기반으로 구건별로 작성하게 됩니다.
반응형 작업이 다소 노가다성이라 번거로우실텐데, 곧 tailwind 를 배우시게 되면 미디어 쿼리를 직접 쓰지 않아도, 클래스만으로 반응형 처리가 가능해질겁니다. 그때까지 조금만 더 화이팅해보아요..! 💪

4.현재 제가 작성한 js 코드가 올바르게 작성되었는지 궁금합니다.
인라인 코멘트 참고 부탁드립니다.

Copy link
Collaborator

Choose a reason for hiding this comment

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

validateEmail, validatePassword, validateConfirmPassword 등 기능별 함수 분리가 잘 되어있네요! 👍

Copy link
Collaborator

Choose a reason for hiding this comment

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

로그인과 회원가입에서 validateEmail, validatePassword, createErrorMessage, clearErrorMessage 함수가 거의 동일하게 반복되고 있습니다.

공통 유효성 함수 & UI 헬퍼 함수는 formUtils.js 등의 별도 파일로 분리해서 재사용하도록 구조화하면 좋을 것 같습니다.

}

//로그인 버튼 비활성화,활성화
function checkFormValidity(showMessage = true) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

showMessage 인자가 필요 없는 함수로 보입니다. 혼란의 여지가 있으니 제거해 주세요!

Copy link
Collaborator

Choose a reason for hiding this comment

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

또한 해당 함수는 “검증” 과 “UI 처리” 를 동시에 하고있어서 역할이 모호해지는 것 같습니다.

showMessage가 true일 때는 UI까지 다루고, false일 땐 검증만 한다면 검증 함수인지 UI 컨트롤러인지 구분하기가 어렵습니다.

단일 책임 원칙(SRP)을 지키기 위해 함수가 분리되면 좋을 것 같습니다.

Copy link
Collaborator

Choose a reason for hiding this comment

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

대략 요런 구조로 수정되면 좋을 것 같네요.

function isEmailValid(value) {
  const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return regex.test(value);
}

function validateEmailField(input) {
  const value = input.value.trim();
  if (!value) {
    showError(input, '이메일을 입력해주세요.');
    return false;
  }
  if (!isEmailValid(value)) {
    showError(input, '잘못된 이메일 형식입니다.');
    return false;
  }
  clearError(input);
  return true;
}

return false;
}
if(passwordValue !== confirmValue) {
if (showMessage) createErrorMessage(confirmPasswordInput, '비밀번호를 일치하지 않습니다.');
Copy link
Collaborator

Choose a reason for hiding this comment

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

단순 오타가 있습니다.
"비밀번호를 일치하지 않습니다" → "비밀번호가 일치하지 않습니다"

@baeggmin baeggmin merged commit a3c4848 into codeit-bootcamp-frontend:Basic-김해빈 Jun 18, 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