email과 number에 대해 유효성 검사를 진행하여햐 하는데 어떻게 진행 할 것인가?
이번 프로젝트는 테스트 코드와 계층 분리 등 의존성 주입에 관한 학습을 많이 하였고, 정규식으로 할 수 있다고 생각 되어 정규식으로 진행하였다
userSignUp = async (req, res, next) => {
try {
// ...
const emailPattern = /^[A-Za-z0-9_\.\-]+@[A-Za-z0-9\-]+\.[A-za-z0-9\-]+/;
const numberPattern = /^[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}/;
// ...
if (emailPattern.test(email)==false) return res.status(400).json({message :'이메일 형식이 올바르지 않습니다.'})
if (numberPattern.test(number)==false) return res.status(400).json({message :'전화번호 형식이 올바르지 않습니다.'})
// ...
} catch (err) {
next(err);
}
}
==================================================== 1
export class UsersController {
constructor(usersService) {
this.usersService = usersService;
}
==================================================== 2
userSignUp = async (req, res, next) => {
try {
const { email, name, password, confirmPassword, addr, number, role } = req.body;
==================================================== 3
const emailPattern = /^[A-Za-z0-9_\.\-]+@[A-Za-z0-9\-]+\.[A-za-z0-9\-]+/;
const numberPattern = /^[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}/;
==================================================== 4
if (!email || !name || !password || !confirmPassword || !addr || !number || !role)
return res.status(400).json({message : '필수 값을 입력하지 않았습니다.'})
if (password !== confirmPassword) return res.status(400).json({message : '비밀번호와 비밀번호 확인이 일치하지 않습니다.'})
if (!['user', 'owner'].includes(role)) return res.status(400).json({message :'올바르지 않은 권한입니다.'})
if (emailPattern.test(email)==false) return res.status(400).json({message :'이메일 형식이 올바르지 않습니다.'})
if (numberPattern.test(number)==false) return res.status(400).json({message :'전화번호 형식이 올바르지 않습니다.'})
const createdUser = await this.usersService.createUser(email, name, password, confirmPassword, addr, number, role);
return res.status(201).json({ data: createdUser });
} catch (err) {
next(err);
}
}
의존성 주입(DI) 해주기
=> 객체 간의 결합도를 낮추고 테스트 코드 작성에 유리. (한 router에서 작성 후 테스트 코드를 하면 의도가 불분명해짐.)
body에서 데이터 받아오기
유효성 검사를 위한 정규식 할당.
A-Z
,a-z
,0-9
,_
,.
,-
@ A-Z
,a-z
,0-9
,-
. A-z
,a-z
,0-9
,-
0-9 범위의 2~3자리
- 0-9 범위의 3~4자리
- 0-9 범위의 4자리
role
(권한)이 user나 owner이 아닐 때 userSignIn = async (req, res, next) => {
try {
const { email, password } = req.body;
const loginUser = await this.usersService.loginUser(email, password)
return res.status(201).json({data:loginUser})
} catch (err) {
next(err);
}
}
}
입력 값을 받아 온 뒤 입력 값을 기반으로 서비스 레이어에 떨궈주기
레포지토리에서 만들어진 데이터를 반환.
각자 레이어에 맞는 역할만 생각하며 짠다면 레이어 나누기는 생각보다 쉬운 거 같다.