2024. 9. 10. 23:05ㆍ[Node.js_6기 본캠프 TIL]
🚧 회원가입 유효성 검사
회원가입 관련, 과제에서 주어진 유효성 검사 기준은 2가지였다. 아이디가 '영어 소문자 + 숫자 조합' 일 것, 패스워드가 6글자 이상일 것. 해당 기능은 어제 테스트 해 본 결과, Prisma에서 구현은 불가능하며 router의 회원가입 API에서 조건을 걸어줘야 했다. 패스워드는 입력받은 값의 길이만 확인하면 간단하게 검사할 수 있었다.
if (password.length < 6) {
return res
.status(409)
.json({ message: "비밀번호는 6글자 이상 입력해주세요." });
}
문제는 아이디였다. 'js 영문+숫자 조합' 등의 검색어로 찾아보니, 정규식이라는 것이 있었다. 회원가입 관련 로직에서 많이 사용한다고 하여, 코드에 적용해보았다.
regex로 조건을 선언해주고, 해당 조건의 테스트를 입력받은 account 값이 통과하지 못하면 error message가 반환되는 로직을 짰...다고 생각했다. 사용 방법이 잘못된 것인지, 예상치 못한 결과가 나왔다.
영문이나 숫자가 들어가기만 하면 OK인 정규식을 사용하고 있었기 때문에, 영어 소문자만 기입해도 회원가입 처리가 되었다. 다시 구글링을 돌린 끝에, 비슷한 사유로 고통받던 개발자의 블로그에서 다른 형태의 정규식을 찾았다.
var idFilters = /^[a-zA-Z0-9](?=.*[a-zA-Z])(?=.*[0-9]).{3,12}$/g;
문제는 이 코드를 사용해도 원하는 것처럼 영문 소문자 + 숫자 조합의 아이디에 대한 유효성 검사가 원활하지 않았다. 테스트를 돌릴 때마다 반절은 의도대로 response가 나오는데, 반절은 예상치 못한 response가 나왔다.
퇴근 기념으로 안부를 묻던 개발자 지인이 재밌어 보인다고 같이 코드를 뜯어보다가 해답을 찾았다. 정규식도 순서가 중요해서, 한번 조건이 true로 판정되면 뒤의 조건은 아예 진행되지 않는 것이었다. 사용하던 코드를 뜯어보면 구조는 다음과 같았다.
- ^(?=.*[a-z]) : 문자열에 적어도 하나의 소문자가 포함되어야 함.
- (?=.*[0-9]) : 문자열에 적어도 하나의 숫자가 포함되어야 함.
- [a-z0-9]+$ : 문자열이 소문자와 숫자로만 이루어져야 함.
기존에 쓰던 코드는 문자열이 소문자와 숫자로만 이루어졌는지 판별하고 바로 끝나버렸기 때문에, 소문자만 들어가거나 숫자만 들어가도 회원가입이 되었던 문제였다.
🚩 완성된 코드
let regex = /^(?=.*[a-z])(?=.*[0-9])[a-z0-9]+$/;
if (!regex.test(account)) {
console.log(account);
return res
.status(409)
.json({ message: "계정 명은 영어 소문자 + 숫자 조합으로 입력해주세요." });
}
'[Node.js_6기 본캠프 TIL]' 카테고리의 다른 글
CH 3 풋살 온라인 프로젝트 - 트러블 슈팅 0913 (1) | 2024.09.13 |
---|---|
CH3 아이템 시뮬레이터 과제 - 트러블슈팅 0911 (0) | 2024.09.12 |
CH 3 아이템 시뮬레이터 과제 - 트러블슈팅 0909 (0) | 2024.09.09 |
AWS에서 사라진 EC2 찾기 (1) | 2024.09.06 |
[프로그래머스] 푸드 파이트 대회(JavaScript) (1) | 2024.09.05 |