
//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 레벨로 비즈니스 로직 판단에 필요한 데이터를 넘겨 줄 때, 어떤 형태로 넘겨줄 것인가?
의 역할은 무엇일까?
JavaScript의 내장 함수로, 문자열을 정수로 변환함. 함수의 인자로 전달된 문자열을 해석하여 정수로 변환하고, 변환된 정수 값을 반환.
dao레벨부터 어떻게 데이터가 끌려나오는지 데이터의 입장에서 정리해보자.
[{ exist: 1 }]
{ exist: 1 }
exist라는 키값의 밸류를 뽑아낸다.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가 되었을 가능성도 있다.
그래서 결론이 뭐냐고?