Skip to content

Release#102

Merged
JiiminHa merged 15 commits intomainfrom
relase/v-1.0
Mar 26, 2026
Merged

Release#102
JiiminHa merged 15 commits intomainfrom
relase/v-1.0

Conversation

@JiiminHa
Copy link
Copy Markdown
Contributor

@JiiminHa JiiminHa commented Mar 26, 2026

@JiiminHa JiiminHa self-assigned this Mar 26, 2026
@vercel
Copy link
Copy Markdown

vercel Bot commented Mar 26, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
snow-code-client Ready Ready Preview, Comment Mar 26, 2026 6:53pm

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 26, 2026

📝 Walkthrough

Walkthrough

학생 선택 기능을 추가하고 (MultiSelectInput), 강의 편집 시 등록된 학생 정보를 조회하여 폼에 기본값으로 설정하며, 학생 프로필에 이메일 공유 기능을 구현하고, 라우팅 시 페이지를 최상단으로 스크롤하는 기능을 추가했습니다.

Changes

Cohort / File(s) Summary
새로운 UI 컴포넌트 및 훅
src/shared/ui/MultiSelectInput.tsx, src/shared/lib/useScrollToTop.ts
다중 선택 입력 컴포넌트(태그 기반) 추가 및 라우트 변경 시 페이지 최상단 스크롤 훅 신규 작성
강의 관리 폼 업데이트
src/widgets/course-form/ui/CourseForm.tsx, src/features/course/create-course/model/schemas.ts, src/features/course/create-course/model/useCreateCourse.ts, src/features/course/edit-course/model/useEditCourse.ts
강의 폼에서 FileUpload 대신 MultiSelectInput을 이용한 학생 선택 구현 및 스키마/훅 내 학생 ID 매핑 로직 추가
강의 편집 페이지 개선
src/pages/admin/courses/CourseEditPage.tsx
강의 ID 기반 학생 등록 목록 조회 및 폼 기본값에 학생 목록 설정
학생 프로필 및 타입 정의
src/entities/student/ui/StudentProfile.tsx, src/entities/student/model/schemas.ts, src/pages/admin/student/StudentProfilePage.tsx
StudentProfile에 이메일 props 추가 및 mailto: 링크 구현, 타입 스키마 내보내기 추가
라우팅 및 네비게이션
src/App.tsx, src/shared/lib/index.ts, src/pages/common/LandingPage.tsx
useScrollToTop 훅 적용, 랜딩 페이지에서 인증 상태 확인 후 자동 리다이렉트 구현
레이아웃 및 에디터 UI 조정
src/pages/admin/assignments/AssignmentCreatePage.tsx, src/pages/admin/assignments/AssignmentFormPage.tsx, src/widgets/assignment-form-layout/ui/AssignmentFormLayout.tsx, src/features/student/ui/CodePreview.tsx, src/pages/submit-assignment/ui/CodeEditor.tsx
할당 폼 레이아웃 너비를 고정에서 유연한 너비로 변경, Monaco 에디터 UI 요소 비활성화(읽기 전용 모드 강화)
메타데이터
index.html
SEO 및 소셜 공유용 메타 태그(Open Graph, Twitter Card) 추가

Sequence Diagram

sequenceDiagram
    participant User
    participant LandingPage
    participant useUserStore
    participant Router as react-router-dom
    
    User->>LandingPage: 페이지 방문
    LandingPage->>useUserStore: isAuthenticated, userType 읽기
    
    alt 인증됨 (isAuthenticated === true)
        alt userType === 'admin'
            LandingPage->>Router: navigate(ROUTES.ADMIN.ROOT, { replace: true })
            Router->>User: 관리자 대시보드로 이동
        else userType === 'student'
            LandingPage->>Router: navigate(ROUTES.STUDENT.ROOT, { replace: true })
            Router->>User: 학생 대시보드로 이동
        end
    else 미인증
        User->>LandingPage: 페이지 상호작용 (hover, click)
        LandingPage->>Router: navigate(ROUTES.USER_ID, { state: { type: 'admin'/'student' } })
        Router->>User: 로그인 페이지로 이동
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~35 minutes

Possibly related PRs

Suggested labels

🧩 feature, 🎨 ui

Suggested reviewers

  • suminb99

상세 리뷰 의견

✨ 좋은 점

MultiSelectInput 컴포넌트: 태그 기반의 직관적인 다중 선택 UI로, Enter/공백/쉼표로 태그 추가하고 중복 방지 로직이 잘 구현되어 있습니다. 다만 IME 컴포지션 상태 처리가 있어 한글 입력 환경도 대응했네요. 👍

LandingPage 인증 리다이렉트: useEffect에서 인증 상태를 확인하고 사용자 타입별로 적절한 대시보드로 자동 이동하는 흐름이 깔끔합니다. replace: true 옵션으로 히스토리 스택을 깔끔하게 유지하는 점도 좋습니다.

🔍 개선 제안

1. CourseForm의 학생 선택 로직 검증

// src/widgets/course-form/ui/CourseForm.tsx
<Controller
  control={control}
  name="students"
  render={({ field, fieldState }) => (
    <MultiSelectInput
      value={field.value || []}
      onChange={field.onChange}
      errorMessage={fieldState.error?.message}
    />
  )}
/>
  • 확인 사항: CourseFormValues.students의 기본값이 undefined 또는 []로 초기화되는지 확인해주세요. useForm의 defaultValues에서 students: []로 명시적 설정을 권장합니다.
  • 참고: React Hook Form Controller 문서 참조

2. StudentProfile의 이메일 공유 기능

const sendEmail = () => {
  window.location.href = `mailto:${email}`;
};
  • 제안: 현재 구현은 mailto 스킴을 직접 사용하는데, 실제 메일 클라이언트가 없는 환경에서 사용자 경험이 저하될 수 있습니다.
    • 옵션 1: 클립보드 복사 기능 추가
    • 옵션 2: 토스트 알림으로 "메일 클라이언트가 없습니다" 안내
    • 옵션 3: 내부 메시지 시스템 연동

3. CourseEditPage 학생 조회 로직

// src/pages/admin/courses/CourseEditPage.tsx
const { data: enrollmentData } = useQuery({
  queryKey: ['enrollments', courseId],
  // ...
});

const studentIds = enrollmentData?.data?.map((e) => e.studentId) ?? [];
  • 확인 필요: enrollment 응답 구조가 정확하지 명시되어 있지 않습니다. API 응답 타입이 TEnrollmentList와 정확히 일치하는지 검증해주세요.
  • 참고: 에러 상태 처리도 추가하면 좋습니다 (useQuery의 isError 상태)

4. Monaco 에디터 옵션 정리

// src/features/student/ui/CodePreview.tsx & src/pages/submit-assignment/ui/CodeEditor.tsx
editorOptions={{
  readOnlyMessage: '',
  folding: false,
  glyphMargin: false,
  // ...
}}
  • 좋은 점: 읽기 전용 코드 뷰어로의 변환이 명확합니다.
  • 제안: 이 옵션 세트를 공유 상수로 추출하는 것을 검토해보세요:
    const READONLY_EDITOR_OPTIONS = { /* ... */ };
    재사용성과 유지보수성이 향상됩니다. Monaco Editor API 문서

5. useScrollToTop 훅의 위치

// src/shared/lib/useScrollToTop.ts
useEffect(() => {
  window.scrollTo(0, 0);
}, [pathname]);
  • 고려사항: 모바일 환경에서 부드러운 스크롤이 필요할 수 있습니다.
    window.scrollTo({ top: 0, behavior: 'smooth' });
    사용자 선호도에 따라 조정할 수 있도록 구성 가능하게 만드는 것도 좋습니다.

6. LandingPage 리다이렉트 타이밍

// src/pages/common/LandingPage.tsx
useEffect(() => {
  if (isAuthenticated) {
    const route = userType === 'admin' ? ROUTES.ADMIN.ROOT : ROUTES.STUDENT.ROOT;
    navigate(route, { replace: true });
  }
}, [isAuthenticated, userType, navigate]);
  • 확인: 라우트 가드(ProtectedRoute)와 중복 로직이 있는지 검토해주세요. 양쪽에서 동일한 리다이렉트를 수행하면 불필요한 렌더링이 발생할 수 있습니다.

📋 체크리스트

  • MultiSelectInput에서 학생 ID 중복 선택 시 서버 응답 검증
  • CourseEditPage에서 courseId 유효성 검사 및 에러 처리 확인
  • 이메일 공유 기능의 폴백 UX 검토
  • Monaco 에디터 옵션의 브라우저 호환성 테스트
  • 모바일 환경에서 scroll-to-top 동작 확인
🚥 Pre-merge checks | ❌ 3

❌ Failed checks (3 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning PR 설명이 전혀 제공되지 않아 변경 사항의 의도와 맥락을 파악할 수 없습니다. 이 PR의 주요 변경 사항, 추가된 기능, 그리고 테스트 여부를 설명하는 PR 설명을 작성하세요.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ⚠️ Warning PR 제목이 너무 모호하고 구체적인 정보를 담고 있지 않습니다. 광범위한 변경사항(SEO 메타 태그, 스크롤 기능, 학생 선택 UI, 폼 레이아웃 등)을 모두 다루고 있지만 제목에서는 전혀 알 수 없습니다. PR 제목을 더 구체적으로 변경하세요. 예: 'feat: 학생 선택 기능 추가 및 폼 UI 개선' 또는 'chore: v1.0 릴리스 준비' 같이 주요 변경사항을 명확히 드러내는 제목을 사용하는 것이 좋습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch relase/v-1.0

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@JiiminHa JiiminHa changed the title Relase Release Mar 26, 2026
@JiiminHa JiiminHa merged commit f3cab83 into main Mar 26, 2026
3 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants