[TypeScript] 네임스페이스(Namespace)를 쓰지 말라고?
네임스페이스(Namespace)를 쓰는 가장 큰 이유는 무엇일까요?
강력한 그룹화입니다.
이 강력한 그룹화를 통해 공간을 구분하고 외부 사용자에게 명확한 공간을 제공하여 가독성 + 유지보수성을 올려줍니다.
네임스페이스로 나뉜 공간은 해당 네임스페이스에 소속된 개체들만의 공간으로 사용됩니다.
이러한 강력한 그룹화는 외부로 배포해야 하는 라이브러리들에게서 강력한 장점을 발휘합니다.
네임스페이스만 겹치지 않는다면 어떤 프로젝트에다 붙여도 독립된 공간을 보장받기 때문입니다.
이런 독립된 공간은 이름이 구분되어 명확한 접근을 보장하므로 문의를 받을 때도 항상 같은 위치를 알려주므로 대응도 쉽게 할 수 있게 해줍니다.
1. 자바스크립트에서의 네임스페이스
그런데 자바스크립트에는 네임스페이스라는 개념이 없습니다.
이것을 보안하고자 몇 가지 테크닉이 있긴 하지만 사실상 땜빵입니다.
타입스크립트에 네임스페이스라는 개념이 있긴 하지만 쓰지 말라고 합니다.....?
대신 '모듈(module) 시스템'을 사용하라고 합니다.
2. '모듈(module) 시스템'의 문제
문제는 모듈 시스템은 '강력한 그룹화'를 위해 사용하는 기능이 아니라는데 있습니다.
예를 들어 아래 코드를 봅시다.
// add.ts
export function add(a: number, b: number): number {
return a + b;
}
// subtract.ts
export function subtract(a: number, b: number): number {
return a - b;
}
// apptest.ts
import { add } from './add';
import { subtract } from './subtract';
const sum = add(1, 2);
const difference = subtract(3, 2);
'apptest.ts'는 네임스페이스 역할을 하는 모듈이 됩니다.
외부에서는 'apptest.ts'를 참조하여 하위 모듈(혹은 개체)에 접근할 수 있습니다.
이것만 보면 네임스페이스의 그룹화랑 같은거같지만.....
여기에는 함정이 있는데 사용자는 굳이 그룹화 돼있는 'apptest.ts'를 참조하지 않아도 된다는 것입니다.
즉, 개발자가 원하는 대로 네임스페이스를 강제할 수 없습니다.
3. 모듈의 한계
이것을 체험해 보려면 IDE에서 자동 참조 기능이나 참조를 찾아주는 기능을 써보면 됩니다.
'apptest .ts'만 찾아가는 게 아니라 'add.ts'도 찾아가 집니다.
import { add as add1 } from './apptest';
import { add as add2 } from './add';
const sum1 = add1(1, 2);
const sum2 = add2(1, 2);
우리의 의도는 'apptest .ts'를 통해 'add.ts'를 참조하는 것이지만 강제할 방법이 없습니다.
그러다 보니 별생각 없이 자동으로 참조를 추가해 주는 기능을 사용하면 내가 그룹화 해놓은 파일을 참조하지 않고 원본을 참조하는 경우가 자주 생깁니다.
이렇게되면 대응하기 힘들어 질 수있습니다.
예를 들어 봅시다.
사용자(라이브러리를 갔다 쓰는 개발자)가 자기 멋대로 'ppap.ts'로 다른 라이브러리와 함께 'add.ts'그룹화를 해놓았습니다.
그런데 에러가 났다고 질문을 했는데 ' ppap.add'라고 합니다....?
우리는 이 '.add'가 우리가 만든 라이브러리를 사용한 것인지 다른 라이브러리를 우리 것이라고 착각하고 질문한 것인지 알 방법이 없습니다.
4. 결론
이걸 가지고 '유연'이라는 표현을 써서 에둘러 장점이라고 표현한 자료를 보고 있으면 한숨이 나옵니다.
모듈 시스템의 장점을 설명할 때 '강력한 고립'이라는 단어가 나오는데 이건 네임스페이스처럼 그룹의 고립이 아니라 모듈 스코프의 고립을 말합니다.
즉, 모듈 시스템은 그룹화 목적으로 사용할 수 없습니다.
이것을 전제하지 않고 네임스페이스 대신 모듈 시스템을 사용했다가는 낭패를 볼 수 있습니다.
5. 해결 방법
결국 자바스크립트에서 네임스페이스의 그룹화를 사용하려면 방법은 한가지 뿐입니다.
강력한 메뉴얼화를 통해 '코딩 스타일 가이드(Coding Style Guide)'나 '코딩 표준(Coding Standard)'을 정하고,
이것을 지키게 하는 것입니다.
그나마 다행인 건 내부 프로젝트의 경우 회사나 프로젝트별로 '코딩 스타일 가이드'가 있을 테니 이 스타일을 지키는게 강제되고,
외부 공개 라이브러리라면 메뉴얼을 안 지켰을 때 대응을 안 하거나 소극적으로 대응하는 방법으로 지키도록 유도하는 것이 가능하다는 점입니다.
하지만 프로그래밍언어의 설계에서 추가되는 대부분의 기능은 사람들이 메뉴얼을 지키지 않아서(그것이 의도됐든 의도되지 않았든) 생기는 거라는게 가장 큰 문제죠.....
마무리
라이브러리를 갔다 쓰는 쪽이 슈퍼 갑만 아니라면 이걸로 인해 문제가 일어날 확률은 그렇게 높지 않습니다.
네임스페이스를 쓸 수 있었다면 이런 고민 자체가 필요 없겠지......라는 생각만 안 한다면 말입니다 ㅎㅎㅎㅎ
의외로 이 문제를 AI를 쓰다가 발견했습니다.
'무슨 함수를 사용하면 된다'
는 답변을 받았는데
'해당 함수가 없는데?'
그래서 더 질문을 깊게 들어가다 보면 이게 다른 라이브러리랑 섞어서 설명하는 것이었습니다;;;
사람들이 자주쓰는 라이브러리라 묶어서 많이 사용하다보니 AI가 그 라이브러리로 인식한게 아닌가 싶습니다.
네임스페이스를 강력하게 지키는 언어에서도 이런 답변이 나오긴 하지만 유독 자바스크립트에서 이런 답변이 많이 생성되는건 '네임스페이스 문제때문아닌가?' 하는 의심을 하고 있습니다.
이것도 시간이 지나면 해결되겠지만 말이죠 ㅎㅎㅎㅎ