Skip to content

Conversation

@rladudgns4456
Copy link
Collaborator

요구사항

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

기본

로그인

  • 이메일 input에서 focus out 할 때, 값이 없을 경우 input에 빨강색 테두리와 아래에 "이메일을 입력해주세요." 빨강색 에러 메세지를 보입니다.
  • 이메일 input에서 focus out 할 때, 이메일 형식에 맞지 않는 경우 input에 빨강색 테두리와 아래에 "잘못된 이메일 형식입니다" 빨강색 에러 메세지를 보입니다.
  • 비밀번호 input에서 focus out 할 때, 값이 없을 경우 아래에 "비밀번호를 입력해주세요." 에러 메세지를 보입니다
  • 비밀번호 input에서 focus out 할 때, 값이 8자 미만일 경우 아래에 "비밀번호를 8자 이상 입력해주세요." 에러 메세지를 보입니다.
  • [x]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 에 유효한 값을 입력하면 '회원가입' 버튼이 활성화 됩니다.
  • 활성화된 '회원가입' 버튼을 누르면 로그인 페이지로 이동합니다

심화

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

주요 변경사항

  • 스프린트 미션 3 PR올렸을때의 피드백 적극 반영했습니다.
  • 폴더 구조 변경했습니다.
  • 전체적인 class="", id="" 이름과 시멘틱 테그를 활용하여 코드 리펙토링 진행했습니다.

스크린샷

image

멘토에게

  • 아직 자바스크립트를 잘 다루지 못 하는거같아서 고민이 듭니다.. 괜찮으시다면 주강사님께 팁이나 추천해주시는 자료가 있는지 여쭤보고싶습니다.
  • 상수로 표현할때와 함수로 표현할때의 상황을 잘 이해하지 못 하는거같습니다.
  • 셀프 코드 리뷰를 통해 질문 이어가겠습니다.

@rladudgns4456 rladudgns4456 requested a review from kiJu2 July 18, 2025 00:55
@rladudgns4456 rladudgns4456 self-assigned this Jul 18, 2025
@rladudgns4456 rladudgns4456 added the 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. label Jul 18, 2025
@kiJu2
Copy link
Collaborator

kiJu2 commented Jul 19, 2025

스프리트 미션 하시느라 수고 많으셨어요.
영훈님 학습에 도움 되실 수 있게 꼼꼼히 리뷰 하도록 해보겠습니다. 😊

@kiJu2
Copy link
Collaborator

kiJu2 commented Jul 19, 2025

commit 단위를 더욱 자주, 작게 해보시는건 어떠실까요?

git을 다룰 때 commit은 "언제 해야 하는가"를 생각해보신 적 있으신가요?
흔히 하는 말이 있습니다:

커밋은 합칠 수 있지만 나눌 수 없습니다.

그럼 커밋을 언제 해야 할까요?

저는 다음과 같은 룰을 지키며 커밋을 하는걸 권장 드립니다:

  1. 커밋을 하는 단위는 커밋 메시지 한 줄로 설명할 수 있는 행동
  2. 하나의 목표 혹은 액션이 달성될 때

관련하여 읽으시면 좋은 아티클을 추천드릴게요:

tl;dr

관련 변경 사항 커밋
커밋은 관련 변경 사항에 대한 래퍼여야 합니다. 예를 들어 두 개의 다른 버그를 수정하면 두 개의 별도 커밋이 생성되어야 합니다. 작은 커밋을 통해 다른 개발자가 변경 사항을 더 쉽게 이해하고 문제가 발생한 경우 롤백할 수 있습니다. 준비 영역과 같은 도구와 파일의 일부만 준비하는 기능을 통해 Git을 사용하면 매우 세부적인 커밋을 쉽게 만들 수 있습니다.

자주 커밋
커밋은 커밋을 작게 유지하고 관련 변경 사항만 커밋하는 데 도움이 되는 경우가 많습니다. 또한 이를 통해 코드를 다른 사람들과 더 자주 공유할 수 있습니다. 이렇게 하면 모든 사람이 정기적으로 변경 사항을 통합하고 병합 충돌을 방지하는 것이 더 쉬워집니다. 대조적으로, 대규모 커밋을 갖고 이를 드물게 공유하면 충돌을 해결하기가 어렵습니다.

미완성 작업을 커밋하지 마십시오
논리적 구성 요소가 완료된 경우에만 코드를 커밋해야 합니다. 자주 커밋할 수 있도록 기능 구현을 빠르게 완료할 수 있는 논리적 청크로 분할합니다. 깨끗한 작업 복사본이 필요하기 때문에(브랜치 확인, 변경 사항 가져오기 등) 커밋하고 싶은 유혹이 든다면 Git의 «Stash» 기능을 대신 사용하는 것이 좋습니다.

커밋하기 전에 코드를 테스트하세요
완료되었다고 생각하는 일을 저지르고 싶은 유혹에 저항하세요. 철저하게 테스트하여 실제로 완료되었는지, 부작용이 없는지(알 수 있는 한) 확인하세요. 로컬 저장소에 설익은 것을 커밋하려면 자신만 용서하면 되지만, 코드를 다른 사람과 푸시/공유하는 경우에는 코드를 테스트하는 것이 훨씬 더 중요합니다.

원문 보기

@kiJu2
Copy link
Collaborator

kiJu2 commented Jul 19, 2025

커밋 타입도 한 번 고려해보세요 !

tl;dr:

커밋 메시지 형식

type: Subject

body

footer

기본적으로 3가지 영역(제목, 본문, 꼬리말)으로 나누어졌다.

메시지 type은 아래와 같이 분류된다. 아래와 같이 소문자로 작성한다.

| 태그       | 설명                                                       |
|------------|------------------------------------------------------------|
| `feat`     | 새로운 기능 추가                                           |
| `fix`      | 버그 수정                                                  |
| `docs`     | 문서 내용 변경                                             |
| `style`    | 포맷팅, 세미콜론 누락 등 코드 동작에 영향 없는 변경       |
| `refactor` | 코드 리팩토링                                              |
| `test`     | 테스트 코드 작성                                           |
| `chore`    | 빌드 수정, 패키지 설정 등 운영 코드 변경이 없는 작업       |

원문보기

@kiJu2
Copy link
Collaborator

kiJu2 commented Jul 19, 2025

아직 자바스크립트를 잘 다루지 못 하는거같아서 고민이 듭니다.. 괜찮으시다면 주강사님께 팁이나 추천해주시는 자료가 있는지 여쭤보고싶습니다.

그쵸 ㅠ.. 자바스크립트를 처음 들어가면 당연히 어려습니다.
짧은 시간 안에 배우기도 어렵구요.


저는 처음 자바스크립트 공부할 때 다음 웹 문서를 읽고 학습했습니다 !
얕은 곳 부터 깊은 곳 까지 시원하게 설명해주기는 하나, 정독 하시고 완전히 이해하시려면 시간이 꽤나 걸릴거예요.
커리큘럼 상 현 상황에서 추천드리고 싶은 방법은 "너무 깊은 공부하는 것에 빠지지 말자!"라고 조언드리고 싶네요. 정독보다 다독이 나을 때도 있으니까요 !

@kiJu2
Copy link
Collaborator

kiJu2 commented Jul 19, 2025

상수로 표현할때와 함수로 표현할때의 상황을 잘 이해하지 못 하는거같습니다.

오호.. '상수'와 "함수"의 차이는 '의도' 자체에 차이가 있습니다.

구분 의도 (언제 쓰는가?) 예시
상수 _"변하지 않는 값"_을 의미할 때 const MAX_USER = 5;
함수 "어떤 로직/계산/판단이 필요할 때" 사용 function isAdult(age) { return age >= 19; }

작성하고 보니 혹시 표현식에 대한 질문일까요?

아마도 "함수를 변수처럼 선언하는 방식(const func = () => {})" 과
"함수 선언문(function func() {})" 사이의 차이와 쓰임새에 대한 질문일까요?

구분 function func() {} const func = () => {}
호이스팅 ✅ 가능선언 전에 호출 가능 ❌ 변수처럼 취급됨선언 전에 호출 ❌
this 바인딩 this는 실행 시 동적으로 바인딩 this는 상위 스코프를 그대로 사용 (렉시컬 this)
모양/표현식 전통적인 함수 선언 방식 함수도 "값"처럼 다루고 싶을 때
사용 용도 유틸 함수, 전역 함수 등 명확한 선언 콜백, 특정 스코프 한정 함수, 간단한 핸들러 등

화살표 함수 this

기본적으로 function을 사용하시다가 변수처럼 사용하시고 싶으실 때 화살표 함수를 사용하는 것도 좋을 것 같아요.
특별한 상황이 아니라면 기능적인 차이가 없으니까요 😊

@kiJu2 kiJu2 merged commit abb0e62 into codeit-bootcamp-frontend:Basic-김영훈 Jul 19, 2025
Copy link
Collaborator

Choose a reason for hiding this comment

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

와 ..!! 대규모 리팩토링을 했군요 !

구조적으로 훨씬 보기 좋습니다 👍

Copy link
Collaborator

Choose a reason for hiding this comment

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

벡터 이미지로 바꾸셨군요 ! 👍

벡터 이미지는 용량도 적고 확대해도 깨지지 않아서 점, 선, 면 등 수학적으로 출력 가능한 그래픽이라면 벡터 이미지로 바꾸는게 좋지요 !

항목 벡터 이미지 (Vector Image) 레스터 이미지 (Raster Image)
해상도 (Resolution) 크기 조절에 따라 선명도 유지 (Scalable) 픽셀 기반, 해상도 의존 (Pixel, device-dependent)
파일 크기 (File Size) 일반적으로 작음 보통 큼, 해상도에 따라 달라짐
주요 사용처 (Usage) - 폰트
- 로고
- 동전/레이저 각인
- 티셔츠/패치
- 명함, 간판
- 모션그래픽 텍스트
- 2D/3D 그래픽
- 사진
- 인쇄물 전반
파일 포맷 (File Formats) - .svg
- .ai
- .eps
- .jpg
- .png
- .gif
- .bmp
- .tiff
제작 소프트웨어 (Software) - 벡터 기반 툴 (예: Adobe Illustrator) - 레스터 기반 툴 (예: Adobe Photoshop)
- 디지털 카메라
- 스캔 이미지

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 +24 to +26
function hasAnyErrorMessages(...errorElements) {
return errorElements.some((el) => el.textContent.trim() !== '');
}
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 +30 to +32
const hasError = hasAnyErrorMessages(emailErrorMsg, passwordErrorMsg);
const isFormValid = isEmailValid && isPasswordValid && !hasError;
updateButtonState(loginButton, isFormValid);
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
const hasError = hasAnyErrorMessages(emailErrorMsg, passwordErrorMsg);
const isFormValid = isEmailValid && isPasswordValid && !hasError;
updateButtonState(loginButton, isFormValid);
updateButtonState(loginButton, isEmailValid && isPasswordValid && !hasAnyErrorMessages(emailErrorMsg, passwordErrorMsg));

loginForm.addEventListener('submit', (e) => {
e.preventDefault();
if (isEmailValid && isPasswordValid) {
window.location.href = ROUTES.items;
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 +21 to +24
export const ROUTES = {
items: "/items",
login: "../login/login.html",
}; No newline at end of file
Copy link
Collaborator

Choose a reason for hiding this comment

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

(이어서) 👍👍👍

다만, 상대경로보다는 절대경로로 사용하는게 편하겠어요.
예를 들어서 /products/12에서 ROUTES.login을 참조하면 잘못된 경로로 이동될 수 있으니까요 😉

Suggested change
export const ROUTES = {
items: "/items",
login: "../login/login.html",
};
export const ROUTES = {
items: "/items",
login: "/login/login.html",
};

Copy link
Collaborator

Choose a reason for hiding this comment

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

공유 자원을 따로 빼두신 것도 좋은 전략이네요 👍👍

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 +5 to +20
export function validateEmailField(inputEle, errorEle) {
const value = inputEle.value.trim();

if (value === "") {
showError(inputEle, errorEle, ERROR_MESSAGE.emptyEmail);
return false;
}

if (!validateEmail(value)) {
showError(inputEle, errorEle, ERROR_MESSAGE.invalidEmail);
return false;
}

hideError(inputEle, errorEle);
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.

굿굿 ! Guard Clause을 사용하셨군요 !

Guard Clause을 사용하게 되면 조건부를 조기에 처리할 수 있게 되어 핵심 로직을 구분할 수 있다는 장점이 있습니다. 따라서 가독성을 향상시킬 수 있어요.

또한, 미리 조건에 따라서 데이터의 범위를 좁힐 수 있기에 핵심 로직에서는 보장받은 데이터를 편리하게 사용할 수 있다는 장점도 있어요 😊 영훈님 센스가 정말 좋은데요 ?

Guard Clause ?

다음과 같이 조기에 함수를 끝내는 기법을 의미합니다:

function calculateDiscount(price, discountRate) {
  // Guard Clause: 가격이나 할인율이 유효하지 않으면 함수 종료
  if (price <= 0 || discountRate <= 0 || discountRate > 1) {
    console.error("Invalid price or discount rate");
    return;
  }

  // 할인된 가격 계산
  const discountedPrice = price * (1 - discountRate);
  return discountedPrice;
}

@kiJu2
Copy link
Collaborator

kiJu2 commented Jul 19, 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