이 시안 (v2)
지원자가 춤·보컬 연습을 남기고, 월 달력에서 기록한 날을 본다. 공개 범위는 3단계(나만 보기 / 지원한 소속사만 / 스카우트용 공개)이고, 단계마다 따로 동의를 받는다. 피드백 기능은 없다.
왼쪽 목록이나 화면 안 버튼으로 넘어간다. "시안 조건"으로 공개 범위와 만 14세 미만 흐름을 바꿔 볼 수 있다. 모든 데이터는 가짜다.
v1에서 바뀐 것 (민경문 결정, 2026-10-27)
- 잔디·연속 일수 → 월 달력. 기록한 날에 점(개수만큼, 최대 3개), 날짜를 누르면 그날 기록 목록. 연속 일수 숫자는 뺐고 "이번 달 n일 기록" 한 줄만 작게 둔다.
- 유튜브 링크 종류 추가: 링크 붙여넣기 → 미리보기 → 태그·날짜·메모. 길이 제한 없음.
- 진입점: 마이 → 이용 내역 첫 줄 "연습 기록".
- 지난 날짜는 7일 전까지. 하루 기록 최대 3개, 4번째 시도 때 안내 화면.
- 공개 범위에 스카우트용 공개 추가. 범위별 별도 선택 동의.
- 보유·이용 기간 문구: "회원 탈퇴 또는 동의 철회 시까지 (소속사 공개는 철회 즉시 중단)".
- 만 14세 미만: 이메일 요청·대기 흐름을 뺐다. 기본 나만 보기만 가능, 소속사·스카우트 공개는 보호자 휴대전화 본인인증 뒤 보호자가 직접 동의.
흐름
- 마이 → 이용 내역 "연습 기록" → 홈(달력·고른 날 기록 목록).
- 홈에서 날짜를 고르면 그 날이 7일 안일 때 버튼이 "10월 25일 기록 올리기"로 바뀐다. 7일이 지난 날을 고르면 "오늘 기록 올리기"로 돌아간다.
- 올리기 → 종류(영상·유튜브 링크·사진·오디오·글) → 파일 고르기 또는 링크 붙여넣기 → 태그(춤·보컬)·연습한 날(최근 8일 칩, 날마다 n/3 표시)·메모·공개 → 저장 → 완료.
- 고른 날에 이미 3개가 있으면 종류 시트 대신 "하루 3개" 안내가 뜬다. 정보 입력에서 3개가 찬 날을 고르면 저장 버튼이 꺼지고 빨간 안내가 나온다.
- 공개 범위 → 단계 선택 → 그 단계의 동의 화면(받는 곳·목적·항목·보유 기간·거부 권리, 체크 해제가 기본) → 공개. 넓은 단계(스카우트)에서 좁히면 넓은 단계 동의는 철회로 남긴다.
- 만 14세 미만: 단계 선택 → 동의 내용 → 보호자 확인 안내(가입 때 등록한 보호자 표시) → 보호자 휴대전화 본인인증 → 보호자 동의 → 공개.
- 오류: 500MB 초과(기존 모달 문구 + "긴 영상은 유튜브 링크로" 한 줄), 업로드 실패(다시 올리기), 빈 상태.
진입점: 마이 화면 (로피 코드에서 확인)
마이 탭은 프로필 카드 → 내 오디션 영상(있을 때만) → 메뉴 순서다(lopi-app/screens/my-screen.tsx:20-57). 메뉴는 "이용 내역"(오디션 지원 내역·결제 내역)과 "설정"(내 정보·비밀번호 변경·공지사항·고객센터·로그아웃·회원탈퇴) 두 섹션이고, 아이콘 없이 글과 오른쪽 화살표만 둔다(lopi-app/src/my/components/my-menu.tsx:73-130). 저장소 기준 커밋 7b7b574b.
"연습 기록"은 내가 쌓는 활동 기록이라 이용 내역 섹션 첫 줄에 넣었다. 새 섹션·아이콘은 만들지 않았다. 처음 알리는 "NEW" 표시 하나만 brand 색으로 둔다.
업로드 제한
| 항목 | 값 | 출처·결정 |
|---|---|---|
| 영상 용량 | 500MB 초과 금지 (10진 MB) | lopi-app/src/profile/components/use-profile-video-upload-button.ts:38, 검사 :189·:259 |
| 영상 길이 | 제한 없음 (기존대로) | 민경문 결정 5. 프로필 영상 경로에 길이 검사 없음 |
| 영상 처리 | 올리기 전 H.264, 긴 변 1920px | lopi-app/utils/video-upload-compression.ts:6-8 |
| 유튜브 링크 | 길이·용량 제한 없음. youtube.com/watch, youtu.be, shorts 주소만 받음 | 민경문 결정 2. 파일을 받지 않아 R2 저장 비용 없음 |
| 하루 개수 | 최대 3개 (모든 종류 합산, 연습한 날 기준). 4번째는 안내 화면 | 민경문 결정 5 |
| 지난 날짜 | 오늘 포함 7일 전까지 | 민경문 결정 4 |
| 초과 안내 문구 | "파일 크기가 너무 큽니다." 기존 문구 그대로 | lopi-app/locales/ko.json:627-629 |
| 사진·오디오 용량 | 검사 없음 (확인 필요) | v1과 같음. profile-upload-button.tsx:107-109, audition-apply-audio.tsx:123-124 |
레퍼런스
Mobbin 검색어(v2, 3회, 2026-10-27): monthly calendar log screen with dots on days that have entries and list of entries for selected day, paste YouTube link screen showing video thumbnail preview before posting(결과 0건), add link screen with pasted URL and video thumbnail preview card. v1 검색 7회는 그대로 유효(공개 범위·업로드 폼).
| 앱 · 화면 | 가져온 것 |
|---|---|
| Weverse · Calendar | 월 달력 + 날짜 아래 작은 점(개수만큼) + 아래에 고른 날 목록. 같은 K-pop 사용자층이 익숙한 모양. |
| pliability · 기록 달력 | 고른 날을 brand 비슷한 연두 원으로 채우는 방식. 로피 brand #BEF264와 맞아 그대로 따랐다. |
| Tonal · 월 달력 | 점 하나로 "한 날"을 알리고 숫자는 그대로. 연속 일수 없이도 꾸준함이 보인다. |
| BeReal · Memories Calendar | 어두운 바탕 달력의 대비. 연속 표시(불꽃)는 쓰지 않았다(결정 1). |
| Weverse · Add URL | 링크 입력칸 아래 바로 미리보기 카드(썸네일·제목·출처). |
| Digg · Add a link block | 입력칸 오른쪽 지우기(×), 큰 썸네일 + 제목 카드. |
| Blinkist · Paste a link | 빈 입력칸 오른쪽 "붙여넣기" 버튼. |
| Facebook · Who can see your future posts | (v1) 질문형 제목 + 라디오 한 줄 설명 → 3단계 공개 범위. |
스타일 출처 (lopi-app, v1과 같음)
- brand
#BEF264(tailwind.config.js), 카드#161616rounded-xl, 주 버튼 50px 둥근 brand 바탕 검정 글씨(ui/animated-button.tsx:50). - 마이 화면: 제목 "Profile" Outfit 28/500(
my-screen.tsx:31-35), 섹션 제목 22px semibold·줄 15px·화살표 white/50(my-menu.tsx:40-66), 회원탈퇴 흐리게(:19-20).
데이터 모양 제안
PracticeLog
id,userId,practicedOn(DATE · 달력·하루 3개 기준),createdAtkind(VIDEO|YOUTUBE|PHOTO|AUDIO|TEXT)fields(DANCE|VOCAL),memovisible(기록별 숨기기, 기본 true — 공개 단계는 사람 단위)status(UPLOADING|READY|FAILED),deletedAt- 제약:
(userId, practicedOn)마다READY·UPLOADING3개까지 — 앱이 아니라 서버가 막는다.practicedOn≥ 오늘−7일(KST).
PracticeLogMedia
- 파일:
fileUrl(R2),mimeType,sizeBytes,durationMs,thumbnailUrl - 유튜브:
youtubeVideoId(11자), 원래 URL,title·thumbnailUrl(oEmbed로 받은 값, 표시용 캐시). 파일은 저장하지 않는다.
동의는 사람·범위 단위
PracticeShareConsent(append-only):userId,scope(APPLIED|SCOUT),kind(AGREE|WITHDRAW),agreedBy(SELF|GUARDIAN),guardianVerificationId?,textVersion,screen,appVersion,at.GuardianVerification:userId,method(PHONE_IDV), 업체 거래 번호,nameMatched,isAdult,verifiedAt. 휴대전화 번호·생년월일·CI는 저장하지 않는 것을 기본으로(확인 필요).- 현재 공개 단계 = 철회되지 않은 가장 넓은
scope. 나만 보기를 고르면 남은 범위 모두WITHDRAW행. PracticeLogView:logId,agencyId,scope,viewedAt— 소속사 열람 기록.
검토 메모 (vibe-lawyer · 법률 자문 아님)
소속사가 연습 기록(얼굴·목소리가 담긴 영상·사진·오디오, 날짜, 메모)을 보는 것은 개인정보 제3자 제공이다. 기존 동의서의 엔터사 제공 항목은 "성명, 생년월일, 키, 몸무게, 성별"뿐이라(lopi-app/locales/ko.json:967 제5조) 새 동의가 필요하다고 보고 시안을 짰다.
공개 3단계와 별도 동의
- R1 단계마다 별도 선택 동의, 체크 해제가 기본. "지원한 소속사만"과 "스카우트용 공개"는 받는 곳이 다르다(지원한 오디션의 소속사 vs 로피 입점 모든 소속사). 그래서 한 동의로 묶지 않았다.
- R1 기본 = 나만 보기. 거부해도 연습 기록·오디션 지원 모두 된다고 화면에 적었다.
- R1 철회는 공개 범위 화면에서 범위별로 한 번에. 철회하면 그 범위 공개가 바로 멈춘다.
- R2 동의·철회는 사람·범위 단위 append-only(
PracticeShareConsent). 누가 동의했는지(본인/보호자), 문구 버전·화면·앱 버전을 남긴다. - R6 동의 화면에 받는 곳·목적·항목·보유·이용 기간·거부 권리와 불이익 다섯 가지를 표로 보여 준다.
보유·이용 기간 문구
"회원 탈퇴 또는 동의 철회 시까지 (소속사 공개는 철회 즉시 중단)". 개인정보 보호법 제17조제2항은 제3자 제공 동의를 받을 때 "제공받는 자의 개인정보 보유 및 이용 기간"을 알리도록 한다. 고정 일수가 없어도 이 문구로 고지한다(결정 7). 다만 이 문구는 로피 화면에서의 공개를 말한다. 소속사가 이미 본 기록이나 내려받은 파일을 소속사가 얼마나 보관하는지는 이 문구로 정해지지 않는다(아래 정할 것 2).
만 14세 미만: 보호자 동의 확인
가입 단계에 보호자 동의 절차가 이미 있다. 만 14세 미만이면(lopi-app/screens/signup-screen.tsx:110-113) 가입 직전에 GuardianConsentScreen으로 보낸다(:617-619).
- 보호자 이름·관계·이메일 입력, 그 이메일로 받은 인증번호 확인(
lopi-app/screens/guardian-consent-screen.tsx:76-135, 문구locales/ko.json:691). - 보호자 동의서 체크박스(
lopi-app/screens/guardian-agreement-screen.tsx:94-115). - 화면에 서명 → 서명 이미지 업로드 후 가입(
lopi-app/modals/signature-modal.tsx:67-98). - 서버가 동의서 PDF를 만들어 보호자 이메일로 보낸다(
lopi-api/apps/application/batch/guardian-consent/guardian-consent.processor.ts:112-174).
재사용하는 것: 가입 때 등록한 보호자 이름·관계·이메일(lopi-api/apps/domain/member/entity/user.entity.ts:239 guardianEmail)을 보호자 확인 안내에 보여 주고, 본인인증 이름과 대조하고, 동의 확인서 PDF를 같은 이메일로 보낸다. 새로 붙이는 것: 보호자 휴대전화 본인인증. 코드에 휴대전화 본인인증 연동은 없다(lopi-api/apps/infrastructure/clients/iamport/는 결제용, 본인인증 호출 없음).
왜 체크만으로는 안 되나. 개인정보 보호법 제22조의2제1항은 만 14세 미만 아동의 개인정보를 처리할 때 법정대리인의 동의를 받고, 그 법정대리인이 동의했는지 확인하도록 한다. 확인 방법은 같은 법 시행령 제17조의2제1항 각 호에 정해져 있다. 그중 제3호는 "동의 내용을 게재한 인터넷 사이트에 법정대리인이 동의 여부를 표시하도록 하고, 법정대리인의 휴대전화 본인인증 등을 통해 본인 여부를 확인하는 방법"이다. 아이 휴대폰에서 누구나 누를 수 있는 체크박스는 "누가 눌렀는지"를 확인하지 못한다. 기존 가입 흐름의 이메일 인증번호도 그 번호를 아이 휴대폰에 입력하므로 "그 이메일을 쓸 수 있는 사람"까지만 확인한다. 그래서 이번 공개 동의는 보호자 휴대전화 본인인증(이름 일치·성인 확인) 뒤에 보호자가 직접 동의하는 흐름으로 그렸다.
조문 원문 대조: 2026-10-27 국가법령정보센터(law.go.kr) 조회가 두 번 실패(빈 페이지·접속 혼잡)해서, 법 제17조제2항·제22조의2제1항과 시행령 제17조의2제1항 제3호 문구는 원문과 다시 대조해야 한다. 법률 자문 아님.
유튜브 링크
- 로피가 영상 파일을 받지 않는다. 그래도 소속사 화면에서 유튜브 플레이어를 열면 시청자(소속사 직원)의 접속 정보가 Google로 간다. 지원자 개인정보 제공은 아니지만, 로피 처리방침의 외부 서비스 항목에 적을지 확인한다. 플레이어는
youtube-nocookie.com임베드를 기본으로 제안. - 유튜브 '비공개'·삭제 영상은 재생되지 않는다. 안내 문구는 재생이 실패했을 때만 띄운다: 로피 웹 /player가 재생 실패 시 앱에 {type:"error"}를 보낸다(lopi-web/app/player/components/YoutubeBridgePlayer.tsx:101). 실패 이유 번호를 함께 넘기면 비공개·삭제와 퍼가기 금지를 나눠 안내할 수 있다.
지키지 못한 규칙 / 이유
- 없음. 다만 아래 정할 것이 닫히기 전에는 출시하지 않는다.
범위 밖 발견 (이번 시안에서 고치지 않음)
- 가입 보호자 동의: 위와 같은 이유로 기존 가입 흐름(이메일 인증번호 + 체크 + 화면 서명)이 시행령 제17조의2제1항의 확인 방법에 맞는지 법무 확인이 필요해 보인다.
- 마케팅 동의: 기존 문구에 "이메일 수신 (필수)"가 있다(
lopi-app/locales/ko.json:971). R1(광고성 정보 수신 동의는 선택·기본 해제)과 맞지 않아 보인다.
정해 주실 것 (남은 것만)
이번 결정으로 닫힌 것: 진입점, 지난 날짜 7일, 영상 길이·하루 개수, 소속사가 보는 범위(3단계), 보유 기간 문구.
- 스카우트용 공개에서 소속사가 보는 프로필 항목과 연락 방법: 연습 기록만 보이면 누구인지 알 수 없다. 이름·나이·프로필 사진·활동 지역 중 무엇을 같이 보일지, 소속사가 어떻게 연락하는지(로피 안 메시지 등). 동의 화면 "항목" 칸이 이 결정에 따라 바뀐다.
- 철회 뒤 이미 본 기록: 소속사 쪽 다운로드를 막을지, 이미 내려받은 파일의 파기를 소속사 계약으로 요구할지.
- 보호자 휴대전화 본인인증 업체와 비용: 지금 코드에 연동이 없다. 업체 선택과 건당 비용, 인증 결과 중 무엇을 저장할지(시안 기본: 이름 일치·성인 여부·거래 번호만).
- 하루 3개의 기준일: 시안은 "연습한 날" 기준이다. "올린 날" 기준으로 할지.
- 만 14~18세: 법은 본인 동의를 인정하지만, 미성년 연습 영상을 모든 소속사(스카우트)에 보이는 일이라 보호자 알림을 더할지.
- 소속사 화면에서 늦게 올린 기록 표시: 연습한 날과 올린 날이 다를 때(최대 7일) 소속사에게도 "나중에 올림"을 보일지.