간격 반복 알고리즘 비교
라이트너 · SM-2 · FSRS, 그리고 우리가 알고리즘을 안 쓴 이유 · 최종 수정: 2026-07-14 · 작성: Y-Systems
이 글은 우리 앱이 지는 항목부터 보여주고 시작합니다. 아래 표에서 VOCA DECK 열에는 “✗”가 여럿 있습니다. 지우지 않았습니다. 간격 반복(spaced repetition)의 핵심은 “복습일을 누가 어떻게 계산하는가”인데, 우리는 그 계산을 하지 않기로 선택했기 때문입니다. 이 글은 그 계산을 실제로 하는 세 알고리즘을 수식과 숫자 수준에서 해부하고, 우리가 무엇을 얻으려고 무엇을 포기했는지를 코드에서 그대로 꺼내 보여줍니다.
먼저 스펙시트 — 표의 각 칸이 이 글의 목차입니다
설명을 읽기 전에 결론표부터 봅니다. 각 행이 아래에서 하나씩 해부됩니다.
| 항목 | 라이트너 상자 (1972) |
SM-2 (1987) |
Anki 변형 (2006~) |
FSRS (2022~) |
VOCA DECK (깜빡이) |
|---|---|---|---|---|---|
| 스케줄 단위 | 일 (상자별) | 일 | 분 + 일 | 일 (소수점) | 초 |
| 카드가 기억하는 상태 | 상자 번호 1개 (1~5) |
EF · 반복횟수 · 간격 (실수 3개) |
ease · 간격 · 실패횟수 | 난이도 D · 안정성 S (잠재변수) |
불리언 1개mem: true/false |
| 정답 품질 등급 | ○/✗ 2단계 | q = 0~5 (6단계) | 4단계 (Again~Easy) | 4단계 | ✗ 없음 |
| 복습 기록 저장 | 물리 상자 | 카드별 상태 | 전체 리뷰 로그 | 로그 필수(학습용) | ✗ 저장 안 함 |
| 개인 데이터로 학습 | ✗ | ✗ (상수 수작업) | ✗ | ○ (파라미터 최적화) | ✗ |
| 카드별 개인화 | △ (5단계로 뭉갬) | ○ | ○ | ◎ | ✗ (전부 동일) |
| 전수 커버리지 보장 | ○ | ○ | ○ | ○ | △ (순방향만 ○, 무작위는 ✗) |
| 계정 · 설치 · 동기화 | 종이 상자 | 필요 | 필요 | 필요 | ◎ 전부 불필요 |
| 밀린 복습 폭탄 | 있음 | 있음 | 있음(이탈 1위 원인) | 있음 | ◎ 없음 |
| 성숙 카드 장기 유지 | ○ | ◎ | ◎ | ◎ | ✗ (사각지대) |
| 세션 내 노출 밀도 | 낮음 | 낮음 | 낮음 | 낮음 | ◎ 6초/카드 |
1972 — 라이트너: “상자를 옮기면 그게 알고리즘이다”
그 시대가 풀려던 문제
컴퓨터가 없었습니다. 독일의 저널리스트 제바스티안 라이트너(Sebastian Leitner)가 1972년 책에서 제안한 것은 계산이 필요 없는 간격 반복이었습니다. 연필도, 날짜 계산도 필요 없습니다. 카드를 물리적으로 옮기는 행위 자체가 상태 저장입니다.
어떻게 풀었나
- 칸막이가 있는 상자를 5칸으로 나눕니다.
- 새 카드는 전부 1번 칸에서 시작합니다.
- 맞히면 다음 칸으로 한 칸 전진합니다.
- 틀리면 몇 번 칸에 있었든 무조건 1번 칸으로 추락합니다.
- 칸마다 복습 주기가 다릅니다. 흔히 쓰이는 배치는 다음과 같습니다.
| 칸 | 복습 주기 | 이 칸에 있다는 뜻 | 틀렸을 때 |
|---|---|---|---|
| 1번 | 매일 | 아직 모름 / 방금 틀림 | 1번 유지 |
| 2번 | 2일마다 | 한 번 맞힘 | → 1번 추락 |
| 3번 | 4일마다 | 두 번 연속 맞힘 | → 1번 추락 |
| 4번 | 8일마다 | 세 번 연속 | → 1번 추락 |
| 5번 | 16일마다 | 거의 외움 | → 1번 추락 |
엄밀히 말하면 라이트너의 원안은 날짜가 아니라 “칸이 꽉 차면 비운다”는 용량 기반이었습니다. 위의 1·2·4·8·16일은 후대에 정착한 달력 버전입니다. 이 차이를 뭉뚱그리는 글이 많아 밝혀 둡니다.
무엇이 깨졌나
라이트너의 치명적 약점은 “추락이 너무 잔인하다”는 것입니다. 5번 칸에서 딱 한 번 삐끗한 카드가 “아직 한 번도 못 맞힌 새 카드”와 완전히 같은 취급을 받고 1번 칸으로 떨어집니다. 실제로 그 카드는 거의 외운 상태인데, 상자는 그걸 표현할 방법이 없습니다. 상태가 정수 하나뿐이라 “거의 외웠지만 오늘 헷갈렸다”를 저장할 자리가 없습니다.
그리고 모든 카드가 같은 사다리를 탑니다. 쉬운 단어도 5칸을 다 밟아야 하고, 죽어도 안 외워지는 단어도 똑같이 5칸입니다. 카드마다 다른 속도로 오르는 사다리가 필요했습니다. 그게 15년 뒤에 나옵니다.
1987 — SM-2: 정수를 실수로 바꾼 15년
그 시대가 풀려던 문제
폴란드의 피오트르 보이니악(Piotr Woźniak)이 SuperMemo를 만들며 발표한 SM-2는 라이트너의 “칸 번호(정수)”를 “난이도 계수(실수)”로 바꿉니다. 핵심 발명은 EF(Easiness Factor, 난이도 계수) 하나입니다.
어떻게 풀었나 — 실제 수식
SM-2는 복습할 때마다 스스로 q = 0~5의 여섯 단계로 채점하게 합니다(5 = 완벽, 0 = 백지). 그리고 EF를 이렇게 갱신합니다.
EF' = EF + ( 0.1 − (5−q) × (0.08 + (5−q) × 0.02) )
EF 초기값 = 2.5 · EF 하한 = 1.3 (그 아래로는 안 내려감)
이 식이 실제로 뱉는 값은 다음과 같습니다. 손으로 계산해서 채워 넣은 표입니다.
| q (자가 채점) | 의미 | EF 변화량 | EF 2.5에서 시작하면 |
|---|---|---|---|
| 5 | 완벽하게 떠올림 | +0.10 | 2.60 |
| 4 | 맞혔지만 잠시 머뭇 | ±0.00 | 2.50 (그대로) |
| 3 | 간신히 맞힘 | −0.14 | 2.36 |
| 2 | 틀렸지만 답 보니 알겠음 | −0.32 | 2.18 |
| 1 | 틀림, 답 봐도 낯설음 | −0.54 | 1.96 |
| 0 | 완전 백지 | −0.80 | 1.70 |
q=4가 정확히 0이라는 게 이 식의 설계 의도입니다. “무난히 맞힘”은 난이도 평가를 바꾸지 않는 중립점이고, 그보다 잘하면 올려주고 못하면 내립니다. 상수 0.1 · 0.08 · 0.02는 이론에서 유도된 게 아니라 보이니악이 손으로 튜닝한 값입니다. 이 점은 뒤에서 중요해집니다.
그리고 다음 간격을 이렇게 정합니다.
I(1) = 1일
I(2) = 6일
I(n) = I(n−1) × EF (n ≥ 3)
q < 3 이면 → 반복 횟수 n 을 1로 리셋 (간격이 1일로 돌아감)
EF는 곱셈 배수입니다. 그래서 EF 2.5짜리 쉬운 카드와 EF 1.3짜리 지옥 카드는 기하급수적으로 벌어집니다. 같은 횟수를 복습해도 도달하는 간격이 완전히 다릅니다.
| 복습 회차 | EF 2.5 (쉬운 카드) | EF 1.9 (보통) | EF 1.3 (지옥 카드) |
|---|---|---|---|
| 1회차 | 1일 | 1일 | 1일 |
| 2회차 | 6일 | 6일 | 6일 |
| 3회차 | 15일 | 11일 | 8일 |
| 4회차 | 38일 | 22일 | 10일 |
| 5회차 | 94일 | 41일 | 13일 |
| 6회차 | 235일 | 78일 | 17일 |
| 7회차 | 587일 (1.6년) | 148일 | 22일 |
7회차에서 587일 대 22일 — 27배 차이입니다. 이게 SM-2가 라이트너를 이기는 지점입니다. 쉬운 카드는 1년 반씩 안 보이게 치워버리고, 그 시간을 전부 어려운 카드에 씁니다.
무엇이 깨졌나
① 자가 채점 6단계가 사람에게 너무 어렵습니다. q=3과 q=4의 차이가 뭔지 매 카드마다 판단해야 합니다. 실제로는 대부분의 사용자가 두세 개 등급만 반복해서 누릅니다. 6단계 설계가 사실상 3단계로 붕괴합니다.
② 실패 시 처리가 모호합니다. 원문은 “q<3이면 EF를 바꾸지 않고 처음부터 반복하라”고 하는데, 같은 문서의 의사코드는 모든 q에 대해 EF를 갱신합니다. 구현마다 해석이 갈립니다. 30년 넘게 쓰인 알고리즘의 핵심 분기점이 문서상 애매하다는 사실은 그대로 적어 두는 편이 정직합니다. (이 글의 시뮬레이션은 “EF도 갱신한다” 쪽을 택했습니다.)
③ 상수가 근거 없이 고정돼 있습니다. 왜 I(2)가 6일입니까? 왜 하필 0.08입니까? 1987년의 한 사람이 자기 데이터로 손튜닝한 숫자가 전 세계 모든 학습자에게 그대로 적용됩니다. 이것이 FSRS가 등장한 이유입니다.
Anki의 변형 — 그리고 “이지 헬(ease hell)”
Anki는 SM-2를 그대로 쓰지 않습니다. 등급을 4단계로 줄이고(Again / Hard / Good / Easy), EF를 ease라 부르며 조정 폭을 다시 손봤습니다. 기본 프리셋 기준 실제 동작은 이렇습니다.
| 버튼 | ease 변화 | 다음 간격 | 비고 |
|---|---|---|---|
| Again (실패) | −0.20 | 이전 간격 × 0% → 최소 1일 (+ 재학습 10분) | 간격이 바닥으로 초기화 |
| Hard | −0.15 | 이전 간격 × 1.2 | ease와 무관한 고정 배수 |
| Good | ±0.00 | 이전 간격 × ease | 중립점 (SM-2의 q=4) |
| Easy | +0.15 | 이전 간격 × ease × 1.3 | 이지 보너스 |
그 밖의 기본값: 학습 단계 1m 10m · 졸업 간격 1일 · 이지 간격 4일 ·
시작 ease 2.50 · ease 하한 1.30 · 리치(leech) 임계 실패 8회.
Anki는 버전과 프리셋에 따라 기본값이 달라질 수 있으니 덱 옵션에서 직접 확인하세요.
ease를 올려주는 경로는 Easy(+0.15) 하나뿐인데, 지옥 카드에 Easy를 누를 일은 없습니다. 내려가는 문은 넷인데 올라오는 문이 하나인 구조 — 이것이 SM-2 계열의 구조적 결함이고, Anki 사용자가 “리치 카드 8장이 내 인생을 망친다”고 말하는 이유입니다.
처방은 대부분 알고리즘 밖에 있습니다. 카드를 지우거나, 쪼개거나, 문장을 붙이거나(“카드가 나쁜 것이지 내가 멍청한 게 아니다”), 아니면 ease를 수동으로 리셋합니다. 알고리즘이 못 고치는 걸 사람이 손으로 고치고 있다는 뜻이고, 이 자각이 다음 세대를 낳았습니다.
FSRS — “S가 대체 뭔가”를 정확히 답할 수 있는 유일한 알고리즘
FSRS(Free Spaced Repetition Scheduler)는 손튜닝 상수를 버리고 당신의 실제 복습 로그에 파라미터를 피팅합니다. 기반은 DSR 모델입니다.
- D (Difficulty, 난이도) — 이 카드가 본질적으로 얼마나 어려운가
- S (Stability, 안정성) — 기억이 얼마나 오래 버티는가
- R (Retrievability, 인출 가능성) — 지금 이 순간 떠올릴 확률
망각곡선을 이렇게 정의합니다(FSRS-4.5 / 5 기준, DECAY = −0.5, FACTOR = 19/81).
R(t, S) = ( 1 + (19/81) × t/S ) ^ (−0.5)
여기서 아무도 잘 짚지 않는 사실 하나
S에 t = S를 대입해 봅시다. 즉 “안정성이 S인 카드를 정확히 S일 뒤에 보면?”
R(S, S) = ( 1 + 19/81 ) ^ (−0.5)
= ( 100/81 ) ^ (−0.5)
= ( 81/100 ) ^ ( 0.5)
= 0.9 ← 정확히 90%
우연이 아닙니다. FACTOR = 19/81과 DECAY = −0.5는 바로 이 값이 나오도록 역산된 상수입니다. 그래서 S의 정체는 이렇게 한 문장으로 정의됩니다.
S = 30이면 “30일 뒤에 이 카드를 다시 만나면 열에 아홉은 맞힌다”는 뜻입니다. 추상적인 내부 변수가 아니라, 날짜 단위로 읽히는 물리량입니다. SM-2의 EF는 이런 해석이 불가능합니다. “EF 2.5”가 무슨 뜻이냐고 물으면 “곱하는 수”라는 답밖에 없습니다.
목표 유지율을 바꾸면 복습량이 어떻게 변하는가 — 환산표
FSRS는 목표 유지율(desired retention)을 직접 정하게 합니다(기본 0.90). 위 식을 t에 대해 풀면 간격은 이렇게 나옵니다.
간격 t = S × (81/19) × ( R^(−2) − 1 )
이 식에 숫자를 넣어 계산한 결과입니다. 이 표가 이 글에서 가장 실용적인 부분일 수 있습니다.
| 목표 유지율 R | 간격 (S 대비 배수) | S=30일 카드면 | 복습 부담 |
|---|---|---|---|
| 0.95 | × 0.46 | 14일 | 약 2.2배 폭증 |
| 0.90 (기본) | × 1.00 | 30일 | 기준 |
| 0.85 | × 1.64 | 49일 | 약 40% 감소 |
| 0.80 | × 2.40 | 72일 | 약 58% 감소 |
| 0.70 | × 4.44 | 133일 | 약 77% 감소 |
읽는 법: 유지율을 0.90에서 0.95로 “겨우 5%p” 올리면 간격이 절반 이하로 줄어 복습량이 두 배가 됩니다. 반대로 0.80으로 낮추면 복습량이 절반 아래로 떨어지는데 정답률은 10%p만 손해입니다. 곡선이 이렇게 가파르기 때문에 “유지율은 높을수록 좋다”는 직관이 여기서 무너집니다. 시험이 코앞이 아니라면 0.85~0.90 구간이 대체로 합리적입니다.
정확성 고지: 위 유도는 DECAY가 −0.5로 고정된 FSRS-4.5 / 5 기준입니다. FSRS-6부터는 DECAY 자체가 학습되는 파라미터여서 “S = 90% 간격”이라는 등식이 정확히 성립하지 않을 수 있습니다. 파라미터 개수도 버전에 따라 17 → 19 → 21개로 늘었습니다. 버전을 확인하지 않고 이 숫자를 그대로 인용하지 마세요.
FSRS가 못 하는 것
FSRS는 당신의 로그가 있어야 당신 것이 됩니다. 리뷰가 수백~1,000건 남짓 쌓이기 전까지는 기본 파라미터로 도는데, 그건 결국 “남의 평균”입니다. 즉 시작한 첫 달의 FSRS는 개인화된 게 아닙니다. 그리고 로그를 남긴다는 건 모든 복습 기록이 어딘가에 저장된다는 뜻이기도 합니다.
같은 단어 하나를 30일 추적하면 — 시뮬레이션
추상적인 수식을 실물로 바꿔 봅니다. 단어 ubiquitous 한 장을, 다음 시나리오로 세 시스템에 넣습니다.
| 날짜 | 라이트너 (1·2·4·8·16일) | SM-2 (EF 2.5 시작) | Anki (ease 2.50 시작) |
|---|---|---|---|
| 1일차 | 학습 · 1번 칸 | 학습 · I=1일 | 학습(1분→10분) · 졸업 1일 |
| 2일차 | 실패 · 1번 칸 유지 | 실패 q=2 · EF 2.50→2.18 · 리셋 | Again · ease 2.50→2.30 · 간격 1일 |
| 3일차 | 성공 → 2번 칸 | 성공 · I=1일 | Good · 1 × 2.30 = 2일 |
| 4일차 | — | 성공 · I=6일 | — |
| 5일차 | 성공 → 3번 칸 | — | Good · 2 × 2.30 = 5일 |
| 9일차 | 성공 → 4번 칸 | — | — |
| 10일차 | — | 성공 · 6 × 2.18 = 13일 | Good · 5 × 2.30 = 12일 |
| 17일차 | 성공 → 5번 칸 | — | — |
| 22일차 | — | — | Good · 12 × 2.30 = 28일 |
| 23일차 | — | 성공 · 13 × 2.18 = 28일 | — |
| 30일간 총 복습 |
6회 | 6회 | 6회 |
| 다음 복습일 | 33일차 | 51일차 | 50일차 |
여기서 진짜로 봐야 할 숫자는 “6회”가 아니라 “33 대 51”입니다. 세 시스템 모두 30일 동안 똑같이 6번 복습시켰습니다. 노동량은 같습니다. 그런데 라이트너는 33일차에 또 부르고, SM-2는 51일차에 부릅니다. 같은 6회를 쓰고도 SM-2가 18일치 더 멀리 밀어냈습니다. 이 격차는 회차가 갈수록 곱셈으로 벌어집니다. 1년 뒤면 라이트너는 16일마다 계속 묻고 있고, SM-2는 이미 1년짜리 간격에 도달해 있습니다.
그리고 이 표에는 VOCA DECK 열이 없습니다. 넣을 수가 없기 때문입니다. 우리 앱에는 “일차”라는 개념 자체가 없습니다. 왜 그런지가 다음 장입니다.
VOCA DECK 해부 — 우리 코드가 실제로 하는 일
이제 우리 차례입니다. 포장 없이 코드에 있는 그대로 씁니다.
카드가 저장하는 것: 전부입니다
{ a: "ubiquitous", b: "어디에나 있는", mem: false }
이게 카드 한 장의 전부입니다. 앞면, 뒷면, 그리고 불리언 하나. 복습한 시각도, 몇 번 틀렸는지도, 얼마나 헷갈렸는지도 저장하지 않습니다.
그래서 우리는 SM-2를 붙이고 싶어도 붙일 수가 없습니다.
SM-2에는 최소한 EF · 반복횟수 · 마지막 복습일이 필요하고,
FSRS는 전체 리뷰 로그가 있어야 파라미터를 피팅합니다.
우리는 계정도, 서버도, 리뷰 로그도 없습니다.
덱과 암기 표시는 브라우저 localStorage에만 남고 서버로 전송되지 않습니다.
이건 못 만든 게 아니라 이렇게 만든 겁니다. 그 대가가 개인화 포기입니다.
스케줄러의 정체: 모듈로 연산 한 줄
우리가 “다음 카드”를 정하는 방식은 순환(cyclic) 인덱스입니다.
order 설정에 따라 세 가지로 갈립니다.
| 설정 | 동작 | 재회 간격 | 커버리지 |
|---|---|---|---|
fwd 순방향 (기본) | 인덱스 +1씩 순환 | 정확히 N장마다 (균등) | 100% 보장 |
rev 역방향 | 인덱스 −1씩 순환 | 정확히 N장마다 (균등) | 100% 보장 |
rnd 무작위 | 매 스텝 독립 균등 추출 (현재 카드만 제외) | 기댓값 N−1장, 분산 큼 | 보장 없음 ✗ |
카드를 섞어서 한 바퀴 도는 방식(비복원 추출)이 아니라, 매번 남은 카드 중에서 새로 뽑는 방식입니다. 그래서 같은 카드가 연달아 세 번 나올 수도, 한 바퀴 내내 한 번도 안 나올 수도 있습니다.
그 대가를 숫자로 계산해 봤습니다
100장짜리 덱(N=100)을 무작위 모드로 99스텝(= 순방향 한 바퀴 분량) 돌린다고 합시다. 특정 카드가 한 스텝에서 뽑힐 확률은 1/(N−1) = 1/99 입니다. 그러면 그 카드가 99스텝 동안 한 번도 안 나올 확률은:
P(0회 등장) = (1 − 1/99)^99 ≈ e^(−1) ≈ 0.37
등장 횟수 분포는 거의 포아송(λ=1)을 따릅니다.
| 한 바퀴 분량(99스텝) 동안 등장 횟수 | 확률 | 의미 |
|---|---|---|
| 0회 | 약 37% | 덱의 3분의 1이 통째로 안 나옴 |
| 1회 | 약 37% | 의도한 대로 |
| 2회 | 약 18% | 낭비 |
| 3회 이상 | 약 8% | 같은 카드만 계속 |
즉 무작위 모드로 한 바퀴 분량을 돌리면, 덱의 약 37%는 그날 얼굴도 못 봅니다. 두 바퀴 분량(198스텝)을 돌려도 약 13%가 여전히 안 나오고, 세 바퀴 분량을 돌려야 미노출이 5% 아래로 내려갑니다.
- 첫 회독 · 시험 전날 전수 점검 → 순방향. 커버리지 100%가 필요한 순간입니다. 무작위로 돌리면 3분의 1을 빼먹습니다.
- 3회독 이후, 순서 단서를 깨야 할 때 → 역방향을 먼저 쓰세요. 순서 단서는 깨면서 커버리지는 100% 유지합니다. 대부분의 사람이 이 옵션을 그냥 지나칩니다.
- 진짜 무작위 인출 훈련 → 무작위. 단, 덱을 세 바퀴 분량 돌릴 각오를 하고 쓰세요.
시간 단위: 우리 스케줄러의 눈금은 “초”입니다
기본 지연시간은 3초(제어판에서 1~60초). 한 장은 앞면 · 뒷면 두 페이즈를 거치므로 기본 6초/카드입니다. 그리고 타이머에는 0.5초의 하한이 걸려 있습니다 (아무리 짧게 설정해도 그 아래로는 안 내려갑니다).
여기서 덱 크기의 물리적 상한이 곧바로 나옵니다.
| 덱 크기 N | 1바퀴 소요 시간 (기본 6초/카드) | 같은 카드 재회 간격 | 판정 |
|---|---|---|---|
| 30장 | 3분 | 3분 | ◎ 세션 내 반복이 촘촘함 |
| 100장 | 10분 | 10분 | ○ 실용적인 상한선 |
| 300장 | 30분 | 30분 | △ 한 바퀴가 이미 부담 |
| 500장 | 50분 | 50분 | ✗ 세션 내 반복 효과 소멸 |
| 2,000장 | 3시간 20분 | 3시간 20분 | ✗ 사실상 불가능 |
지연시간은 “인출 창”의 길이입니다 — 비대칭으로 쓰세요
지연시간을 그냥 “속도 조절”로 생각하면 절반만 쓰는 겁니다. 앞면이 떠 있는 그 몇 초가, 당신이 답을 떠올리려 애쓸 수 있는 유일한 시간입니다. 그래서 앞면과 뒷면의 지연시간을 따로 설정할 수 있게 만들어 뒀습니다(고급 설정, 0~60초).
| 상황 | 앞면 지연 | 뒷면 지연 | 카드당 | 의도 |
|---|---|---|---|---|
| 첫 회독 (모르는 단어투성이) | 2초 | 4초 | 6초 | 떠올릴 게 없으니 뜻을 오래 본다 |
| 2~3회독 (인출 훈련) | 5초 | 1.5초 | 6.5초 | 떠올릴 시간을 벌고, 확인은 순식간에 |
| 시험 직전 속도전 | 1.5초 | 1.5초 | 3초 | 전수 스캔 — 100장을 5분에 |
| TTS 청각 학습 | 3초 | 3초 | 6초 | 음성이 끝날 시간 확보 |
2~3회독의 “앞면 5초 / 뒷면 1.5초”가 이 앱에서 인출 연습에 가장 가까운 설정입니다. 회독이 진행될수록 앞면을 늘리고 뒷면을 줄이세요. 거꾸로 하는 사람이 대부분인데, 그러면 끝까지 수동적으로 보기만 하게 됩니다.
“암기 표시”의 정체 — 상자가 2개뿐인 라이트너
우리의 유일한 개인화 장치는 암기 표시 하나입니다. 이걸 알고리즘의 언어로 번역하면 정확히 이렇습니다.
상자 1 =
mem: false (계속 순환) · 상자 2 = mem: true (순환에서 제외)그리고 표시 범위 설정이 이 상자를 고릅니다 — 외운 항목 제외(기본) / 외운 항목만 / 모두.
이것만으로 얻는 것 (생각보다 큽니다)
개인화 알고리즘이 하는 일의 가장 큰 몫은 사실 “아는 카드를 안 보여주는 것”입니다. SM-2가 EF 2.5짜리 카드를 587일 뒤로 밀어내는 것도, 결국은 지금 안 보여주려는 것입니다. 암기 표시는 그 효과의 가장 무식하지만 가장 큰 덩어리를 가져옵니다.
숫자로 봅시다. 100장 덱에서 40장을 암기 표시하면 순환 대상은 60장이 됩니다. 1바퀴가 10분 → 6분으로 줄고, 모르는 카드의 재회 간격이 10분 → 6분으로 짧아집니다. 같은 20분을 써도 어려운 카드를 만나는 횟수가 1.67배가 됩니다. 공짜로 얻는 1.67배입니다. 체크박스 하나로.
진짜 SM-2 대비 부족한 것 (여기가 중요합니다)
① 단계가 없습니다 — 0 아니면 1입니다. SM-2는 “EF 2.5(아주 쉬움)”와 “EF 1.6(좀 어려움)”과 “EF 1.3(지옥)”을 구별하고 각각 다른 빈도로 보여줍니다. 우리는 “본다 / 안 본다” 둘뿐입니다. 안 외운 60장 안에서는 모두가 완전히 평등합니다. 어제 처음 본 단어와 40번을 봐도 안 외워지는 단어가 정확히 같은 빈도로 나옵니다. 이게 우리가 SM-2에 지는 가장 명확한 지점입니다.
② 시간이 없습니다 — 그래서 “언제 다시 볼지”를 계산할 수 없습니다.
mem은 불리언입니다. 언제 표시했는지 저장하지 않습니다.
그래서 “이 카드를 표시한 지 40일이 지났으니 슬슬 다시 확인해야 한다”는 판단을
앱이 원리적으로 할 수 없습니다. 타임스탬프가 없으니까요.
③ 그래서 생기는 사각지대 — 표시된 카드는 조용히 썩습니다.
암기 표시는 일방통행 문입니다. 카드가 상자 2로 나가면 스스로 돌아오는 길이 없습니다. SM-2는 587일짜리 카드도 언젠가는 반드시 다시 부릅니다 — 망각을 잡아내려고요. 우리는 영원히 안 부릅니다.
즉 “외웠다고 표시한 카드가 사실은 잊혔는데, 당신은 그걸 모르는 상태”가 계속 쌓입니다. 그리고 시험장에서 알게 됩니다.
그 사각지대를 손으로 메우는 절차
알고리즘이 안 해주니 사람이 해야 합니다. 다행히 어렵지 않고, 앱에 이미 기능이 있습니다. 표시 범위를 “외운 항목만”으로 바꾸는 것이 정확히 이 용도로 존재합니다.
- 주 1회, 요일을 정하세요. (예: 일요일)
- 표시 범위를 “외운 항목만”으로 바꿉니다. → 암기 표시한 카드들만 순환합니다.
- 순서는 무작위, 앞면 지연을 4~5초로 길게. — 진짜 인출을 시험하는 겁니다.
- 못 떠올린 카드가 나오면 그 자리에서 암기 표시를 해제합니다. → 상자 1로 강등. 돌아오는 문을 손으로 열어주는 겁니다.
- 다시 “외운 항목 제외”로 돌려놓고 평소대로 돌립니다.
이 5단계가 SM-2의 “성숙 카드 복습”을 수동으로 흉내 내는 전부입니다. 자동이 아니라서 열등하지만, 안 하는 것보다는 압도적으로 낫습니다. 이걸 안 하면 암기 표시는 “아는 척하는 카드를 숨기는 기능”이 됩니다.
그래서 뭘 써야 하나 — 정직한 처방전
“우리 앱을 쓰세요”가 정답인 경우는 절반도 안 됩니다. 있는 그대로 씁니다.
| 당신의 상황 | 권장 | 이유 (숫자로) |
|---|---|---|
| 어휘 2,000~10,000개를 6개월~수년간 유지 (수능·토익·GRE 장기전) |
Anki / FSRS (우리 앱 아님) |
깜빡이는 2,000장 한 바퀴에 3시간 20분. 물리적으로 불가능합니다. 게다가 성숙 카드를 다시 불러주지 않아 장기 유지에 실패합니다. |
| D-14 시험 · 벼락치기 단어 200~300개 |
깜빡이 | SM-2의 간격은 1일 → 6일 → 15일입니다. 14일 안에는 겨우 3회밖에 못 돌립니다. 일 단위 스케줄러는 남은 기간이 짧으면 무용지물입니다. 하루 3바퀴 회독이 이깁니다. |
| 매일 못 여는 사람 (3일씩 빠짐) |
깜빡이 | Anki에서 3일 빠지면 밀린 카드 수백 장이 쌓입니다. 이게 SRS 이탈의 1위 원인입니다. 깜빡이엔 밀린 카드라는 개념이 없습니다. 아무 때나 열어서 아무 때나 닫으면 됩니다. |
| 덱 30~300장, CSV 파일 하나 |
깜빡이 | Anki 설치 + 노트 타입 + 덱 옵션 + 동기화 계정을 세팅하는 마찰이 이득보다 큽니다. CSV를 열면 3초 뒤에 학습이 시작됩니다. |
| 설거지 · 출퇴근 중 귀로만 학습 |
깜빡이 (TTS 음성만) | Anki는 화면을 보고 버튼을 눌러야 다음으로 갑니다. 깜빡이는 자동 재생 + 음성만 모드로 손도 눈도 안 씁니다. |
| 리뷰 기록을 남기기 싫음 계정 만들기 싫음 |
깜빡이 | 덱과 암기 표시는 브라우저 localStorage에만 저장되고 서버로 전송되지 않습니다. 대신 기기 간 동기화도 없습니다. (같은 이유입니다.) |
| 계속 안 외워지는 지옥 단어 30개 |
깜빡이 | Anki에서 이 카드들은 이지 헬에 빠져 ease 1.30에 눌어붙습니다. 차라리 따로 CSV로 뽑아 30장 덱(1바퀴 3분)을 만들어 하루 다섯 바퀴 도세요. |
가장 정확한 답: 둘은 층위가 다릅니다
여기까지 왔으면 이제 이 문장이 이해될 겁니다.
깜빡이는 “그 카드를 지금 어떻게 노출할지”를 정합니다. (초 단위)
둘은 같은 문제를 두고 싸우는 게 아니라, 위아래로 쌓입니다.
병행하는 사람들이 실제로 쓰는 조합은 이렇습니다.
- 장기 스케줄은 Anki에 맡깁니다. 5,000단어 덱의 “오늘 볼 120장”은 FSRS가 뽑아 줍니다.
- Anki에서 계속 틀리는 카드(리치·ease 1.3 근처)를 CSV로 뽑습니다. 보통 30~80장 나옵니다.
- 그 CSV를 깜빡이에 넣고 하루 두세 바퀴 돌립니다. 80장이면 1바퀴 8분. 앞면 5초 / 뒷면 1.5초로 인출 연습.
- 깜빡이에서 확실해진 카드는 암기 표시로 빼고, Anki에서는 그 카드의 ease를 리셋합니다.
Anki가 못 하는 걸 깜빡이가 하고, 깜빡이가 못 하는 걸 Anki가 합니다. Anki는 세션 내 고밀도 노출을 못 만들고(하루에 같은 카드를 20번 보여주지 않습니다), 깜빡이는 6개월 뒤의 복습일을 계산하지 못합니다. 파일 하나(CSV)로 두 도구가 이어집니다. 만드는 법은 CSV 단어장 만들기에 있습니다.
짧은 Q&A
Q. FSRS가 SM-2보다 항상 낫습니까?
리뷰 로그가 충분히 쌓인 뒤에는 대체로 그렇습니다. 하지만 시작한 첫 달에는 아닙니다. FSRS는 당신의 로그로 파라미터를 피팅해야 당신 것이 되는데, 그전까지는 남의 평균으로 돕니다. 그리고 FSRS는 당신이 버튼을 정직하게 누른다는 가정 위에 서 있습니다. 대충 Good만 누르면, 정교한 알고리즘이 정교하게 틀립니다. 쓰레기를 넣으면 쓰레기가 나옵니다 — 이건 알고리즘이 고쳐줄 수 없습니다.
Q. 목표 유지율은 몇으로 두는 게 맞습니까?
위의 환산표를 다시 보세요. 0.90 → 0.95는 복습량을 2배로 만듭니다. 정답률 5%p를 사려고 시간을 두 배 내는 겁니다. 대부분의 경우 손해입니다. 시험이 멀면 0.85~0.90, 시험이 코앞이면 0.90~0.95 정도가 합리적인 출발점입니다. 단, 이건 “정답”이 아니라 “출발점”입니다.
Q. 깜빡이 지연시간은 몇 초가 맞습니까?
“맞는 값”은 회독마다 다릅니다. 기본 3초는 첫 회독용 무난한 값일 뿐입니다. 회독이 쌓일수록 앞면을 늘리고(떠올릴 시간) 뒷면을 줄이세요(확인만). 앞면 5초 / 뒷면 1.5초가 인출 연습에 가장 가까운 설정입니다. 자세한 배치는 위의 표에 있습니다.
Q. 무작위 모드가 순방향보다 항상 낫지 않나요? 순서 단서를 깨니까요.
아니요, 그게 이 글에서 계산한 함정입니다. 무작위는 커버리지를 보장하지 않습니다 (한 바퀴 분량에 약 37% 미노출). 순서 단서를 깨면서 커버리지도 지키고 싶으면 역방향을 쓰세요. 대부분의 사용자가 이 옵션의 존재 이유를 모릅니다.
Q. 암기 표시를 다 해서 덱이 비었습니다. 끝난 건가요?
아니요. 그때부터가 시작입니다. 표시 범위를 “외운 항목만”으로 바꿔서 주 1회 점검하세요. 못 떠올린 카드는 표시를 해제해서 되돌리세요. 이 절차를 안 하면 암기 표시는 망각을 숨기는 기능이 됩니다. 절차는 위에 적었습니다.
Q. 그럼 언젠가 VOCA DECK에도 SM-2를 넣을 겁니까?
넣으려면 리뷰 로그를 저장해야 하고, 그러려면 저장소가 커지고, 기기 간 동기화를 원하게 되고, 그러면 계정이 필요해집니다. 그 순간 이 앱의 유일한 장점인 “마찰 0”이 사라집니다. 그건 Anki를 못 만든 버전으로 다시 만드는 일입니다. 우리는 Anki가 되려는 게 아닙니다. 지금으로서는 넣을 계획이 없고, 넣지 않는 이유를 이 글 전체에 걸쳐 적어 두었습니다.
마지막으로 — 알고리즘은 당신이 앱을 여는 것까지는 못 합니다
FSRS는 세계 최고의 스케줄러입니다. 그리고 당신이 3일간 앱을 안 열면 아무것도 아닙니다. 완벽한 간격으로 “오늘 복습할 카드 340장”을 띄워 놓고 기다릴 뿐이고, 그 숫자를 본 사람은 앱을 닫습니다.
간격 반복 알고리즘의 50년 역사는 “복습을 최소화하는 경쟁”이었습니다. 라이트너는 5칸으로, SM-2는 EF 곱셈으로, FSRS는 당신의 로그로. 모두가 같은 목표를 향했습니다 — 필요 없는 복습을 지우는 것.
그런데 실제로 사람들이 실패하는 지점은 거기가 아닙니다. 사람들은 “복습이 너무 많아서” 그만두는 게 아니라, “오늘 안 열어서” 그만둡니다. 우리가 개인화를 통째로 포기하고 마찰을 0으로 만드는 데 전부를 건 이유가 이것입니다. 그게 옳은 선택인지는 확신하지 않습니다. 다만 그게 우리가 한 선택이고, 그 대가를 이 글에서 하나도 숨기지 않았습니다.
이 글은 학습 방법에 관한 정보 제공이며, 교육·의학적 자문이 아닙니다. 학습 효과에는 개인차가 크며, 여기 적힌 어떤 방법도 특정한 성적이나 결과를 보장하지 않습니다.
타사 도구(Anki · SuperMemo · FSRS)의 기본값과 수식은 버전에 따라 달라집니다. 이 글의 숫자는 널리 알려진 기본 프리셋 기준이며, 반드시 본인이 사용하는 버전의 설정 화면과 공식 문서에서 직접 확인하세요. FSRS 관련 수식은 DECAY = −0.5로 고정된 FSRS-4.5 / 5 기준으로, FSRS-6 이상에서는 성립하지 않을 수 있습니다.
VOCA DECK에 관한 수치는 이 글 작성 시점의 실제 구현 기준이며 업데이트로 변경될 수 있습니다.