MySQL 검색 에러 / 연관된 페이지가 아닌 엉뚱한 페이지 연결 에러

flobeeee·2022년 3월 28일
0

시행착오

목록 보기
33/43

상황

서비스 내에서 캠페인 목록을 보여주고, 해당 캠페인을 누르면 상세 페이지로 이동한다.
상세페이지가 제대로 연결되는 경우가 있었고, 다른캠페인의 상세 페이지로 연결되는 경우가 있었다.


소스확인

내부 admin에서 보는 목록과 외부인이 보는 목록은 같아도,
내부에서는 내부 id를 사용하고, 외부에서는 id가 노출되지 않게 uniqueId를 만들어서 사용한다.

AdonisJS의 경우, 미들웨어에서 param을 미리 확인해 데이터를 가져올 수 있다.
캠페인의 경우, 아래처럼 코드가 작성되어 있었다.

case Campaign.table:
  item = await Campaign.query()
    .andWhere(async function (builder) {
    builder.where('uniqueId', uniqueId)
    .orWhere('id', uniqueId)
  })
   .first()
break

상황파악

만약 uniqueId가 '63JaQjd1r2'인 경우,
id가 63인 데이터도 불러와졌다.

아래처럼 직접 MySQL workbench에서 확인할 수 있었다.

처음 코드를 작성할 때 63이 들어오면 id에서 찾아오고,
'63JaQjd1r2'이 들어오면 id는 숫자니까 당연히 해당되지 않아서
검색되는 데이터는 1개라고 생각했을 것이다.


수정코드

case Campaign.table:
  item = await Campaign.query().where('uniqueId', uniqueId).first()
  if (item === null) {
    item = await Campaign.query().where('id', uniqueId).first()
  }
 break

id 가 '63JaQjd1r2' 으로 검색을 했을 땐 아무것도 나오지 않아서,
uniqueId로 먼저 검색을 한 뒤에, 데이터가 불러와지지않으면 그 후에야 id를 검색하는 방법이다.
팀원 JH님이 내 코드를 보다가 숫자인지 아닌지 판별해서 분기처리하는게 더 깔끔할 거 같다는 의견을 주셨다.


최종코드

case Campaign.table:
   if (isNaN(Number(uid))) {
     item = await Campaign.query().where('uid', uid).whereNull('deleted_at').first()
   } else {
      item = await Campaign.query().where('id', uid).whereNull('deleted_at').first()
   }
break

isNaN 메소드를 활용해서 분기처리를 했다.
훨씬 깔끔해진 느낌이다.


짧은 편지

MySQL 개발자님. 이거 에러 잡아주세여.
저까지 이 에러를 경험했다는 건 정말 많은 개발자들이 같은 에러를 경험했다는 뜻입니다.
언제 고쳐주시는 건가요.
저처럼 isNaN 메소드 활용해서 타입확인 후 검색돌게 하는 방법은 어떠신가요 ?

profile
기록하는 백엔드 개발자

0개의 댓글