전부터 문자열 관련 코드카타를 풀다보면 난 몇줄 이상의 코드를 써야하지만, 다른사람 코드를 봤을 때 한줄로 끝나는 것을 보고
허무함을 느낀적이 많았다.
바로 정규식이다..
회원가입 시 이메일 형식에 대하여 검증을 할 때 정규식을 사용하였다.
물론 저번 과제때도 사용했지만, 인터넷에서 그냥 가져다가 쓰는 것 보다도 어떤 역할을 하는지 다시 한번 집고 넘어가는게
남는거라 생각해서 기록해본다..
/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
/^ $/
정규식의 처음과 끝을 의미한다.
[a-zA-Z0-9._%+-]+
들어갈 수 있는 형식이 a-z , A-Z, 0-9 , _ , %, +, - 라는 뜻이고 +는 하나 이상이 입력이 되어야 한다라는 뜻이다.
{2,}
2글자 이상 입력이 되어야 할 때 사용한다.
const validEmail = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
const email = "test@naver.com";
if(validEmail.test(email)) console.log("ㅇㅇ 형식 맞음"); // ㅇㅇ 형식 맞음이 출력된다.
개인 과제가 끝나자마자.. 팀 프로젝트가 시작되었다.
24.09.13 ~ 24.09.16 필수 목록 구현
24.09.19 ~ 24.09.25 도전 목록 구현
팀원 4명이서 필수구현 역할을 분담하여 작업하기로 했고, 본인은 전 과제 활용할 수 있는 1,2,3 을 맡게 되었다.
기존 코드에서 조금만 손보면 바로 연동 가능한 상태라 필수 구현 목록 역할에서 파생하여 별도의 라우터를
좀 더 구현 해야겠다.
선수 데이터의 경우 이름, 스탯을 무작위로 돌려서 SQL에 직접 주입했다.
시작 전 회의를 통해 DB를 우선적으로 설계하고 시작하였고 큰 프로젝트가 아니기 때문에 테이블을 최대한 줄여서 작업.
router.post('/auth/sign-up', async (req, res, next) => {
const {
body: { email, password, name }, // body에서 필요한 데이터 추출
} = req;
const validEmail = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; // 유효한 이메일 형식
try {
// 데이터베이스에서 userId에 해당하는 사용자가 있는지 확인
const isExistUser = await prisma.users.findFirst({
where: { email },
});
// 이메일이 이미 존재하는 경우
if (isExistUser) {
return res.status(409).json({
errorMessage: '이미 존재하는 이메일 입니다.',
});
}
// 아이디 형식이 소문자와 숫자의 조합이 아닌 경우
if (!validEmail.test(email)) {
return res.status(400).json({
errorMessage: '이메일 형식이 아닙니다.',
});
}
// 비밀번호 길이가 6자리 미만인 경우
if (password.length < 6) {
return res.status(400).json({
errorMessage: '비밀번호는 최소 6자리 이상만 가능합니다.',
});
}
const hashedPw = await bcrypt.hash(password, 10); // 비밀번호 해시화
// 유저 정보 Database 등록
const user = await prisma.Users.create({
data: { email, password: hashedPw, name }, // 새로운 사용자 생성
});
return res.status(201).json({
data: {
userID: user.userID, // 생성된 사용자 번호 반환
email: user.email, // 생성된 사용자 아이디 반환
name: user.name, // 생성된 사용자 이름 반환
},
});
} catch (err) {
console.error(err);
next(err); // 에러 발생 시 다음 미들웨어로 전달
}
});
router.post('/auth/sign-in', async (req, res, next) => {
const {
body: { email, password }, // Body에서 userId와 userPw 추출
} = req;
try {
// 데이터베이스에서 userId에 해당하는 사용자가 있는지 확인
const isExistUser = await prisma.users.findFirst({
where: { email },
});
// 사용자가 존재하지 않는 경우
if (!isExistUser) {
return res.status(400).json({
errorMessage: '없는 아이디 입니다.',
});
}
// 비밀번호가 틀린 경우
if (!(await bcrypt.compare(password, isExistUser.password))) {
return res.status(401).json({
errorMessage: '틀린 비밀번호 입니다.',
});
}
const token = jwt.sign({ userID: isExistUser.userID }, SECRET_CODE); // JWT 토큰 생성
res.setHeader('Authorization', `Bearer ${token}`); // 응답 헤더에 토큰 설정
return res
.status(200)
.json({ message: '로그인 성공, 헤더에 토큰값이 반환되었습니다.' }); // 성공 메시지 반환
} catch (err) {
console.error(err);
next(err); // 에러 발생 시 다음 미들웨어로 전달
}
});