9:41
Profile
김로피보컬 · 댄스 · 서울

이용 내역

설정

연습 기록
연습 기록

아직 연습 기록이 없어요

연습한 날 영상·유튜브 링크·사진·오디오·글을 남기면
달력에 그날이 표시돼요.

연습 기록

무엇을 올릴까요?

오늘 기록 0/3개

유튜브 링크
기록 올리기
연습 기록
영상 고르기
연습 기록
10월 27일 (화)
고음 구간 녹음
올리지 못했어요 · 인터넷 연결을 확인해 주세요

기록 하나에는 파일 하나를 올려요. 실패한 기록은 파일을 다시 고르지 않고 다시 올릴 수 있어요. 실패한 기록은 하루 3개에 세지 않아요.

기록을 올리지 못했어요.
기록
공개 범위
보호자 동의
보호자 동의
lopi.app/guardian-consent/k3Xq…

이 시안 (v5)

지원자가 춤·보컬 연습을 남기고, 월 달력에서 기록한 날을 본다. 공개 범위는 두 가지(나만 보기 / 소속사에 공개)이고, "소속사에 공개"는 지원 여부와 관계없이 로피에 입점한 모든 소속사가 본다. 동의는 "소속사에 공개" 한 번만 받는다. 피드백 기능은 없다.

왼쪽 목록이나 화면 안 버튼으로 넘어간다. "시안 조건"으로 공개 범위와 만 14세 미만 흐름을 바꿔 볼 수 있다. 모든 데이터는 가짜다.

v1 이후 바뀐 것 (민경문 결정, 2026-10-27)

  • 잔디·연속 일수 → 월 달력. 기록한 날에 점(개수만큼, 최대 3개), 날짜를 누르면 그날 기록 목록. 연속 일수 숫자는 뺐고 "이번 달 n일 기록" 한 줄만 작게 둔다.
  • 유튜브 링크 종류 추가: 링크 붙여넣기 → 미리보기 → 태그·날짜·메모. 길이 제한 없음.
  • 진입점: 마이 → 이용 내역 첫 줄 "연습 기록".
  • 지난 날짜는 7일 전까지. 하루 기록 최대 3개, 4번째 시도 때 안내 화면.
  • 공개 범위 두 가지: 나만 보기 / 소속사에 공개(로피에 입점한 모든 소속사). 동의는 "소속사에 공개" 한 번만, 다른 동의와 구분해 받는다. (v6, 민경문 결정: 기존 두 공개 범위를 하나로 합쳤다.)
  • 보유·이용 기간 문구: "회원 탈퇴 또는 동의 철회 시까지 (소속사 공개는 철회 즉시 중단)".
  • 보호자 동의 (v5): 만 14세 이상은 보호자 정보·체크 없이 본인 동의만으로 공개한다. 만 14세 미만은 휴대전화 본인인증 없이, 회원가입처럼 보호자 이메일로 동의를 받는다. 요청 메일을 보내면 "대기" 상태(아직 공개 안 됨, 다시 보내기, 요청 취소)이고, 보호자가 메일 링크의 웹 페이지에서 동의 내용을 읽고 직접 "동의"를 누르면 앱에서 공개된다.

흐름

  1. 마이 → 이용 내역 "연습 기록" → 홈(달력·고른 날 기록 목록).
  2. 홈에서 날짜를 고르면 그 날이 7일 안일 때 버튼이 "10월 25일 기록 올리기"로 바뀐다. 7일이 지난 날을 고르면 "오늘 기록 올리기"로 돌아간다.
  3. 올리기 → 종류(영상·유튜브 링크·사진·오디오·글) → 파일 고르기 또는 링크 붙여넣기 → 태그(춤·보컬)·연습한 날(최근 8일 칩, 날마다 n/3 표시)·메모·공개 → 저장 → 완료.
  4. 고른 날에 이미 3개가 있으면 종류 시트 대신 "하루 3개" 안내가 뜬다. 정보 입력에서 3개가 찬 날을 고르면 저장 버튼이 꺼지고 빨간 안내가 나온다.
  5. 공개 범위 → "소속사에 공개" 선택 → 동의 화면(받는 곳·목적·항목·보유 기간·거부 권리, 체크 해제가 기본) → 공개. 나만 보기로 돌리면 동의는 철회로 남긴다.
  6. 만 14세 이상: "소속사에 공개" 선택 → 동의 내용 → 본인이 체크 → 공개. 보호자 단계 없음.
  7. 만 14세 미만: "소속사에 공개" 선택 → 동의 내용 → 보호자 이메일 확인(가입 때 등록한 이메일을 보여 주고 바꿀 수 있음) → "보호자에게 동의 요청 메일 보내기" → 대기(아직 공개 안 됨 · 다시 보내기 · 이메일 바꾸기 · 요청 취소) → 보호자가 메일 링크로 여는 웹 동의 페이지에서 동의 내용을 읽고 "동의" → 아이 앱에 공개 완료. 보호자가 "동의하지 않음"을 누르면 요청이 끝나고 나만 보기로 남는다.
  8. 오류: 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, 긴 변 1920pxlopi-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), 카드 #161616 rounded-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개 기준), createdAt
  • kind (VIDEO | YOUTUBE | PHOTO | AUDIO | TEXT)
  • fields (DANCE | VOCAL), memo
  • visible (기록별 숨기기, 기본 true — 공개 범위는 사람 단위)
  • status (UPLOADING | READY | FAILED), deletedAt
  • 제약: (userId, practicedOn)마다 READY·UPLOADING 3개까지 — 앱이 아니라 서버가 막는다. 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 — 소속사 열람 기록.

정해 주실 것 (남은 것만)

이번 결정으로 닫힌 것: 진입점, 지난 날짜 7일, 영상 길이·하루 개수, 소속사가 보는 범위(두 가지), 보유 기간 문구, 만 14세 이상은 본인 동의만(보호자 없음), 만 14세 미만은 보호자 이메일 동의(본인인증 없음).

  1. "소속사에 공개"에서 소속사가 보는 프로필 항목과 연락 방법: 연습 기록만 보이면 누구인지 알 수 없다. 이름·나이·프로필 사진·활동 지역 중 무엇을 같이 보일지, 소속사가 어떻게 연락하는지(로피 안 메시지 등). 동의 화면 "항목" 칸이 이 결정에 따라 바뀐다.
  2. 철회 뒤 이미 본 기록: 소속사 쪽 다운로드를 막을지, 이미 내려받은 파일의 파기를 소속사 계약으로 요구할지.
  3. 보호자 메일 링크 규칙: 링크 유효 기간(시안은 미정), 다시 보내기 횟수·간격 제한, 이메일을 바꿨을 때 가입 때 등록한 보호자 이메일도 함께 바꿀지(바꾸면 아이가 아무 이메일이나 넣을 수 있어 보호자 확인이 약해진다), 보호자가 동의하지 않았을 때 아이에게 알릴지.
  4. 하루 3개의 기준일: 시안은 "연습한 날" 기준이다. "올린 날" 기준으로 할지.
  5. 동의 확인서·알림: 보호자 동의 뒤 아이에게 앱 알림을 보낼지, 보호자에게 공개 중인 상태를 주기적으로 알릴지(철회 안내용).
  6. 소속사 화면에서 늦게 올린 기록 표시: 연습한 날과 올린 날이 다를 때(최대 7일) 소속사에게도 "나중에 올림"을 보일지.