상황
출석 리워드는 다음과 같습니다.
- 조건: 7일 연속 출석합니다.
- 광고 제거: 수령일을 포함해 8일입니다.
- 수령 기한: 완주 당일부터 7일 뒤까지입니다.
보너스로 자동 출석권을 제공합니다. 결석하면 자정 이후에 출석권으로 빠진 날을 채웁니다.
리워드 수령 후 7일 연속 출석하면 자동으로 연장됩니다.
- 직접 출석: 완주 즉시 연장됩니다.
- 자동 출석: 자정 이후 결석을 채우면서 연장됩니다.
문제
리워드 수령 시점에 따라 연장 결과가 달랐습니다.
- 완주 당일 수령: 연장됐습니다.
- 이틀 뒤 수령: 연장이 누락됐습니다.
수령 기한을 지켰고 출석도 채웠지만 연장되지 않았습니다.
다음 경우도 확인해야 했습니다.
- 완주 하루 뒤 수령
- 수령 기한 직전 수령
- 마지막 날 자동 출석
테스트를 나누는 기준이 필요했습니다.
원인
완주 시점에 리워드 만료를 판단한 것이 원인이었습니다.
- 완주: 연속 출석 7일
- 광고 제거: 수령일 포함 8일
수령이 늦어지면 만료일도 늦어집니다. 완주일과 만료일을 따로 판단해야 했습니다.
수령일은 자정에 바뀝니다. 8월 23일 완주 후 23일 23:59:59 수령과 24일 00:00:00 수령을 비교했습니다. 1초 차이로 만료일이 하루 늦어집니다. 광고는 만료일 다음날 00:30 직전까지 숨깁니다.

이틀 뒤 수령한 사례입니다.
| 입력: 완주일 | 행위: 수령일 | 결과: 광고 제거 날짜 |
|---|---|---|
| 8월 23일 | 8월 23일 수령 | 8월 23 ~ 30일 |
| 8월 23일 | 8월 25일 수령 | 8월 25일 ~ 9월 1일 |
명세에서 구획과 경계를 찾았습니다
Maurício Aniche의 『Effective Software Testing: A developer’s guide』 2장을 참고했습니다. 이전에 쓴 명세 기반 테스트 정리를 이번 문제에 적용했습니다.

표지 출처: Simon & Schuster 공식 도서 소개 · Manning 출판
명세 기반 테스트는 요구사항에서 테스트를 찾는 방법입니다.
- 요구사항 이해: 입력과 기대 결과를 정합니다.
- 구획과 경계 분석: 같은 방식으로 처리되는 입력을 묶고 대표값과 경계값을 고릅니다.
- 테스트 구현: 선택한 값으로 테스트를 자동화합니다.
놓친 조건을 발견하면 앞 단계로 돌아가 보완합니다.
구획은 같은 방식으로 처리되는 입력 묶음이고, 경계는 결과가 달라지는 지점입니다.
- 출석이 6일에서 7일이 되는 순간
- 수령 기한이 끝나는 순간
- 광고 제거가 끝나는 순간
이틀 뒤 수령은 버그가 발생한 조건입니다. 경계값인지는 수령일에 따른 완주일과 만료일의 관계를 확인해야 합니다.
해결
변수와 경계를 정했습니다
변수들이 서로 영향을 줘서 풀기 어려웠습니다. 수령일이 바뀌면 만료일이 달라지고, 출석 방식에 따라 완주 기록 시각도 달라집니다.
다른 조건을 고정하고 변수 하나의 경계부터 확인했습니다. 그다음 변수를 조합했습니다. 표는 입력 → 행위 → 결과 순서입니다.
- 입력:
출석 일수,수령 여부등 바꿀 값 - 고정 조건:
만료일 = 8월 23일등 유지할 값 - 행위: 동작과 실행 시각
- 결과: 광고 표시, 수령 가능 여부 등
예를 들어 출석 6일·7일 × 유예 종료 직전·정각은 네 가지 조합입니다.
입력은 행위 직전 값입니다. 연장 후에는 새 도전의 출석 일수로 표시합니다. 실제로 가능한 조합을 골랐습니다.
| 변수 | 경계값 | 확인할 결과 |
|---|---|---|
| 출석 일수 | 6일 / 7일 | 수령 자격 |
| 리워드 수령 여부 | 수령 전 / 수령 후 | 출석·출석권 획득 가능 여부 |
| 수령 요청 시각 | 수령 기한 1초 전 / 정확히 기한 | 수령 가능 여부 |
| 리워드 만료일과 처리 날짜 | 만료일 당일 / 다음날 / 이틀 뒤 | 클릭·자동 연장 가능 여부 |
| 광고 제거 종료 시각 | 다음날 00:29:59 / 00:30:00 | 광고 표시 여부 |
| 출석 후 지난 시간과 보유 출석권 수 | 4시간 직전 / 4시간 경과, 1장 / 2장 | 출석권 획득 가능 여부 |
| 클릭과 자동 처리 순서 | 클릭 먼저 / 자동 처리 먼저 | 완주 확인 시점과 연장 결과 |
글에서는 00:29:59와 00:30:00처럼 초 단위로 표시했습니다. 테스트는 경계 1ms 전과 정각을 비교합니다.
표의 결과는 다음 기준으로 읽습니다.
- 기준: 수정 PR의 코드와 테스트를 반영했습니다.
- 안내: 코드값을 풀어 쓴 표현입니다.
단일 변수: 출석 일수
공통 조건
- 첫 출석일: 8월 17일
- 리워드 수령: 안 받음
변수와 경계
- 출석 기록: 0건 / 1건
- 출석 일수: 6일 / 7일
- 중간에 빠진 날: 없음 / 있음
자동 출석은 출석 날짜와 기록 시각을 구분합니다.

출석 기록과 완주
고정 조건
리워드 수령 = 안 받음- 출석 클릭 전까지 날짜가 끊기지 않음
- 클릭하는 날에는 아직 출석하지 않음
| 입력: 출석 기록 | 행위 | 결과: 출석 일수 | 결과: 완주 여부 |
|---|---|---|---|
| 없음 | 8월 17일 조회 | 0일 · 시작일 없음 | 미완주 |
| 8월 17일 | 8월 17일 조회 | 1일 · 시작일 8월 17일 | 미완주 |
| 5일(17 ~ 21일 연속 출석) | 8월 22일 클릭 | 6일 | 미완주 |
| 6일(17 ~ 22일 연속 출석) | 8월 23일 클릭 | 7일 | 완주 · 클릭 시각에 완료 |
연속 출석 여부
고정 조건
첫 출석일 = 8월 17일오늘 = 8월 23일자동 보완 = 없음
| 입력: 8월 22일 출석 | 행위 | 결과: 출석 일수 | 결과: 도전 시작일 |
|---|---|---|---|
| 있음(17 ~ 22일 연속 출석) | 8월 23일 클릭 | 7일 | 8월 17일 |
| 없음(17 ~ 21일 출석 후 22일 결석) | 8월 23일 클릭 | 1일 | 8월 23일 |
마지막 날 자동 출석
고정 조건
출석 기록 = 8월 17 ~ 22일8월 23일 출석 = 없음
| 입력: 보유 출석권 | 행위 | 결과: 출석 보완 | 결과: 완주 |
|---|---|---|---|
| 0장 | 8월 24일 자정 자동 처리 | 23일 보완 안 됨 | 완주 안 됨 |
| 1장 | 8월 24일 자정 자동 처리 | 23일 보완 · 1장 사용 | 7일 완주 · 완료 기록 시각은 24일 |
단일 변수: 수령 조건
공통 조건: 첫 출석일은 8월 17일입니다.
변수와 경계
- 출석 일수: 6일 / 7일
- 완주 방식: 직접 출석 / 자동 출석
- 수령 요청 시각: 기한 직전 / 정각
직접 완주하면 수령 기한은 8월 31일 00:00입니다.

출석 6일과 7일
고정 조건
첫 출석일 = 8월 17일광고 제거 리워드 = 없음수령 이력 = 없음
| 입력: 출석 일수 | 행위 | 결과 |
|---|---|---|
| 6일(22일까지 출석 완료) | 8월 22일 수령 요청 | 완주 전이므로 거절 |
| 7일(23일까지 출석 완료) | 8월 23일 수령 요청 | 수령 성공 · 8월 23 ~ 30일 리워드 |
완주 방식과 수령 기한
고정 조건
마지막 출석 대상 날짜 = 8월 23일출석 일수 = 7일수령 = 안 받음
| 입력: 마지막 출석 방식 | 행위 | 결과: 수령 기한 |
|---|---|---|
| 8월 23일 직접 클릭 | 8월 23일 조회 | 8월 31일 00:00 · 남은 날짜 8일 표시 |
| 8월 24일 출석권으로 23일 보완 | 8월 24일 조회 | 8월 31일 00:00 · 남은 날짜 7일 표시 |
수령 기한 직전과 정각
고정 조건
완주일 = 8월 23일완주 방식 = 직접 출석수령 기한 = 8월 31일 00:00광고 제거 리워드 = 없음
23일 완주 후 7일 이내인 30일 수령과 7일 이후인 31일 수령을 비교합니다.
| 입력: 수령 기한과의 관계 | 행위: 수령 요청 시각 | 결과 |
|---|---|---|
| 기한 1초 전 | 8월 30일 23:59:59 | 수령 성공 · 8월 30일 ~ 9월 6일 리워드 |
| 기한 정각 | 8월 31일 00:00:00 | 기한 경과로 거절 |
수령 전후와 중복 요청
고정 조건
직접 완주일 = 8월 23일수령 요청일 = 8월 23일
동시 요청은 두 요청 모두 사전 검사를 통과했다고 가정합니다.
| 입력: 수령 완료 | 입력: 요청 수 | 행위 | 결과 |
|---|---|---|---|
| 아니요 | 1건 | 수령 | 리워드 8월 23 ~ 30일 · 다음 도전은 24일부터 |
| 예 · 리워드 적용 중 | 1건 | 재수령 | 기존 리워드 적용 중이므로 거절 |
| 아니요 | 동일 시작일로 2건 | 동시 수령 | 저장할 때 중복 차단 · 수령 기록은 하나 |
수령은 완주 → 연장 자격 → 수령 기한 순서로 판단합니다. 기한을 비교하려면 완주했고 연장 대상은 아니어야 합니다.
단일 변수: 연장 조건
공통 조건
- 리워드 수령일: 8월 23일
- 최초 만료일: 8월 30일
- 다음 도전 시작일: 8월 24일
24일 결석을 채우지 못하면 출석 시작이 늦어집니다. 재처리는 연장된 만료일을 기준으로 합니다.
변수와 경계
- 클릭 날짜: 만료일 / 다음날
- 자동 처리 날짜: 만료 다음날 / 이틀 뒤
- 출석 일수: 6일 / 7일
- 보유 출석권: 0장 / 1장

만료일 클릭과 출석 일수
고정 조건
만료일 = 8월 30일오늘 = 8월 30일오늘 출석 = 없음
| 입력: 클릭 전 연속 출석 | 행위 | 결과: 출석 일수 | 결과: 연장 |
|---|---|---|---|
| 5일(25 ~ 29일 연속 출석) | 8월 30일 클릭 | 6일 | 안 됨 |
| 6일(24 ~ 29일 연속 출석) | 8월 30일 클릭 | 7일 | 8월 31일 ~ 9월 6일로 즉시 연장 |
자동 처리 날짜
고정 조건
만료일 = 8월 30일30일까지 채운 출석 = 7일연장 완료 = 아니요
이틀 뒤 처리는 31일 처리가 누락된 경우입니다.
| 입력: 만료 후 지난 날짜 | 행위 | 결과 |
|---|---|---|
| 다음날 | 8월 31일 자정 자동 처리 | 8월 31일 ~ 9월 6일로 연장 |
| 이틀 뒤 | 9월 1일 자정 자동 처리 | 처리 대상에서 제외 |
마지막 날 결석과 출석권 수
고정 조건
출석 기록 = 8월 24 ~ 29일만료일 = 8월 30일30일 출석 = 없음
자동 처리는 결석 보완 → 완주 확인 → 연장 순서입니다.
| 입력: 보유 출석권 | 행위 | 결과: 30일 출석 | 결과: 연장 |
|---|---|---|---|
| 0장 | 8월 31일 자정 자동 처리 | 보완 안 됨 | 안 됨 · 00:30 광고 표시 |
| 1장 | 8월 31일 자정 자동 처리 | 보완하여 7일 완주 | 8월 31일 ~ 9월 6일로 연장 |
연장 완료 후 재처리
고정 조건
기존 만료일 = 8월 30일연장 후 만료일 = 9월 6일
| 입력: 연장 완료 | 행위 | 결과 |
|---|---|---|
| 예 · 만료일 9월 6일 | 8월 30일 다시 클릭 | 추가 연장 없음 |
| 예 · 만료일 9월 6일 | 8월 31일 자정 자동 처리 재실행 | 추가 연장 없음 |
새 리워드의 종류와 시작일
이전 리워드 = 8월 23 ~ 30일로 고정합니다. 새 리워드가 시작된 뒤 연결 여부를 조회합니다.
| 입력: 새 리워드 종류 | 입력: 새 리워드 날짜 | 행위 | 결과: 이전 리워드과 연결 | 결과: 다음 출석 시작 |
|---|---|---|---|---|
| 연장 | 8월 31일 ~ 9월 6일 | 새 리워드 시작 후 조회 | 연결 · 실제 종료 9월 7일 00:30 | 8월 31일 |
| 새 수령 | 8월 31일 ~ 9월 7일 | 새 리워드 시작 후 조회 | 별도 리워드 | 9월 1일 |
| 연장 | 9월 1 ~ 7일 · 하루 공백 | 새 리워드 시작 후 조회 | 연결 안 됨 | 9월 1일 |
단일 변수: 안내와 출석권 획득
변수와 경계
- 클릭 전 출석 일수: 5일 / 6일
- 광고 제거 리워드: 적용 안 됨 / 적용 중
- 출석 후 시간: 4시간 직전 / 정각
- 보유 출석권: 1장 / 2장

출석 일수와 광고 제거에 따른 안내
오늘 출석 = 가능으로 고정합니다. 안내와 실제 연장은 구분합니다.
| 입력: 클릭 전 일수 | 입력: 광고 제거 | 입력: 클릭 날짜 | 행위 | 결과: 안내 |
|---|---|---|---|---|
| 0 ~ 5일 | 적용 안 됨 | 만료일 없음 | 출석 클릭 | 일반 출석 완료 |
| 6일 | 적용 안 됨 | 만료일 없음 | 출석 클릭 | 완주 · 수령 안내 |
| 6일 | 적용 중 | 만료일 | 출석 클릭 | 완주 · 연장 완료 안내 |
| 6일 | 유예 중 | 만료 다음날 | 출석 클릭 | 완주 · 수령 안내 |
| 7일(만료일까지 완주) | 유예 중 | 만료 다음날 | 출석 클릭 | 일반 출석 완료 |
출석 후 시간 × 보유 출석권
고정 조건
오늘 직접 출석 = 완료수령 대기 = 아니요오늘 출석권 획득 = 안 함
| 입력: 출석 후 지난 시간 | 입력: 보유 출석권 | 행위 | 결과 |
|---|---|---|---|
| 3:59:59 | 1장 | 다시 클릭 | 아직 획득 불가 |
| 4:00:00 | 1장 | 다시 클릭 | 1장 획득 · 총 2장 |
| 3:59:59 | 2장 | 다시 클릭 | 획득 불가 |
| 4:00:00 | 2장 | 다시 클릭 | 보유 상한이므로 획득 불가 |
출석 시각과 당일 출석권 획득
보유 출석권 = 1장, 수령 대기 = 아니요, 오늘 출석권 획득 = 안 함으로 고정합니다.
| 입력: 오늘 출석 시각 | 행위 | 결과 |
|---|---|---|
| 19:59:59 | 23:59:59 조회 | 4시간 경과 · 획득 가능 |
| 20:00:00 | 23:59:59 조회 | 획득 시각이 다음날이므로 오늘은 종료 |
행동 차단과 중복 기록
| 입력: 행동 가능 여부 | 입력: 오늘 동일 행동 기록 | 행위 | 결과 |
|---|---|---|---|
| 수령 대기로 차단 | 없음 | 클릭 | 처리 거절 |
| 오늘 행동 모두 완료 | 있음 | 클릭 | 처리 거절 |
| 저장 단계까지 도달 | 있음 | 동일 행동 재요청 | 중복 기록 거절 |
변수 조합: 수령 전후의 출석과 출석권 획득
공통 조건: 첫 완주에 필요한 출석 날짜는 8월 17 ~ 23일입니다.
변수와 경계
- 리워드 수령: 수령 전 / 수령 후
- 오늘 직접 출석: 없음 / 있음
- 수령 기한: 직전 / 정각
수령 대기 중에는 출석과 출석권 획득이 차단됩니다.
수령 전후의 출석권 획득
고정 조건
직접 완주일 = 8월 23일출석 후 시간 = 4시간보유 출석권 = 0장오늘 출석권 획득 = 안 함
| 입력: 리워드 수령 | 행위 | 결과: 출석권 | 결과: 출석 일수 |
|---|---|---|---|
| 안 받음 | 8월 23일 다시 클릭 | 획득 불가 | 7일 |
| 23일 수령 완료 | 8월 23일 다시 클릭 | 1장 획득 | 7일 |
수령일과 오늘 출석 기록
자동 완주는 24일에 23일 결석을 채운 경우입니다.
| 입력: 완주 방식 | 입력: 수령일 | 입력: 오늘 직접 출석 | 행위 | 결과 |
|---|---|---|---|---|
| 23일 직접 완주 | 미수령 | 24일 기록 없음 | 8월 24일 클릭 | 수령 대기로 차단 · 7일 유지 |
| 24일 자동 완주 | 8월 24일 | 24일 기록 없음 | 8월 24일 다시 클릭 | 출석·출석권 획득 불가 |
| 23일 직접 완주 | 8월 24일 | 24일 기록 없음 | 8월 24일 다시 클릭 | 수령 당일 추가 행동 없음 |
| 23일 직접 완주 | 8월 24일 | 25일 기록 없음 | 8월 25일 클릭 | 새 도전의 출석 1일 |
수령 기한 전후의 출석
고정 조건
직접 완주일 = 8월 23일리워드 수령 = 안 받음수령 기한 = 8월 31일 00:00완주 후 추가 출석 = 없음
| 입력: 수령 기한과의 관계 | 행위: 출석 클릭 시각 | 결과 |
|---|---|---|
| 기한 1초 전 | 8월 30일 23:59:59 | 수령 대기로 출석 거절 |
| 기한 정각 | 8월 31일 00:00:00 | 새 도전의 출석 1일 · 이전 7일은 제외 |
수령 대기 중 출석권 사용
고정 조건
직접 완주일 = 8월 23일리워드 수령 = 안 받음24일 이후 직접 출석 = 없음
| 입력: 보유 출석권 | 행위 | 결과: 결석 보완 | 결과: 보유 출석권 |
|---|---|---|---|
| 1장 | 8월 25일 자정 자동 처리 | 24일 보완 안 함 | 1장 유지 |
| 2장 | 8월 24 ~ 30일 자동 처리 후 조회 | 완주 후 결석 보완 안 함 | 2장 유지 · 다음 도전에도 보유 |
수령 당일 출석권을 얻으려면 그날 직접 출석한 기록이 필요합니다.
변수 조합: 수령과 연장 후 출석 시작일
오늘은 8월 31일입니다. 각 행은 별도 사례이며, 리워드 종류와 시작일을 바꿉니다.
| 입력: 리워드 종류 | 입력: 리워드 시작일 | 입력: 31일 출석 | 행위 | 결과: 새 도전 |
|---|---|---|---|---|
| 새 수령 | 8월 31일 | 없음 | 8월 31일 조회 | 9월 1일부터 · 오늘 추가 출석 불가 |
| 새 수령 | 8월 30일 | 없음 | 8월 31일 조회 | 오늘부터 · 출석 0일 |
| 오늘 클릭으로 연장 | 9월 1일 | 있음 | 8월 31일 조회 | 9월 1일부터 · 수령 당일 차단 규칙은 적용 안 함 |
| 오늘 자동 처리로 연장 | 8월 31일 | 있음 | 8월 31일 조회 | 오늘부터 · 출석 1일 |
유예 시간의 경계
유예는 만료일 다음날 00:00부터 00:30 직전까지 광고를 숨기는 30분입니다. 이때 결석 보완과 연장이 실행되므로 처리 순서도 비교합니다.
시간 경계
- 00:00: 날짜가 바뀝니다.
- 00:30: 유예가 끝납니다.
조합할 변수
- 출석 일수: 6일 / 7일
- 마지막 출석으로 인정한 날짜: 만료일 / 다음날
- 연장 기록: 없음 / 있음
- 처리 순서: 클릭 먼저 / 자동 처리 먼저
| 상황 | 변수와 경계값 | 확인할 차이 |
|---|---|---|
| 유예 종료 | 만료 다음날 00:29:59 / 00:30:00 | 광고 표시·수령 가능 여부 |
| 클릭과 자동 처리 | 클릭 먼저 / 자동 처리 먼저 | 안내와 실제 연장의 일치 여부 |
| 자정과 완주 날짜 | 만료일 23:59:59 / 다음날 00:00:00, 마지막 출석 날짜가 만료일 / 다음날 | 만료 전·후 완주 여부 |
- 1·2·4번: 8월 30일 만료 사례
- 3번: 8월 23일 만료 사례
1. 만료일까지 완주한 사용자의 수령
고정 조건
- 기존 만료일: 8월 30일
- 연장 완료: 아니요
- 출석: 8월 24 ~ 30일 완주
- 새 리워드 수령 기한: 남아 있음
변수와 경계
- 유예 종료 직전: 8월 31일 00:29:59
- 유예 종료 정각: 8월 31일 00:30:00
각 행은 별도 사례입니다.
| 입력: 유예 종료와의 관계 | 행위 | 결과: 광고 | 결과: 안내·수령 |
|---|---|---|---|
| 1초 전 | 8월 31일 00:29:59 조회 | 숨김 | 연장 대기 |
| 정각 | 8월 31일 00:30:00 조회 | 표시 | 수령 대기 |
| 1초 전 | 8월 31일 00:29:59 수령 | 숨김 | 연장 대상이므로 수령 거절 |
| 정각 | 8월 31일 00:30:00 수령 | 새 리워드로 숨김 | 수령 성공 · 8월 31일 ~ 9월 7일 리워드 |
2. 클릭과 자동 처리 순서
고정 조건
- 기존 리워드 만료일: 8월 30일
- 자정 자동 처리 순서: 어제 결석 보완 → 완주 확인 → 연장
변수와 경계
- 클릭 시각: 자정 전 / 자정 후
- 완주 시점: 자동 처리 전 / 자동 처리 후
- 광고 제거: 00:30 유예 종료 전 / 종료 후
첫 번째는 클릭 후 자동 처리입니다. 표를 시간순으로 읽습니다.
순서: 8월 30일 완주 → 31일 00:00:03 클릭 → 00:00:05 자동 연장 → 새 도전 출석
| 입력: 저장된 출석 | 입력: 실제 만료일 | 행위 | 결과 |
|---|---|---|---|
| 7일(24 ~ 30일 연속 출석) | 8월 30일 · 미연장 | 8월 31일 00:00:03 클릭 | 8건 기록 · 화면에는 상한인 7일 표시 |
| 8건(24 ~ 30일 완주 후 31일 추가 출석) | 8월 30일 · 미연장 | 8월 31일 00:00:05 자동 처리 | 9월 6일까지 연장 · 31일 출석은 새 도전의 1일차 |
| 1일(새 도전에서 31일 출석 완료) | 9월 6일 | 9월 1일 클릭 | 새 도전 출석 2일 |
| 6일(새 도전에서 8월 31일 ~ 9월 5일 출석 완료) | 9월 6일 | 9월 6일 클릭 | 7일 완주 · 9월 7 ~ 13일로 다시 연장 |
연장 후 31일 클릭은 새 도전의 첫 출석이 됩니다. 기록은 유지되지만 표시 일수는 7일에서 1일로 바뀝니다.
두 번째는 자동 처리 후 클릭입니다. 출석 시작이 늦어 31일에 완주합니다. 수령 기한은 남아 있습니다.
순서: 8월 31일 자정 이후 자동 처리에서 6일 확인 → 00:10 클릭으로 완주 → 00:30 유예 종료

| 입력: 출석 일수 | 입력: 자동 처리 | 행위 | 결과: 실제 연장 | 결과: 안내·광고 |
|---|---|---|---|---|
| 6일(25 ~ 30일 연속 출석) | 아직 실행 전 | 8월 31일 자정 이후 자동 처리 | 없음 | 미완주 · 광고 숨김 |
| 6일(25 ~ 30일 연속 출석) | 연장 없이 완료 | 8월 31일 00:10 클릭 | 없음 · 7일 완주만 기록 | 수령 안내 · 광고 숨김 |
| 7일(25 ~ 31일 연속 출석) | 연장 없이 완료 | 8월 31일 00:30 조회 | 없음 | 수령 대기 · 광고 표시 |
수정 전에는 연장 없이 연장 완료로 안내했습니다. 수정 후에는 완주 즉시 수령을 안내합니다.
31일 00:30까지 6일인 사용자는 광고가 나와도 수령할 수 없습니다. 오늘 출석이 가능하면 계속 출석할 수 있습니다.
3. 광고 표시와 수령·연장 자격
만료일까지 완주했는지로 나눴습니다.
- 만료일까지 완주: 유예 중 연장 대기
- 만료 다음날 완주: 유예 중에도 수령 대기
아래 네 사례는 8월 16일 수령, 23일 만료를 기준으로 합니다.
고정 조건
- 기존 광고 제거 날짜: 8월 16 ~ 23일
- 광고 제거 유예: 8월 24일 00:00 ~ 00:30 직전
- 연장 기록: 없음
- 완주 후 리워드 수령 기한: 남아 있음
변수와 경계
- 7번째 출석으로 인정한 날짜: 23일 / 24일
- 실제 연장 처리: 기록 없음 / 있음
- 요청 시각: 자정 전후 / 00:30 전후

| 비교할 기준 | 경계값 | 확인할 결과 |
|---|---|---|
| 7번째 출석 날짜 | 8월 23일 / 8월 24일 | 만료 전·후 완주 여부 |
| 만료 여부 | 8월 23일 23:59:59 / 8월 24일 00:00:00 | 광고 숨김과 만료의 구분 |
| 유예 종료 여부 | 8월 24일 00:29:59 / 00:30:00 | 광고 표시·수령·출석 가능 여부 |
| 실제 연장 처리 여부 | 연장 기록 없음 / 있음 | 연장 기록 |
만료일까지 완주한 사용자
- 출석 날짜: 8월 17 ~ 23일
- 마지막 날 직접 클릭: 즉시 연장
- 마지막 날 자동 출석: 24일 자정 이후 출석 보완 → 연장
완주 후 미연장은 출석 보완 뒤 연장이 지연되거나 실패한 경우입니다.
하루 늦게 완주하는 사용자
- 17일: 결석했고 출석권으로도 보완하지 못함
- 18 ~ 23일: 6일 출석
- 24일 00:10: 클릭으로 7일 완주
24일 자동 출석은 23일 결석을 채우고, 24일 클릭은 24일 출석을 채웁니다. 기록 시각이 같아도 출석 날짜는 다릅니다.
완주 날짜 × 유예 종료
각 행은 별도 사례입니다. 연장과 새 수령은 없고, 수령 기한은 남아 있습니다.
| 입력: 출석 날짜 | 행위: 8월 24일 기준 조회 시각 | 결과: 광고 | 결과: 대기 | 결과: 수령 |
|---|---|---|---|---|
| 17 ~ 23일 완주 | 00:29:59 | 숨김 | 연장 대기 | 불가 |
| 17 ~ 23일 완주 | 00:30:00 | 표시 | 수령 대기 | 가능 |
| 18 ~ 24일 완주(24일 00:10 클릭) | 00:29:59 | 숨김 | 수령 대기 | 가능 |
| 18 ~ 24일 완주(24일 00:10 클릭) | 00:30:00 | 표시 | 수령 대기 | 가능 |
완주 날짜와 가능한 행동
| 입력: 출석 날짜 | 행위 | 결과 |
|---|---|---|
| 17 ~ 23일 완주 · 미연장 | 8월 24일 00:00:03 클릭 | 출석 가능 · 연장 후 새 도전의 1일차 |
| 18 ~ 24일 완주(24일 00:10 클릭) | 8월 24일 00:20 조회 | 수령 대기 · 출석권 획득 안내 차단 |
4. 자동 처리 전후의 완주
고정 조건
- 만료일: 8월 30일
- 처리일: 8월 31일
- 연장 기록: 없음
| 입력: 출석 | 입력: 출석권 | 행위 | 결과 |
|---|---|---|---|
| 24 ~ 29일 출석 · 30일 결석 | 0장 | 자정 자동 처리 | 미완주 · 연장 없음 |
| 24 ~ 29일 출석 · 30일 결석 | 1장 | 자정 자동 처리 | 30일 보완 · 9월 6일까지 연장 |
| 24 ~ 30일 완주 | 0장 | 자정 자동 처리 | 9월 6일까지 연장 |
| 25 ~ 30일 출석 후 31일 클릭으로 완주 | 0장 | 클릭 뒤 자동 처리 | 만료 후 완주이므로 연장 없음 |
완주 기록이 있어도 7번째 출석 날짜가 만료일 뒤라면 연장하지 않습니다. 자동 처리를 반복해도 출석권 사용과 연장은 중복되지 않습니다.
수정한 규칙
- 수령 기한: 기록 시각 대신 7번째 출석 날짜로 계산합니다. 직접·자동 출석 모두 23일 완주라면 31일 00:00에 끝납니다.
- 연장 자격: 광고 제거 중이고 7번째 출석 날짜가 만료일 이내여야 합니다. 자동 연장도 출석 날짜를 확인합니다.
- 수령 당일: 새 출석은 막고 다음날부터 시작합니다. 그날 직접 출석한 기록이 있으면 4시간 뒤 출석권을 얻을 수 있습니다.
결과
변수별로 경계를 비교하고 조합해 두 오류를 수정했습니다.
- 자동 출석으로 완주하면 수령 기한이 하루 늘어나는 오류
- 만료 후 완주를 연장 대상으로 판단하는 오류