Skip to content

Conversation

@alsgud8311
Copy link
Contributor

[RELEASE-20260131]

작업사항

마이페이지

  • 이력서 및 포트폴리오 미리보기로 파일 조회 UI 추가
  • 이력서 및 포트폴리오 평가 결과 조회, 면접 질문 생성 결과 조회 UI 추가

- 이력서 기반 면접 질문 생성 API 및 상태 관리 로직 추가
- 면접 질문 생성 폼 및 히스토리 컴포넌트 구현
- 이력서 기반 면접 결과 페이지 및 모드 선택 모달 추가
- 관련 타입 및 이벤트 정의 추가
- .gitignore에 sitemap-*.xml 추가
- 이력서 기반 면접 히스토리 컴포넌트 및 모드 선택 모달 구현
- 선택 섹션에 이력서 기반 면접 및 평가 결과 추가
- 이력서 평가 폼에서 FileList 검증 로직 개선
- 관련 타입 및 이벤트 정의 추가
- 아카이브 미리보기 컴포넌트 및 PDF 뷰어 추가
- 선택 섹션에 아카이브 옵션 추가
- react-pdf 라이브러리 통합 및 PDF 파일 로드 기능 구현
- canvas 모듈에 대한 webpack 설정 추가
- useInfiniteQuery를 사용하여 이력서 기반 면접 생성 기록을 무한 스크롤로 로드하도록 개선
- 페이지 매개변수를 관리하는 새로운 쿼리 키 추가
- 로딩 상태를 표시하는 로더 컴포넌트 추가 및 페이지네이션 버튼 제거
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @alsgud8311, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 Pull Request는 사용자 대시보드에 이력서 및 포트폴리오와 관련된 강력한 새 기능을 도입합니다. 사용자는 이제 자신의 문서를 업로드하여 AI 기반 평가를 받고, 맞춤형 면접 질문을 생성하며, 아카이브된 파일을 편리하게 미리 볼 수 있습니다. 이러한 변경 사항은 사용자에게 더 풍부하고 통합된 경험을 제공하여 경력 개발 과정을 지원하는 것을 목표로 합니다.

Highlights

  • 이력서 및 포트폴리오 관리 기능 추가: 사용자가 이력서와 포트폴리오를 업로드하고, 평가 결과를 조회하며, 해당 문서 기반의 면접 질문을 생성할 수 있는 새로운 기능들이 추가되었습니다.
  • 마이페이지 UI 개선: 마이페이지에 이력서 및 포트폴리오 미리보기, 평가 결과 조회, 면접 질문 생성 결과 조회 등 새로운 섹션과 UI가 추가되어 사용자 경험이 향상되었습니다.
  • PDF 뷰어 및 관련 라이브러리 통합: 이력서 및 포트폴리오 미리보기를 위해 react-pdf 라이브러리가 도입되었으며, Next.js 환경에서 canvas 관련 빌드 문제를 해결하기 위한 Webpack 설정이 추가되었습니다.
  • 이력서 기반 면접 질문 생성 및 관리 API: 이력서 기반 면접 질문을 생성하고, 진행 상태를 확인하며, 실제 면접을 시작할 수 있는 새로운 API 엔드포인트와 클라이언트 로직이 구현되었습니다.
  • 평가 및 면접 질문 생성 히스토리: 이력서 평가 및 면접 질문 생성 내역을 확인할 수 있는 히스토리 페이지가 추가되어 사용자가 자신의 활동을 쉽게 추적할 수 있습니다.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@github-actions
Copy link

🛠️ Build Summary

Status: ✅ SUCCESS
Duration: 59초
Exit Code: 0
Commit: eb6ce51

📋 Build Output (마지막 45줄)

├ ƒ /dashboard                             12.7 kB         647 kB
├ ƒ /interviews                            7.52 kB         354 kB
├ ƒ /interviews/[interviewId]              9.17 kB         612 kB
├ ƒ /interviews/[interviewId]/result       8.79 kB         372 kB
├ ○ /layout (1554 ms)                        542 B         341 kB
├   └ css/2af4d3721e97fa9b.css               280 B
├ ƒ /login                                 2.59 kB         343 kB
├ ƒ /login/callback                        2.79 kB         343 kB
├ ƒ /login/google/callback                 2.79 kB         343 kB
├ ƒ /login/profile                         5.33 kB         375 kB
├ ƒ /members/[memberId]                    4.79 kB         348 kB
├ ƒ /members/[memberId]/sitemap.xml          429 B         341 kB
├ ƒ /members/interviews/[interviewId]      7.66 kB         348 kB
├ ƒ /purchase                              7.81 kB         637 kB
├ ƒ /purchase/confirm                      2.42 kB         345 kB
├ ○ /purchase/error (1554 ms)                801 B         343 kB
├ ƒ /rank                                  4.14 kB         347 kB
├ ƒ /recruit                               6.92 kB         354 kB
├ ƒ /resume                                1.76 kB         450 kB
├ ƒ /resume/eval                            4.6 kB         348 kB
├ ƒ /resume/eval/[evaluationId]/result     3.63 kB         449 kB
├ ƒ /resume/eval/demo                      3.56 kB         452 kB
├ ƒ /resume/interview                      6.16 kB         376 kB
├ ƒ /resume/interview/[interviewId]        4.52 kB         348 kB
├ ƒ /server-sitemap.xml                      422 B         341 kB
├ ƒ /sitemap/members.xml                     424 B         341 kB
├ ƒ /sitemap/rank.xml                        421 B         341 kB
├ ƒ /terms/privacy                         6.01 kB         346 kB
└ ƒ /terms/termsofuse                      5.84 kB         346 kB
+ First Load JS shared by all               356 kB
  ├ chunks/framework-0859aa6f37f5c68e.js   57.6 kB
  ├ chunks/main-01a61b95b97aa4ca.js         176 kB
  ├ chunks/pages/_app-5b4bed7b31e253ea.js   104 kB
  ├ css/b89643931364741b.css               15.9 kB
  └ other shared chunks (total)            2.54 kB

ƒ Middleware                               96.2 kB

○  (Static)   prerendered as static content
ƒ  (Dynamic)  server-rendered on demand

   Memory usage report:
    - Total time spent in GC: 415.11ms
    - Peak heap usage: 69.77 MB
    - Peak RSS usage: 681.30 MB

🤖 Generated by GitHub Actions at Sat Jan 31 14:10:06 UTC 2026

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

이번 PR은 이력서 및 포트폴리오 미리보기, 평가 결과 조회, 면접 질문 생성 결과 조회 등 마이페이지 관련 신규 기능 추가를 중심으로 이루어졌습니다. 전반적으로 코드가 잘 구조화되어 있으며, React Query를 활용한 데이터 페칭과 커스텀 이벤트 에미터를 통한 백그라운드 작업 상태 업데이트 등 좋은 패턴을 사용하고 있습니다. 다만, API 클라이언트에서의 코드 중복 및 일부 디버깅용 코드 잔여 등 몇 가지 개선점을 발견했습니다. 이러한 부분들을 수정하면 코드의 유지보수성과 품질이 더욱 향상될 것입니다.

Comment on lines +158 to +161
const instance = axios.create({
baseURL: process.env.NEXT_PUBLIC_API_BASE_URL + "/resumes/evaluations",
withCredentials: true
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

이 파일 내에서 getResumeEvaluations 함수가 매번 새로운 Axios 인스턴스를 생성하고 있습니다. 파일 상단에 정의된 resumePollingServerInstance와 동일한 baseURL을 사용하므로, 해당 인스턴스를 재사용하여 코드 중복을 줄일 수 있습니다. 더 나아가, 애플리케이션 전반에 걸쳐 API 클라이언트를 중앙에서 관리하는 것을 고려해보는 것이 좋습니다.

  return resumePollingServerInstance

>
) => {
const requestId = createRequestId(response.config);
console.log(response.data);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

디버깅을 위해 추가된 console.log 구문이 남아있습니다. 프로덕션 코드에 포함되지 않도록 제거하는 것이 좋습니다.

Comment on lines +173 to +176
const instance = axios.create({
baseURL: process.env.NEXT_PUBLIC_API_BASE_URL + "/interviews/resume-based",
withCredentials: true
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

이 파일과 다른 API 관련 파일들에서 axios.create를 사용하여 유사한 Axios 인스턴스를 여러 번 생성하고 있습니다. 이는 코드 중복을 유발하고 유지보수를 어렵게 만들 수 있습니다. 공통된 설정을 가진 중앙 API 클라이언트 유틸리티를 만들어 재사용하는 것을 고려해보세요. 예를 들어, 기본 URL과 withCredentials 설정을 포함하는 기본 인스턴스를 만들고, 각 API 함수에서 이를 가져와 사용할 수 있습니다.

// 예시: api/client.ts
import axios from 'axios';

export const apiClient = axios.create({
  baseURL: process.env.NEXT_PUBLIC_API_BASE_URL,
  withCredentials: true,
});

이렇게 하면 각 API 파일에서 apiClient를 import하여 apiClient.get(...), apiClient.post(...)와 같이 일관되게 사용할 수 있습니다.

};

const handleDocumentLoadSuccess = ({ numPages }: { numPages: number }): void => {
console.log('numPages', numPages);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

디버깅용 console.log가 남아있습니다. 프로덕션 배포 전에 제거하는 것이 좋습니다.

pageNumber,
onLoadSuccess
}: PdfViewerProps): JSX.Element {
// const [isLoading, setIsLoading] = useState(true);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

사용되지 않는 주석 처리된 코드가 남아있습니다. 코드 가독성을 위해 제거하는 것이 좋습니다.

Comment on lines +34 to +37
onLoadSuccess={({numPages}) =>
{
onLoadSuccess({ numPages });
}}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

onLoadSuccess 핸들러를 더 간결하게 작성할 수 있습니다. 현재 props로 전달된 onLoadSuccess 함수의 시그니처와 Document 컴포넌트의 onLoadSuccess 콜백 시그니처가 호환되므로, 직접 전달할 수 있습니다.

      onLoadSuccess={onLoadSuccess}

const formData = generateFormData(data);
mutation.mutate(formData);
} catch (error) {
console.log(error);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

onSubmit 함수의 catch 블록에 console.log가 사용되고 있습니다. 에러 로깅 시스템(예: Sentry)을 사용하거나, 사용자에게 피드백을 주는 방식으로 에러를 처리하는 것이 더 바람직합니다.

      toast({
        title: "제출 중 오류 발생",
        description: "양식 제출 중 오류가 발생했습니다. 잠시 후 다시 시도해주세요.",
        variant: "error",
      });

@github-actions
Copy link

🚀 Lighthouse Report for TEST1

📅 Date: 1/31/2026

Category Score
🔴 Performance 19
🟢 Accessibility 96
🟢 Best Practices 96
🟢 SEO 100

📊 Performance Details

Metric Score Value
🟢 First Contentful Paint 97 1.4 s
🔴 Largest Contentful Paint 11 6.2 s
🔴 Cumulative Layout Shift 20 0.447

🚀 Lighthouse Report for TEST2

📅 Date: 1/31/2026

Category Score
🔴 Performance 43
🟢 Accessibility 96
🟢 Best Practices 96
🟢 SEO 100

📊 Performance Details

Metric Score Value
🟢 First Contentful Paint 100 1.0 s
🔴 Largest Contentful Paint 19 5.5 s
🟢 Cumulative Layout Shift 100 0

🚀 Lighthouse Report for TEST3

📅 Date: 1/31/2026

Category Score
🔴 Performance 24
🟢 Accessibility 96
🟢 Best Practices 96
🟢 SEO 100

📊 Performance Details

Metric Score Value
🟢 First Contentful Paint 100 0.9 s
🔴 Largest Contentful Paint 19 5.5 s
🔴 Cumulative Layout Shift 20 0.447

🚀 Lighthouse Report for TEST4

📅 Date: 1/31/2026

Category Score
🟠 Performance 52
🟢 Accessibility 96
🟢 Best Practices 96
🟢 SEO 100

📊 Performance Details

Metric Score Value
🟢 First Contentful Paint 100 0.9 s
🟠 Largest Contentful Paint 52 3.9 s
🟢 Cumulative Layout Shift 100 0

🚀 Lighthouse Report for TEST5

📅 Date: 1/31/2026

Category Score
🔴 Performance 43
🟢 Accessibility 96
🟢 Best Practices 96
🟢 SEO 100

📊 Performance Details

Metric Score Value
🟢 First Contentful Paint 100 0.9 s
🔴 Largest Contentful Paint 18 5.6 s
🟢 Cumulative Layout Shift 100 0

@alsgud8311 alsgud8311 merged commit 6620477 into main Jan 31, 2026
8 of 9 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.

1 participant