typescript

TypeScript Symbol 타입

개발을 하다 보면 'Symbol'이라는 단어를 접해보신 적이 있을 겁니다. JavaScript나 TypeScript 문서를 보다 보면 종종 등장하는 개념일 텐데요, 생소하거나 어려운 느낌이 들어 그냥 지나쳤던 분들도 많을 겁니다.

하지만, Symbol 타입은 잘만 활용하면 매우 강력하고 유용한 도구가 될 수 있습니다. 특히 객체 프로퍼티의 중복 방지나 보안을 강화하고 싶을 때 큰 도움이 되죠. 오늘은 Symbol 타입의 기초부터 활용 예시까지 알아봅시다.


Symbol 타입이란 무엇인가요?

Symbol은 ES6(ECMAScript 2015)에 도입된 자바스크립트의 원시 데이터 타입(Primitive Type) 중 하나입니다. 문자열이나 숫자와는 달리, Symbol은 생성될 때마다 항상 고유하고 유일한 값을 가집니다.

즉, Symbol로 만들어진 값들은 절대로 서로 같지 않다는 특징이 있죠. 이 특징 덕분에 프로퍼티 키를 충돌 없이 사용할 수 있고, 데이터의 숨김 처리에도 매우 효과적입니다. 아래의 예시를 확인해 봅시다.

Symbol
const symbolA = Symbol('hanpy')
const symbolB = Symbol('hanpy')
 
console.log(symbolA === symbolB) // false

심지어 동일한 설명 문자열('hanpy')을 넣었더라도, 두 Symbol 값은 절대 같지 않습니다. 이게 바로 Symbol의 가장 큰 특징이죠.


Symbol 타입은 언제 사용할까요?

Symbol 타입은 다음과 같은 상황에서 매우 유용하게 쓰입니다.

  • 객체의 프로퍼티 키 충돌을 방지하고 싶을 때
  • 외부에서 쉽게 접근하지 못하도록 프로퍼티를 숨기고 싶을 때
  • 시스템 내부에서만 사용되는 고유한 값을 생성할 때

예시: 프로퍼티 충돌 방지

객체의 프로퍼티 키가 중복되는 상황에서 Symbol을 사용하면 안전하게 키를 정의할 수 있습니다.

Symbol
const idSymbol = Symbol('id')
 
const user = {
  name: 'hanpy',
  age: 30,
  [idSymbol]: 'unique_user_id_0001',
}
 
console.log(user[idSymbol]) // "unique_user_id_0001"
// 외부 코드에서 키를 알지 못하면 접근할 수 없음

위와 같이 Symbol을 이용하면 프로퍼티 키 충돌도 없고, 외부 접근도 제한되어 훨씬 더 안전한 코드를 만들 수 있습니다.


TypeScript에서의 Symbol 타입 활용

TypeScript에서는 Symbol 타입을 명시적으로 사용할 수 있습니다. 타입 안정성을 높이고 명확한 코드 작성을 도와줍니다.

Symbol
const symbolKey: symbol = Symbol('secretKey')
 
interface SecretData {
  [symbolKey]: string
}
 
const data: SecretData = {
  [symbolKey]: '이 정보는 비밀정보입니다',
}
 
console.log(data[symbolKey]) // "이 정보는 비밀정보입니다"

이렇게 인터페이스와 Symbol을 결합하여, 데이터의 숨김 처리나 접근 제한을 명확하게 구현할 수 있습니다.


Symbol의 글로벌 레지스트리 활용하기(Symbol.for)

Symbol을 사용할 때 가끔 "같은 Symbol 값을 공유하고 싶다"는 요구사항이 생길 수도 있습니다. 이때 사용하는 것이 바로 Symbol.for입니다. 이 메서드는 전역(global) Symbol 레지스트리에 키를 등록하고 동일한 키로 접근하면 항상 같은 Symbol 값을 반환합니다.

Symbol
const globalSymbol1 = Symbol.for('appKey')
const globalSymbol2 = Symbol.for('appKey')
 
console.log(globalSymbol1 === globalSymbol2) //  true

전역 레지스트리에 저장된 Symbol은 언제나 동일한 키로 접근할 수 있어서 애플리케이션 전역에서 값을 공유할 때 매우 유용합니다.


Symbol 타입 사용 시 주의할 점

Symbol을 사용할 때는 몇 가지 주의할 점도 있습니다.

  • Symbol 값은 암묵적으로 문자열이나 숫자로 변환되지 않습니다. 직접적으로 문자열이나 숫자로 바꾸려고 하면 오류가 발생합니다.
  • Symbol을 객체의 키로 사용할 때 JSON.stringify는 Symbol 타입의 프로퍼티를 무시합니다. 따라서, Symbol을 키로 하는 프로퍼티는 JSON 변환 시 사라집니다.
Symbol
const user = {
  name: 'hanpy',
  [Symbol('id')]: 'hidden_id',
}
 
console.log(JSON.stringify(user))
//  출력: {"name":"hanpy"}
// Symbol 키는 포함되지 않음!

이러한 특성을 잘 이해하고 Symbol을 적절히 사용하면, 더 견고하고 안전한 코드를 작성할 수 있습니다.


정리

오늘은 TypeScript의 Symbol 타입에 대해 자세히 알아보고, 이를 실무에서 활용하는 다양한 예시를 살펴보았습니다. Symbol 타입을 잘 활용하면 객체 프로퍼티의 중복과 외부 접근 문제를 쉽게 해결할 수 있으며, 더 명확하고 안전한 코드 작성이 가능해집니다.


참고