[TIL] 백오피스 프로젝트 01

최하온·2024년 2월 27일
0

TIL

목록 보기
40/71
post-thumbnail

🚨Issue occuring


email과 number에 대해 유효성 검사를 진행하여햐 하는데 어떻게 진행 할 것인가?

💦What I tried


  1. joi 라이브러리를 사용
  • 정규 표현식을 몰라도 사용 가능
  1. 정규표현식 사용
  • 다른 라이브러리를 사용하지 않기 때문에 의존성이 낮음

이번 프로젝트는 테스트 코드와 계층 분리 등 의존성 주입에 관한 학습을 많이 하였고, 정규식으로 할 수 있다고 생각 되어 정규식으로 진행하였다

💡How solve issue


    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);
        }
    }

Code Review


controller layered

회원 가입 API

==================================================== 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);
        }
    }
  1. 의존성 주입(DI) 해주기
    => 객체 간의 결합도를 낮추고 테스트 코드 작성에 유리. (한 router에서 작성 후 테스트 코드를 하면 의도가 불분명해짐.)

  2. body에서 데이터 받아오기

  3. 유효성 검사를 위한 정규식 할당.

  • emailPattern : A-Z,a-z,0-9,_,.,- @ A-Z,a-z,0-9,- . A-z,a-z,0-9,-
  • numberPattern : 0-9 범위의 2~3자리 - 0-9 범위의 3~4자리 - 0-9 범위의 4자리
  1. 유효성 검사 진행.
  • 회원 가입 시 필수(NOT NULL) 입력 값들을 작성 하지 않았을 때
  • 비밀번호와 확인이 일치하지 않았을 때
  • role(권한)이 user나 owner이 아닐 때
  • 정규 표현식을 통한 검사

로그인 API

   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);
       }
   }
}

입력 값을 받아 온 뒤 입력 값을 기반으로 서비스 레이어에 떨궈주기
레포지토리에서 만들어진 데이터를 반환.

🤔Realization


각자 레이어에 맞는 역할만 생각하며 짠다면 레이어 나누기는 생각보다 쉬운 거 같다.

0개의 댓글