Redux에서는 액션이 반드시 type 프로퍼티를 가져야 합니다. 이 type은 액션에 따라 상태가 어떻게 변경되어야 하는지 결정하는 데 사용됩니다.

type 프로퍼티는 일반적으로 문자열로 사용되지만, 기술적으로는 JavaScript의 어떤 타입도 될 수 있습니다. 그러나 주석에서 언급한 바와 같이, 문자열은 직렬화가 가능하기 때문에 JavaScript의 Symbol보다는 문자열을 사용하는 것이 좋습니다.

JavaScript의 Symbol은 객체 속성의 식별자로 사용할 수 있는 고유하고 불변하는 데이터 타입입니다. 그러나 Symbol은 리터럴 문법이 없고, 동일한 설명을 가진 Symbol의 각 인스턴스는 서로 같지 않기 때문에 직렬화가 불가능합니다. 즉, Symbol은 직렬화 및 역직렬화 과정 후에 재구성할 수 없습니다.

다음은 이를 보여주는 예제입니다:

const symbol1 = Symbol('mySymbol');
const symbol2 = Symbol('mySymbol');

console.log(symbol1 === symbol2); // 각 Symbol은 고유하므로 "false"가 출력됩니다.

const serializedSymbol = JSON.stringify({ type: symbol1 });

console.log(serializedSymbol); // Symbol은 직렬화되지 않기 때문에 "{}"가 출력됩니다.

const deserializedObject = JSON.parse(serializedSymbol);

console.log(deserializedObject.type); // Symbol은 재구성할 수 없으므로 "undefined"가 출력됩니다.

반면, 문자열은 직렬화가 가능하며, 직렬화 후에도 재구성이 가능합니다:

const string1 = 'myString';
const string2 = 'myString';

console.log(string1 === string2); // 두 문자열은 같으므로 "true"가 출력됩니다.

const serializedString = JSON.stringify({ type: string1 });

console.log(serializedString); // "{"type":"myString"}"이 출력됩니다.

const deserializedObject = JSON.parse(serializedString);

console.log(deserializedObject.type); // 재구성된 값으로 "myString"이 출력됩니다.

Redux에서는 액션의 type 프로퍼티에 직렬화 가능한 타입을 사용함으로써, 액션을 로그로 남기거나, 저장(persist)하거나, 디버깅 또는 테스트를 위해 재생(replay)할 수 있도록 합니다. 이 때문에 액션 타입으로 문자열을 사용하는 것이 권장됩니다.