?? 연산자 | || 연산자 | |
---|---|---|
명칭 | 널 병합 연산(Nullish coalescing operator) | 논리 OR 연산자(Logical OR) |
내용 | 왼쪽 값이 null 이나 undefined 인 경우에만 오른쪽 값을 반환하는 연산자 | 왼쪽 값이 falsy 인 경우 모두 오른쪽 값을 반환하는 연산자 |
왼쪽 피연산자 조건 | null, undefined | null, undefined, false, 0, '', NaN |
ex) | null ?? false => false false ?? 293 => false | null || false => false false || 293 => 293 |
"널 병합 연산자" 라고 불리는 ?? 물음표 2개 연산자에 대해 간단히 정리해두려고 합니다. (특별한 경우가 아니면 대부분 논리 OR 연산자(||) 를 사용하고 있기 때문에 매번 사용할 때마다 헷갈리더군요.)
널 병합 연산자는 비교적 최근에 만들어진 연산자라고 합니다. 그래서인지 저는 대부분의 경우 논리 OR 연산자(||)를 사용하고 있었는데요. 대부분의 경우에는 논리 OR 연산자(||)를 사용해도 되었지만 이번 태스크에서만큼은 반드시 널 병합 연산자를 사용해야만 했습니다.
DynamoDB의 query 함수에는 ScanIndexForward
라는 항목이 있습니다. 일종의 정렬(Sorting) 조건인데요. 기본값이 true 이고 이 경우 오름차순(ASC) 가 됩니다. false 일 때는 내림차순(DESC)이 되구요.
이번에 맡은 태스크에서는 이 ScanIndexForward 의 값을 조건에 따라 변경하는 처리가 필요했습니다. 조건에 따라 정렬을 바꿔서 query 를 실행해야했는데 아주 간단하다고 생각했습니다.
아래의 코드에서 ScanForwardIndex 의 값은 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, undefined | null, 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
};
...
}
널 병합 연산자의 조건은 단순합니다. 값이 없는 경우(null, undefined)에만 오른쪽 값을 반환합니다. falsy 값 중 단 2개만 체크합니다.