Private Method in JavaScript Class

kipras-streimikis-205588

옛날 JS에서는 프로토타입을 기반으로한 객체지향을 추구해왔다면, 요즘 JS는 Class를 지원하기 시작했다. 하지만, 그 요-즘 JS에서 private 이라는 키워드가 존재하지 않는다. 이런 상황에서 private method를 만드려면 어떤 식으로 구현해야할까? 내가 아는 것은 두 가지. 하나는 클래스 외부에서 쓸 수는 있지만, 쓰지 말아주세요! 라는 의미를 가진 naming convention을 따르는 것. 나머지 하나는 클래스 외부에서 절대 private 메소드를 접근할 수 없게 JS의 변태스러운 부분(?)을 이용하는 것. 미리 말하자면 나는 전자를 따른다.

Naming Convention

간단하다. 변수명 또는 메소드명 앞에 underscore를 붙인다. _가 앞에 붙어있는 멤버들은 되도록 클래스 외부에서 접근하지 않는 것이다. eslint에서도 이런 부분을 아주 잘 지원하고 있는데, "no-underscore-dangle": ["error", { "allowAfterThis": true }],를 사용하여 this._someFunction()을 허용하고, (new MyClass())._someFunction()은 error를 띄우는 방법이다.

.call(this, …);

또 다른 방법은 함수를 export 하지 않고, 클래스 내부에서 부를 때 마다 someFunction.call(this, parameter0, parameter1, ...); 과 같이 부르는 것이다. 여기서 주의할 점은 someFunction() 함수는 람다식이 아니어야 하는데, 바로 이 부분이 내가 JS의 변태성을 느낀 부분인, 어디로 튈지 모르는 this!! 사족: 람다식에서도 .call() 을 부를 순 있지만, call의 첫 파라미터는 this로 바인딩할 대상이 아니라 그냥 그 함수의 첫 번째 파라미터일 뿐이다.


하지만 이 방법은 외부에서의 함수접근을 잘 막아줄지언정 코드를 너무 장황하게 만든다는 단점이 있다. 함수 호출이 더 이상 함수 호출처럼 보이지 않게 되는 거지같은 가독성을 보여준다. 언어레벨에서 지원하지 않는 것을 굳이 이런 어거지 workaround로 스트레스 받아가며 사용할 이유가 있을까? 나는 결국 eslint를 엄격하게 지키면서 누이 좋고 매부 좋은 (?) naming convention을 따르기로 했다.

Leave a Reply