본문 바로가기

IT

Effective Typescript - 56 - 정보를 감추는 목적으로 private 사용하지 않기

자바스크립트는 클래스에 비공개 속성을 만들 수 없습니다. 마찬가지로 타입스크립트에서도 public, protected, private 접근 제어자를 사용할 수 있으나 공개 규칙을 강제할 수 없습니다. 타입스크립트 접근 제어자들은 컴파일 이후 사라지는 키워드이며 컴파일 시점에서만 오류를 표현해줍니다. 런타임에는 아무런 효력이 없다는 뜻입니다.

 

정보를 감추기 위한 목적이라면 타입스크립트 접근 제어자 대신 클로저를 사용하는 것입니다.

declare function hash(text: string): number;

class PasswordChecker {
    checkPassword: (password: string) => boolean;
    constructor(passwordHash: number) {
        this.checkPassword = (password: string) => {
            return hash(password) === passwordHash;
        }
    }
}

const checker = new PasswordChecker(hash('ABBB'));
checker.checkPassword('ABBB');

위 예제와 같은 방법을 이요하면 몇 가지 주의사항이 있다고 합니다.

위 예제를 기준으로 'passwordHash' 값은 생성자 외부에서 접근할 수 없기 때문에, 해당 변수에 접근해야 하는 메서드의 경우 똑같이 생성자 내부에서 정의되어야 합니다.

그리고, 메서드 정의가 생성자 내부에 존재하게 되면, 인스턴스를 생성할 때마다 각 메서드의 복제본이 생성되기 때문에 메모리의 낭비가 발생할 우려가 있다고 합니다.

 

다음 선택지로, '#' 접두사를 붙혀서 타입 체크와 런타임 모두 비공개로 만들 수 있습니다.

declare function hash(text: string): number;

class
PasswordChecker {
    #passwordHash: number;
    constructor(passwordHash: number) {
        this.passwordHash = passwordHash;
    }
    checkPassword(password: string){
        return hash(password) === this.#passwordHash;
    }
}