금요일

Redis WRONGTYPE 에러 해결 — TYPE 명령으로 키 타입 확인하고 명령 맞추기

🔍 검색 키워드: Redis WRONGTYPE Operation against a key holding the wrong kind of value, Redis WRONGTYPE 해결, Redis TYPE 명령어, Redis 키 데이터 타입 확인, Redis LPUSH 에러, Redis 에러 접두사 WRONGTYPE

요약: Redis의 "WRONGTYPE Operation against a key holding the wrong kind of value"는 키에 저장된 값의 타입과 맞지 않는 명령을 실행했을 때 서버가 돌려주는 에러입니다. TYPE 명령으로 키의 실제 타입(string, list, set, zset, hash, stream, vectorset)을 확인하고, 그 타입에 맞는 명령을 쓰거나 키 이름이 겹치지 않도록 정리해서 해결합니다.

Redis WRONGTYPE 에러는 무엇을 뜻하나요?

Redis 프로토콜 명세 문서(RESP)에는 에러 응답의 예시로 다음 두 줄이 실려 있습니다.

-ERR unknown command 'asdf'
-WRONGTYPE Operation against a key holding the wrong kind of value

같은 문서는 Redis가 잘못된 데이터 타입에 대해 연산하려 하거나 존재하지 않는 명령을 실행하는 등 문제가 생겼을 때만 에러로 응답한다고 설명합니다. 또한 에러 메시지에서 첫 번째 대문자 단어를 에러 접두사(error prefix)라고 부르며, ERR은 일반 에러이고 WRONGTYPE은 클라이언트가 잘못된 데이터 타입에 연산을 시도했음을 뜻하는 더 구체적인 에러라고 설명합니다. 즉 WRONGTYPE은 서버가 고장 난 것이 아니라 "이 키에는 그 명령을 쓸 수 없다"는 응답입니다.

어떤 상황에서 WRONGTYPE이 발생하나요?

Redis는 키마다 값의 타입이 정해져 있고, 명령은 그 타입에 맞는 키에만 쓸 수 있습니다. 예를 들어 LPUSH 명령 문서에는 키가 리스트가 아닌 값을 가지고 있으면 에러가 반환된다고 적혀 있습니다. 같은 이유로 문자열 키에 리스트 명령을 쓰거나, 해시 키에 문자열 명령을 쓰는 식으로 타입이 어긋나면 WRONGTYPE이 나옵니다.

아래는 공식 문서의 설명을 바탕으로 정리한 재현 시나리오입니다. 이 글에서 직접 실행해 확인한 출력이 아니므로, 에러가 나는 조건을 이해하는 용도로 보세요.

redis> SET user:1 "kim"
OK
redis> LPUSH user:1 "a"
(error) WRONGTYPE Operation against a key holding the wrong kind of value

user:1은 문자열(string) 타입인데 리스트 명령인 LPUSH를 실행한 경우입니다. 에러 문구는 위 프로토콜 명세 문서에 실린 형태와 같습니다.

키가 어떤 타입인지 어떻게 확인하나요?

TYPE 명령은 키에 저장된 값의 타입을 문자열로 돌려줍니다. 공식 문서에 따르면 반환될 수 있는 타입은 string, list, set, zset, hash, stream, vectorset이고, 키가 존재하지 않으면 none을 반환합니다. 시간 복잡도는 O(1)입니다.

redis> SET key1 "value"
OK
redis> LPUSH key2 "value"
(integer) 1
redis> SADD key3 "value"
(integer) 1
redis> TYPE key1
string
redis> TYPE key2
list
redis> TYPE key3
set

위 예시는 TYPE 명령 공식 문서에 실린 예시입니다.

WRONGTYPE은 어떻게 해결하나요?

1단계: 에러가 난 키의 실제 타입 확인

에러가 난 명령에 쓴 키 이름으로 TYPE을 실행해서 기대한 타입과 실제 타입이 다른지 확인합니다.

TYPE user:1

2단계: 타입에 맞는 명령으로 바꾸기

키의 실제 타입이 의도한 것과 맞다면 명령을 그 타입에 맞게 바꿉니다. Redis 공식 문서는 데이터 타입별로 명령 레퍼런스를 나눠 두고 있으며 문자열, 해시, 리스트, 셋, 정렬된 셋(sorted set), 스트림 등이 각각 다른 명령군을 가집니다. 쓰려는 명령이 어느 타입의 명령인지 명령 문서의 분류(group)에서 확인하세요.

3단계: 키 이름 충돌이 원인이면 키 구조 정리

서로 다른 기능이 우연히 같은 키 이름에 다른 타입의 값을 저장했다면 WRONGTYPE이 반복됩니다. 기능별로 키 이름 규칙을 나누는 것이 일반적인 해결 방향입니다. 기존 키를 삭제해도 되는지는 그 키를 쓰는 다른 기능이 있는지 먼저 확인한 뒤 판단해야 하며, 이 글은 삭제 방법을 다루지 않습니다.

애플리케이션 코드에서는 어떻게 처리하나요?

프로토콜 명세 문서는 클라이언트가 에러 응답을 받으면 예외로 처리해야 한다고 설명합니다. 그래서 대부분의 클라이언트 라이브러리는 WRONGTYPE을 예외로 던집니다. 예외 이름과 메시지 형태는 라이브러리마다 다르므로, 사용하는 클라이언트의 문서를 확인하세요. 에러 접두사 WRONGTYPE으로 이 에러를 다른 에러와 구분할 수 있다고 명세에 설명돼 있습니다.

주의할 점

  • WRONGTYPE은 타입이 맞지 않아 명령이 거부된 것이므로, 실행하려던 명령이 데이터를 바꾸지는 않습니다.
  • TYPE 결과가 none이면 키가 없는 것이므로 WRONGTYPE의 원인이 아닙니다. 키 이름 오타를 확인하세요.
  • 운영 환경에서 키를 삭제하거나 덮어쓰기 전에는 어떤 기능이 그 키를 쓰는지 반드시 확인하세요.
  • 이 글은 Redis 공식 문서를 근거로 정리한 것이며 직접 실행해 확인한 결과가 아닙니다. 사용 중인 Redis 버전에 따라 지원 타입과 명령이 다를 수 있습니다.

정리표

상황원인확인과 해결
(error) WRONGTYPE ... 발생키의 값 타입과 명령이 맞지 않음TYPE key로 실제 타입 확인
TYPE이 string인데 LPUSH 사용리스트 명령을 문자열 키에 사용문자열 명령으로 변경하거나 키 분리
TYPE이 none키가 없음키 이름 오타 확인(WRONGTYPE 원인 아님)
같은 키를 여러 기능이 사용기능 간 키 이름 충돌키 이름 규칙을 기능별로 분리

자주 묻는 질문(FAQ)

Redis WRONGTYPE 에러는 서버 장애인가요?

아닙니다. 프로토콜 명세 문서 기준으로 WRONGTYPE은 클라이언트가 잘못된 데이터 타입에 연산을 시도했음을 알리는 에러 응답입니다.

키의 타입은 어떤 명령으로 확인하나요?

TYPE key 명령을 씁니다. string, list, set, zset, hash, stream, vectorset 중 하나를 반환하고, 키가 없으면 none을 반환합니다.

LPUSH에서 WRONGTYPE이 나는 이유는 무엇인가요?

LPUSH 명령 문서에 따르면 키가 리스트가 아닌 값을 가지고 있을 때 에러가 반환됩니다. 해당 키의 타입을 TYPE으로 확인하세요.

WRONGTYPE 때문에 데이터가 손상되나요?

명령이 거부된 것이므로 그 명령으로 인한 변경은 일어나지 않습니다. 다만 키를 삭제하거나 다른 타입으로 덮어쓰는 해결 방식은 기존 데이터를 잃을 수 있으니 주의하세요.

참고 문서: Redis - Serialization protocol specification · Redis - TYPE · Redis - LPUSH

최종 업데이트: 2026-11-07 · 작성: 내멋스레 사는 이야기

댓글 없음:

댓글 쓰기