[typescript] 타입 가드와 가변성 문제의 실제 프로젝트 적용 사례

타입스크립트를 사용하다 보면 가끔 내부 변수를 보호하여 외부에서의 접근을 막아야 하는 상황이 발생할 수 있습니다. 이러한 경우 타입 가드(Type Guard) 패턴을 활용하여 타입 안전성을 보장하고 가변성 문제를 효과적으로 해결할 수 있습니다.

이번 글에서는 타입 가드를 사용해 가변성 문제를 해결한 실제 프로젝트에서의 적용 사례를 살펴보겠습니다.

1. 타입 가드란?

타입 가드(Type Guard) 는 런타임에 객체의 타입을 체크하고 해당 타입에 따라 동작을 조정하는 코딩 패턴입니다. 주로 TypeScript와 같은 정적 타입 언어에서 사용되며, 가변성 문제를 해결하고 타입 안전성을 보장하는 데에 중요한 역할을 합니다.

2. 가변성 문제의 실제 프로젝트 적용 사례

예를 들어, 금융 서비스를 개발하면서 사용자의 잔액 정보를 다루는 상황을 가정해보겠습니다. 사용자 잔액 정보는 보안상 민감한 정보이므로, 외부에서의 무분별한 수정을 막기 위해 타입 가드를 적용할 수 있습니다.

다음은 UserBalance 라는 클래스가 가변성 문제가 발생하는 간단한 예시입니다.

class UserBalance {
  private _balance: number;

  constructor(balance: number) {
    this._balance = balance;
  }

  get balance(): number {
    return this._balance;
  }

  set balance(newBalance: number) {
    this._balance = newBalance;
  }
}

이 예시에서는 UserBalance 클래스의 balance 프로퍼티에 직접적으로 접근하여 값을 수정할 수 있습니다. 이런 경우 외부에서 임의로 잔액 정보를 수정할 수 있어서 보안상 문제가 발생할 수 있습니다.

이때 다음과 같이 읽기 전용으로 정의된 UserBalanceRO 클래스를 생성하고, 타입 가드를 활용하여 가변성 문제를 해결할 수 있습니다.

class UserBalanceRO {
  private _balance: number;

  constructor(balance: number) {
    this._balance = balance;
  }

  get balance(): number {
    return this._balance;
  }
}

function isUserBalanceRO(obj: any): obj is UserBalanceRO {
  return obj instanceof UserBalanceRO;
}

function processUserBalance(balance: UserBalanceRO) {
  console.log(`User has balance of ${balance.balance}`);
}

const userBalance = new UserBalance(100);
const readonlyUserBalance = new UserBalanceRO(userBalance.balance);

processUserBalance(readonlyUserBalance);

위의 예시에서는 UserBalanceRO 클래스를 생성하여 balance 프로퍼티를 읽기 전용으로 정의하였고, isUserBalanceRO 함수를 통해 해당 타입을 검사하고 있습니다.

이를 통해 사용자 잔액 정보의 가변성 문제를 해결하고, 외부에서의 무분별한 수정을 막을 수 있습니다.

결론

타입 가드를 활용하여 가변성 문제를 해결하는 것은 TypeScript 프로젝트에서 매우 유용한 기법 중 하나입니다. 위와 같이 타입 가드를 적용함으로써, 코드의 유지보수성과 타입 안전성을 향상시킬 수 있습니다.

정적 타입 언어에서는 단순한 참조의 변화로 발생하는 가변성 문제를 타입 가드를 통해 유연하게 해결할 수 있습니다.

관련 자료: TypeScript Official Documentation

이상으로 타입 가드와 가변성 문제의 실제 프로젝트 적용 사례에 대한 내용을 살펴보았습니다. 감사합니다.