레이어드 패턴과 parseInt와 쿼리문: 데이터 전달 방법에 대해

하준수·2023년 7월 11일

javascriptSyntax

목록 보기
2/4
post-thumbnail

Disclaimer: 초급반 수준의 지식과 고찰로 기술된, 심지어 전후맥락도 없는 글입니다. Do not try this at your work.

Preface

//adminUserDao.js
const confirmInsiderByEmail = async (email) => {
  const [confirmedInsider] = await appDataSource.query(
    `
    SELECT EXISTS (
      SELECT id
      FROM insider_emails
      WHERE email = ?
    ) exist
    `,
    [email]
  );
  return !!parseInt(confirmedInsider.exist);
};

//adminUserService.js
const adminUserSignUp = async (
  accountName,
  password,
  personalCode,
  name,
  email,
  phoneNumber
) => {
  const confirmedInsider = await adminUserDao.confirmInsiderByEmail(email);

  if (!confirmedInsider) {
    const error = new Error("INVALID_APPROACH");
    error.statusCode = 401;
    throw error;
  }
//중략

미리 생각해 볼 점

dao 레벨에서 service 레벨로 비즈니스 로직 판단에 필요한 데이터를 넘겨 줄 때, 어떤 형태로 넘겨줄 것인가?

!!parseInt(aaa.exist)

의 역할은 무엇일까?
JavaScript의 내장 함수로, 문자열을 정수로 변환함. 함수의 인자로 전달된 문자열을 해석하여 정수로 변환하고, 변환된 정수 값을 반환.
dao레벨부터 어떻게 데이터가 끌려나오는지 데이터의 입장에서 정리해보자.

코드 뜯어보기

  1. 쿼리문을 실행시켜 아래와 같이 배열 형태의 데이터가 끌려나온다.
[{ exist: 1 }]
  1. confirmedInsider의 선언을 대괄호로 구조분해할당했기 때문에 데이터는 객체가 된다.
{ exist: 1 }
  1. 객체 메서드를 사용하여 exist라는 키값의 밸류를 뽑아낸다.
1
  1. 밸류값을 parseInt를 활용하여 (혹시나)문자열일지도 모르는 밸류를 정수값으로 바꿔준다.
1
  1. 논리부정연산자 !를 두번 중첩시켜 (1 또는 0일) 남은 데이터를 truthy falsy 불리언 값으로 변환한다.
true

와후, 한줄거리 코드에 이런 함의가 있다니.

만약 쿼리문이 SELECT EXIST가 아닌 그냥 평범한 SELECT문이라 뽑혀나오는 데이터가 테이블의 id값이고, parseInt 처리 없이 그냥 return confirmedInsider; 해버리면, 서비스레벨에서 검증식은 아래와 같은 형태가 되어야 할 것이다.

  if (confirmedInsider.id === 0) {
    const error = new Error("INVALID_APPROACH");
    error.statusCode = 401;
    throw error;

이렇게 된다면, 안그래도 복잡한 비즈니스 로직을 구상하고 써내려가야 하는 service레벨의 코드를 작성할 때 저 검증식이 추가됨으로 인해 가독성이 떨어질 것 같다. 지금에야 DB에서 읽어오는 데이터가 id값 하나뿐이지만, 만약 읽어와서 논리처리하는 조건이 복수라면 더더욱.
그리고 만약에 DB에 저장되어 있는 데이터가 숫자가 아닌 문자열 형태였다면? 끝없이 에러를 뱉는 API가 되었을 가능성도 있다.

정리

그래서 결론이 뭐냐고?

  1. 저는 자바스크립트 허접입니다.
  2. SQL 공부를 열심히 합시다.
  3. 데이터 전달할 때는 확실한 데이터를 전달해 줍시다. 그게 레이어드 패턴의 레벨 간 에서든, 프론트 - 백 간 협업에서든.

0개의 댓글