이 시안 (v5)
지원자가 춤·보컬 연습을 남기고, 월 달력에서 기록한 날을 본다. 공개 범위는 두 가지(나만 보기 / 소속사에 공개)이고, "소속사에 공개"는 지원 여부와 관계없이 로피에 입점한 모든 소속사가 본다. 동의는 "소속사에 공개" 한 번만 받는다. 피드백 기능은 없다.
왼쪽 목록이나 화면 안 버튼으로 넘어간다. "시안 조건"으로 공개 범위와 만 14세 미만 흐름을 바꿔 볼 수 있다. 모든 데이터는 가짜다.
v1 이후 바뀐 것 (민경문 결정, 2026-10-27)
- 잔디·연속 일수 → 월 달력. 기록한 날에 점(개수만큼, 최대 3개), 날짜를 누르면 그날 기록 목록. 연속 일수 숫자는 뺐고 "이번 달 n일 기록" 한 줄만 작게 둔다.
- 유튜브 링크 종류 추가: 링크 붙여넣기 → 미리보기 → 태그·날짜·메모. 길이 제한 없음.
- 진입점: 마이 → 이용 내역 첫 줄 "연습 기록".
- 지난 날짜는 7일 전까지. 하루 기록 최대 3개, 4번째 시도 때 안내 화면.
- 공개 범위 두 가지: 나만 보기 / 소속사에 공개(로피에 입점한 모든 소속사). 동의는 "소속사에 공개" 한 번만, 다른 동의와 구분해 받는다. (v6, 민경문 결정: 기존 두 공개 범위를 하나로 합쳤다.)
- 보유·이용 기간 문구: "회원 탈퇴 또는 동의 철회 시까지 (소속사 공개는 철회 즉시 중단)".
- 보호자 동의 (v5): 만 14세 이상은 보호자 정보·체크 없이 본인 동의만으로 공개한다. 만 14세 미만은 휴대전화 본인인증 없이, 회원가입처럼 보호자 이메일로 동의를 받는다. 요청 메일을 보내면 "대기" 상태(아직 공개 안 됨, 다시 보내기, 요청 취소)이고, 보호자가 메일 링크의 웹 페이지에서 동의 내용을 읽고 직접 "동의"를 누르면 앱에서 공개된다.
흐름
- 마이 → 이용 내역 "연습 기록" → 홈(달력·고른 날 기록 목록).
- 홈에서 날짜를 고르면 그 날이 7일 안일 때 버튼이 "10월 25일 기록 올리기"로 바뀐다. 7일이 지난 날을 고르면 "오늘 기록 올리기"로 돌아간다.
- 올리기 → 종류(영상·유튜브 링크·사진·오디오·글) → 파일 고르기 또는 링크 붙여넣기 → 태그(춤·보컬)·연습한 날(최근 8일 칩, 날마다 n/3 표시)·메모·공개 → 저장 → 완료.
- 고른 날에 이미 3개가 있으면 종류 시트 대신 "하루 3개" 안내가 뜬다. 정보 입력에서 3개가 찬 날을 고르면 저장 버튼이 꺼지고 빨간 안내가 나온다.
- 공개 범위 → "소속사에 공개" 선택 → 동의 화면(받는 곳·목적·항목·보유 기간·거부 권리, 체크 해제가 기본) → 공개. 나만 보기로 돌리면 동의는 철회로 남긴다.
- 만 14세 이상: "소속사에 공개" 선택 → 동의 내용 → 본인이 체크 → 공개. 보호자 단계 없음.
- 만 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) 질문형 제목 + 라디오 한 줄 설명 → 공개 범위 선택. |
스타일 출처 (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(AGENCY하나. 범위가 늘 때를 대비해 컬럼은 둔다),kind(AGREE|WITHDRAW),agreedBy(SELF|GUARDIAN),guardianRequestId?,textVersion,screen,appVersion,at.GuardianConsentRequest:userId,scope, 요청 보호자 이메일(가입 등록값 또는 바꾼 값), 일회용 링크 토큰(해시만 저장),status(PENDING|AGREED|DECLINED|CANCELED|EXPIRED),sentAt, 다시 보낸 횟수,openedAt?,decidedAt?. 동의하면PracticeShareConsent에agreedBy=GUARDIAN행과 이 요청 id를 남긴다.- 현재 공개 상태 = 철회되지 않은
AGENCY동의가 있는지. 나만 보기를 고르면WITHDRAW행. PracticeLogView:logId,agencyId,scope,viewedAt— 소속사 열람 기록.
검토 메모 (vibe-lawyer · 법률 자문 아님)
소속사가 연습 기록(얼굴·목소리가 담긴 영상·사진·오디오, 날짜, 메모)을 보는 것은 개인정보 제3자 제공이다. 기존 동의서의 엔터사 제공 항목은 "성명, 생년월일, 키, 몸무게, 성별"뿐이라(lopi-app/locales/ko.json:967 제5조) 새 동의가 필요하다고 보고 시안을 짰다.
공개 범위 두 가지와 동의
- R1 "소속사에 공개" 동의 한 번만 받는다. 선택 동의이고 체크 해제가 기본이며, 다른 동의(약관·마케팅 등)와 구분해 따로 받는다(개인정보 보호법 제22조제1항). 받는 곳은 "로피에 입점한 모든 소속사"로 앱 화면과 보호자 웹 화면 모두 같게 적는다.
- R1 기본 = 나만 보기. 거부해도 연습 기록·오디션 지원 모두 된다고 화면에 적었다.
- R1 철회는 공개 범위 화면에서 한 번에. 철회하면 공개가 바로 멈춘다.
- R2 동의·철회는 사람·범위 단위 append-only(
PracticeShareConsent). 누가 동의했는지(본인/보호자), 문구 버전·화면·앱 버전을 남긴다. - R6 동의 화면에 받는 곳·목적·항목·보유·이용 기간·거부 권리와 불이익 다섯 가지를 표로 보여 준다.
보유·이용 기간 문구
"회원 탈퇴 또는 동의 철회 시까지 (소속사 공개는 철회 즉시 중단)". 개인정보 보호법 제17조제2항은 제3자 제공 동의를 받을 때 "제공받는 자의 개인정보 보유 및 이용 기간"을 알리도록 한다. 고정 일수가 없어도 이 문구로 고지한다(결정 7). 다만 이 문구는 로피 화면에서의 공개를 말한다. 소속사가 이미 본 기록이나 내려받은 파일을 소속사가 얼마나 보관하는지는 이 문구로 정해지지 않는다(아래 정할 것 2).
보호자 동의: 14세 기준과 이메일 방식
- 만 14세 이상 19세 미만: 보호자 정보·체크를 받지 않고 본인 동의만으로 공개한다. 개인정보 보호법이 아동의 법정대리인 동의를 요구하는 것은 만 14세 미만이다(제22조의2). 오디션 지원은 만 19세 미만의 보호자 정보를 받지만, 그것은 오디션 참가용이라 이번 연습 기록 공개에는 따르지 않기로 했다(요청자 결정).
- 만 14세 미만: 보호자 휴대전화 본인인증을 빼고, 회원가입처럼 보호자 이메일로 동의를 받는다(가입 때 등록한 보호자 이름·관계·이메일을 재사용,
lopi-api/apps/domain/member/entity/user.entity.ts:239guardianEmail). 동의 전에는 어떤 기록도 소속사에 보이지 않는다(R1: 만 14세 미만은 법정대리인 동의가 없으면 막는다). - 법 검토 (결정 대기): 보호자 이메일 링크만으로는 시행령 제17조의2제1항 제1~5호의 확인 방법에 해당하지 않는다(법정대리인 본인임을 뒷받침하는 별도 수단이 없다. 근거: legal-check.md 1-2). 웹 동의 + 보호자 문자 알림(제1호) 등으로 바꿀 예정이며, 이번 시안은 이메일 링크 흐름 그대로다.
- 확인 방식: "아이가 앱에 인증번호를 입력"이 아니라 "보호자가 메일 링크에서 직접 동의를 누른다". 아이 기기에서 입력하는 번호는 그 번호를 누가 입력했는지(보호자 본인인지) 확인하지 못하기 때문이다. 링크는 보호자가 자기 기기에서 열고, 메일을 받을 수 있는 사람이 직접 동의한다.
- 같은 이유로 기존 회원가입의 이메일 인증번호 방식도 법무 확인이 필요하다(인증번호를 아이 기기에 입력하는 구조, 범위 밖 발견에 적음).
- R2 요청·발송·링크 열람·동의·거부·취소·만료를 시각과 함께 남기고, 동의는
agreedBy=GUARDIAN으로 기록한다. 동의하면 보호자 이메일로 동의 확인서를 보낸다. - R1 동의 링크는 일회용·기간 제한이 있어야 하고, 보호자가 동의하지 않아도 연습 기록 올리기와 오디션 지원은 그대로 된다고 화면에 적었다. 링크 유효 기간은 정해야 한다(정할 것).
조문 원문 대조: 2026-10-27 국가법령정보센터(law.go.kr) 조회가 두 번 실패(빈 페이지·접속 혼잡)해서, 법 제17조제2항·제22조의2제1항 문구는 원문과 다시 대조해야 한다. 이메일 방식이 시행령 제17조의2의 확인 방법에 해당하는지는 이 시안이 판단하지 않는다. 법률 자문 아님.
유튜브 링크
- 로피가 영상 파일을 받지 않는다. 그래도 소속사 화면에서 유튜브 플레이어를 열면 시청자(소속사 직원)의 접속 정보가 Google로 간다. 지원자 개인정보 제공은 아니지만, 로피 처리방침의 외부 서비스 항목에 적을지 확인한다. 플레이어는
youtube-nocookie.com임베드를 기본으로 제안. - 유튜브 '비공개'·삭제 영상은 재생되지 않는다. 안내 문구는 재생이 실패했을 때만 띄운다: 로피 웹 /player가 재생 실패 시 앱에 {type:"error"}를 보낸다(lopi-web/app/player/components/YoutubeBridgePlayer.tsx:101). 실패 이유 번호를 함께 넘기면 비공개·삭제와 퍼가기 금지를 나눠 안내할 수 있다.
지키지 못한 규칙 / 이유
- 없음. 다만 아래 정할 것이 닫히기 전에는 출시하지 않는다.
범위 밖 발견 (이번 시안에서 고치지 않음)
- 가입 보호자 동의: 기존 가입 흐름은 보호자 이메일로 받은 인증번호를 아이가 앱에 입력하고 체크·서명한다(
lopi-app/screens/guardian-consent-screen.tsx:76-135,guardian-agreement-screen.tsx:94-115,modals/signature-modal.tsx:67-98). 아이 기기 입력은 보호자 본인 확인이 안 되므로 법무 확인이 필요해 보인다. 이번 연습 기록 공개 시안은 보호자가 메일 링크에서 직접 동의하는 방식으로 다르게 그렸다. - 마케팅 동의: 기존 문구에 "이메일 수신 (필수)"가 있다(
lopi-app/locales/ko.json:971). R1(광고성 정보 수신 동의는 선택·기본 해제)과 맞지 않아 보인다.
정해 주실 것 (남은 것만)
이번 결정으로 닫힌 것: 진입점, 지난 날짜 7일, 영상 길이·하루 개수, 소속사가 보는 범위(두 가지), 보유 기간 문구, 만 14세 이상은 본인 동의만(보호자 없음), 만 14세 미만은 보호자 이메일 동의(본인인증 없음).
- "소속사에 공개"에서 소속사가 보는 프로필 항목과 연락 방법: 연습 기록만 보이면 누구인지 알 수 없다. 이름·나이·프로필 사진·활동 지역 중 무엇을 같이 보일지, 소속사가 어떻게 연락하는지(로피 안 메시지 등). 동의 화면 "항목" 칸이 이 결정에 따라 바뀐다.
- 철회 뒤 이미 본 기록: 소속사 쪽 다운로드를 막을지, 이미 내려받은 파일의 파기를 소속사 계약으로 요구할지.
- 보호자 메일 링크 규칙: 링크 유효 기간(시안은 미정), 다시 보내기 횟수·간격 제한, 이메일을 바꿨을 때 가입 때 등록한 보호자 이메일도 함께 바꿀지(바꾸면 아이가 아무 이메일이나 넣을 수 있어 보호자 확인이 약해진다), 보호자가 동의하지 않았을 때 아이에게 알릴지.
- 하루 3개의 기준일: 시안은 "연습한 날" 기준이다. "올린 날" 기준으로 할지.
- 동의 확인서·알림: 보호자 동의 뒤 아이에게 앱 알림을 보낼지, 보호자에게 공개 중인 상태를 주기적으로 알릴지(철회 안내용).
- 소속사 화면에서 늦게 올린 기록 표시: 연습한 날과 올린 날이 다를 때(최대 7일) 소속사에게도 "나중에 올림"을 보일지.