post-custom-banner

0. Overview

?? 연산자|| 연산자
명칭널 병합 연산(Nullish coalescing operator)논리 OR 연산자(Logical OR)
내용왼쪽 값이 null 이나 undefined 인 경우에만 오른쪽 값을 반환하는 연산자왼쪽 값이 falsy 인 경우 모두 오른쪽 값을 반환하는 연산자
왼쪽 피연산자 조건null, undefinednull, undefined, false, 0, '', NaN
ex)null ?? false => false
false ?? 293 => false
null || false => false
false || 293 => 293

1. Contents

"널 병합 연산자" 라고 불리는 ?? 물음표 2개 연산자에 대해 간단히 정리해두려고 합니다. (특별한 경우가 아니면 대부분 논리 OR 연산자(||) 를 사용하고 있기 때문에 매번 사용할 때마다 헷갈리더군요.)

널 병합 연산자는 비교적 최근에 만들어진 연산자라고 합니다. 그래서인지 저는 대부분의 경우 논리 OR 연산자(||)를 사용하고 있었는데요. 대부분의 경우에는 논리 OR 연산자(||)를 사용해도 되었지만 이번 태스크에서만큼은 반드시 널 병합 연산자를 사용해야만 했습니다.

1-1) 왼쪽 피연산자에 boolean 값을 넣고 싶다면? 널 병합 연산자를 사용하자

DynamoDB의 query 함수에는 ScanIndexForward 라는 항목이 있습니다. 일종의 정렬(Sorting) 조건인데요. 기본값이 true 이고 이 경우 오름차순(ASC) 가 됩니다. false 일 때는 내림차순(DESC)이 되구요.

이번에 맡은 태스크에서는 이 ScanIndexForward 의 값을 조건에 따라 변경하는 처리가 필요했습니다. 조건에 따라 정렬을 바꿔서 query 를 실행해야했는데 아주 간단하다고 생각했습니다.

아래의 코드에서 ScanForwardIndex 의 값은 sort 파라미터의 존재 유무나 값에 따라 달라집니다.

  • sort 파라미터의 값이 없을 경우의 ScanIndexForward 값: true
  • sort 파라미터의 값이 있을 경우의 ScanIndexForward 값: sort 의 값
  async fetchItems(id: string, sort?: boolean): Promise<Item[]> {
    ...
    const query = {
      TableName: 'ItemTable',
      Index: 'byItemId',
      ...
      ScanIndexForward: sort || true
    };
    ...
  }
 

문제는 위의 코드에서 sort 값이 false 인 경우입니다. ScanIndexForward 의 값은 sort 값이 없는 경우와 sort 값이 true 인 경우에만 true 가 되어야 하는데, 논리 OR 연산자(||) 를 사용하게 되면 모든 경우에서 true 가 되었습니다.

논리 OR 연산자(||) 는 왼쪽 피연산자가 falsy 값(조건)이면 오른쪽 피연산자의 값을 반환합니다. sort 가 false 값이라면 ScanIndexForward 에 false 값을 넣는 것이 아니라 오른쪽 피연산자인 true 값을 넣게 됩니다. 따라서 sort 파라미터의 존재 유무, 값에 상관없이 무조건 오른쪽 피연산자인 true 가 됩니다.

바로 이런 경우에 널 병합 연산자를 사용할 수 있습니다. 논리 OR 연산자(||)에 비해 널 병합 연산자는 왼쪽 피연산자의 조건이 단순합니다. 오로지 null 또는 undefined 입니다. falsy 값이 아니라 값이 없는 경우에만 오른쪽 피연산자의 값을 반환합니다.

널 병합 연산자(??)논리 OR 연산자(||)
왼쪽 피연산자의 값(조건)null, undefinednull, undefined, false, 0, '', NaN

따라서 위의 코드를 아래와 같이 수정하여 해결하였습니다. (|| -> ??) 이 코드라면 sort 파라미터의 값이 false 인 경우에 ScanIndexForward 도 false 가 됩니다.

  async fetchItems(id: string, sort?: boolean): Promise<Item[]> {
    ...
    const query = {
      TableName: 'ItemTable',
      Index: 'byItemId',
      ...
      ScanIndexForward: sort ?? true
    };
    ...
  }
 

2. Conclusion

널 병합 연산자의 조건은 단순합니다. 값이 없는 경우(null, undefined)에만 오른쪽 값을 반환합니다. falsy 값 중 단 2개만 체크합니다.


profile
Tokyo Dev
post-custom-banner

0개의 댓글