치킨 프로젝트 리펙토링 - 회원가입

이정기·2023년 5월 10일
0

TIL

목록 보기
66/71
post-thumbnail

전 프로젝트를 리펙토링 중이다. 3계층에 대한 이해도가 부족해 routh 에 카테고리 별로만 분류해 코드를 모두 넣었는데 3계층을 넣어 코드의 구성, 유지보수성, 확장성을 개선했다.

리펙토링의 첫 API 는 회원가입이였다. 컨트롤러, 서비스 , 레포지토리 계층으로 나누었다.

3계층을 나누며 중요하게 생각했던건 각 계층마다 해야하는 역할에 충실히 해보자는 것이였다.

리펙토링 전

컨트롤러 계층

  • 바디값을 전달받았다.

서비스 계층

  • 비밀번호를 해쉬화 해주었다.

레포지토리 계층

  • 전달받은 인자를 user 테이블에 저장하였다.

정말 기본에 충실했던 우리들의 과거에 박수를 보낸다.

리펙토링

리펙토링 전 난 각 계층에서 무엇을 해야하는지 정확히 파악할 필요가 있었다.

컨트롤러 계층 역할

컨트롤러는 클라이언트의 요청을 처리하고, 요청의 유효성 검사, 데이터 변환, 응답 생성을 하고, 서비스로부터 반환된 결과를 상태코드와 함께 응답으로 반환한다

서비스 계층 역할

애플리케이션의 비즈니스 로직을 구현하는 역할을 한다. 비즈니스 로직이란 예를들어 회원가입에선 데이터를 검증하고, 이메일 인증을 보내거나 중복검사를 시행한다.

  • 중복 회원가입 방지
  • 암호화
  • 이메일 인증 및 추가적인 검증
  • 기타 비즈니스 규칙 등
    을 예로 들을 수 있다.

레포지토리 계층 역할

데이터베이스와 직접적으로 상호작용하는 계층이다.

리펙토링 시작

컨트롤러 계층 수정

컨트롤러계층에선 try-catch 로 에러핸들링을 해주고, 적절한 상태코드를 반환해주었다. 그리고 필드가 모두 작성되었는지 확인 후 서비스 계층으로 념겨주었다.

새롭게 알았던건 서비스계층에선 throw new Error 로 에러를 던저주기만 하고 컨트롤러에서 try-catch 문을 사용해 예외처리를 한다는 것이다.

서비스 계층 수정

이메일 중복검사와 중요한 비밀번호 암호화를 서비스 계층에서 진행했다.
암호화는 일반적으로 많이 사용하는 bcrypt 비밀번호 암호화 라이브러리를 사용했다.

bcrypt 는 복잡한 해시 알고리즘을 사용하고, 솔트(Salt)를 사용해 비밀번호를 해시화 한다. 솔트는 비밀번호에 무작위 문자를 추가하는데 , 해시 결과를 더욱 고유하게 만들어서 레인보우 테이블과 같은 사전 공격을 어렵게 해준다.
그리고 bcrypt는 일반적인 해시 함수보다 계산에 더 많은 시간과 자원을 필요로 해 공격자가 빠르게 대량의 해시를 계산하는 것을 어렵게 만든다.

const saltRounds = 10;
    const salt = await bcrypt.genSalt(saltRounds);
    const hashedPassword = await bcrypt.hash(password, salt);

간편히 솔트와 해시화를 진행해 저장하였다.

직접 해보니 별거 없었다.

레포지토리 계층 수정

수정이 딱히 없었다. 컨트롤러와 서비스 계층에서의 역할을 제대로 수행하고 바로 꽂아 넣어주기만 했다.

소감

어렵게만 생각했던 bcrypt 가 생각보다 너무 간단한 라이브러리여서 놀랐고, 자신감이 올라갔다. 그리고 3계층에서 무엇을 할지 꼼꼼히 적어보니 내 코드에 애착이 가고 뿌듯하다.

profile
Node.js 로 꿈을 꾸었다..

0개의 댓글