Skip to content

[DEV-188/BE] feat: llm 요청에 대한 인터페이스 설계 및 구현#378

Merged
zxc534 merged 15 commits intodevfrom
DEV-188/feat/LLM-요청에-대한-인터페이스-설계-및-구현
Feb 16, 2026

Hidden character warning

The head ref may contain hidden characters: "DEV-188/feat/LLM-\uc694\uccad\uc5d0-\ub300\ud55c-\uc778\ud130\ud398\uc774\uc2a4-\uc124\uacc4-\ubc0f-\uad6c\ud604"
Merged

[DEV-188/BE] feat: llm 요청에 대한 인터페이스 설계 및 구현#378
zxc534 merged 15 commits intodevfrom
DEV-188/feat/LLM-요청에-대한-인터페이스-설계-및-구현

Conversation

@zxc534
Copy link
Collaborator

@zxc534 zxc534 commented Feb 14, 2026

관련 이슈

close #262

작업한 내용

  • gemini 텍스트 생성 요청 엔드포인트를 Enum으로 분리
    • 엔드포인트를 변경하여 모델을 변경할 수 있음.
  • gemini 임베딩 요청 메소드 구현
    • 변경 가능한 옵션
      • 용도 (SEMANTIC_SIMILARITY, CLASSIFICATION, CLUSTERING)
      • 차원 (2048, 1536, 768, 512, 256, 128)
  • 임베딩 결과를 확인할 수 있는 임시 메소드 구현

PR 리뷰시 참고할 사항

  • GeminiClient.java 임베딩 생성 요청 URL은 private static으로 관리하고 있습니다. 변경되지 않을 것으로 보여서 이정도로 충분해 보이는데 의견이 궁금합니다.
  • 추가한 API는 임베딩 값을 확인해 보기 위한 임시 용도입니다. 추후 삭제 필요.
  • 임베딩 무료 버전에서 사용 제한
    • Request Per Minute: 100
    • Request Per Day: 1000

@zxc534 zxc534 self-assigned this Feb 14, 2026
@vercel
Copy link

vercel bot commented Feb 14, 2026

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
web-team4-refit Ignored Ignored Preview Feb 16, 2026 0:06am

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @zxc534, 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!

이 PR은 Gemini LLM과의 인터페이스를 확장하고 개선합니다. 주요 변경 사항은 Gemini 텍스트 생성 모델 엔드포인트를 Enum으로 관리하여 유연성을 높이고, 텍스트 임베딩 기능을 새롭게 도입하여 다양한 임베딩 옵션을 지원하는 것입니다. 또한, 임베딩 기능의 테스트를 위한 임시 API를 추가하여 개발 및 검증을 용이하게 합니다.

Highlights

  • Gemini 텍스트 생성 엔드포인트 Enum 분리: Gemini 텍스트 생성 요청 엔드포인트를 Enum으로 분리하여 모델 변경에 대한 유연성을 확보했습니다.
  • Gemini 임베딩 요청 메소드 구현: Gemini 임베딩 요청 메소드를 구현했으며, 용도(TaskType) 및 차원(OutputDimensionality)과 같은 변경 가능한 옵션을 지원합니다.
  • 임베딩 테스트용 임시 API 추가: 임베딩 결과를 확인할 수 있는 임시 API 엔드포인트를 추가하여 개발 및 검증을 용이하게 했습니다.
  • Gemini 응답 파싱 개선: Gemini 응답 파싱 시 응답 텍스트에서 JSON 코드 블록(json\n...)을 제거하는 로직을 추가하여 안정성을 향상시켰습니다.
  • 새로운 에러 코드 추가: 임베딩 생성 실패 시 사용할 새로운 에러 코드 TEXT_EMBED_FAILED를 추가했습니다.
Changelog
  • backend/src/main/java/com/shyashyashya/refit/domain/qnaset/api/QnaSetController.java
    • GeminiEmbeddingResponseNotBlank 임포트가 추가되었습니다.
    • 임베딩 생성 테스트를 위한 임시 POST API /test-embedding이 추가되었습니다.
  • backend/src/main/java/com/shyashyashya/refit/domain/qnaset/service/StarAnalysisAsyncService.java
    • TEXT_EMBED_FAILED 에러 코드 임포트가 추가되었습니다.
    • GeminiEmbeddingRequest, GeminiEmbeddingResponse, GenerateModel 임포트가 추가되었습니다.
    • createStarAnalysis 메소드에서 geminiClient.sendAsyncRequest 호출이 geminiClient.sendAsyncGenerateRequest로 변경되었고, GenerateModel enum을 사용하도록 수정되었습니다.
    • 텍스트 임베딩을 생성하는 임시 메소드 getTextEmbedding이 추가되었습니다.
    • parseStarAnalysisGeminiResponse 메소드에 Gemini 응답에서 JSON 코드 블록을 제거하는 로직이 추가되었습니다.
  • backend/src/main/java/com/shyashyashya/refit/global/exception/ErrorCode.java
    • 임베딩 생성 실패를 나타내는 새로운 에러 코드 TEXT_EMBED_FAILED가 추가되었습니다.
  • backend/src/main/java/com/shyashyashya/refit/global/gemini/GeminiClient.java
    • 기존 GEMINI_API_URL 상수가 제거되었습니다.
    • sendAsyncRequest 메소드의 이름이 sendAsyncGenerateRequest로 변경되었고, GenerateModel enum을 인자로 받아 동적으로 엔드포인트를 설정하도록 수정되었습니다.
    • 임베딩 요청을 비동기적으로 전송하는 sendAsyncEmbeddingRequest 메소드가 추가되었습니다.
    • 임베딩 엔드포인트 EMBEDDING_ENDPOINT 상수가 추가되었습니다.
  • backend/src/main/java/com/shyashyashya/refit/global/gemini/GeminiEmbeddingRequest.java
    • Gemini 임베딩 요청을 위한 레코드 클래스가 새로 추가되었습니다.
    • TaskType (SEMANTIC_SIMILARITY, CLASSIFICATION, CLUSTERING) 및 OutputDimensionality (D2048, D1536 등) enum이 정의되었습니다.
  • backend/src/main/java/com/shyashyashya/refit/global/gemini/GeminiEmbeddingResponse.java
    • Gemini 임베딩 응답을 위한 레코드 클래스가 새로 추가되었습니다.
  • backend/src/main/java/com/shyashyashya/refit/global/gemini/GenerateModel.java
    • 다양한 Gemini 생성 모델의 ID와 엔드포인트를 관리하는 GenerateModel enum이 새로 추가되었습니다.
Activity
  • 현재까지 이 PR에 대한 사람의 활동(댓글, 리뷰 등)은 없습니다.
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.

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

안녕하세요. LLM 요청 인터페이스 설계 및 구현에 대한 PR 잘 보았습니다.
Gemini 텍스트 생성 및 임베딩 요청을 위한 인터페이스를 추가하고, 모델 엔드포인트를 Enum으로 분리하여 확장성을 높인 점이 인상적입니다.

몇 가지 개선점을 제안드립니다.

  • 테스트용 임베딩 API의 요청 방식을 DTO를 사용하도록 변경하여 API 명세를 더 명확하게 하는 것을 제안합니다.
  • 임베딩 결과 로그가 누락된 부분을 수정하고, LLM 응답에서 JSON을 파싱하는 로직을 더 안정적으로 개선할 수 있습니다.
  • PR 설명에서 질문주신 임베딩 엔드포인트 관리에 대해, GenerateModel과 같이 Enum으로 관리하여 일관성과 확장성을 높이는 방안을 제안합니다.

자세한 내용은 각 파일의 코드 리뷰 코멘트를 참고해주세요.

Copy link
Collaborator

@kckc0608 kckc0608 left a comment

Choose a reason for hiding this comment

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

LGTM 수고하셨습니다!

Comment on lines +104 to +109
if (text.startsWith("```json\n")) {
text = text.substring("```json\n".length());
}
if (text.endsWith("```")) {
text = text.substring(0, text.length() - "```".length());
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

혹시 이 파트가 전에 말씀하셨던 모델별 응답 형식의 차이? 와 관련된 로직일까요? 아니면 테스트 용으로 로직을 작성하는 과정에서 필요하여 작성된 로직일까요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

특정 모델이 응답에 ```json ```을 붙이는 것을 해결하기 위한 로직입니다!

Copy link
Collaborator

@lja3723 lja3723 left a comment

Choose a reason for hiding this comment

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

좋습니다. 몇가지 사소한 코멘트 남겼습니다!

@zxc534 zxc534 merged commit 33273d4 into dev Feb 16, 2026
3 checks passed
kckc0608 added a commit that referenced this pull request Feb 16, 2026
* feat: 나의 최근 한달동안 기록전 면접 조회

* test: 나의 최근 한 달 기록전 면접 리스트 조회 테스트 작성

* [DEV-234] feat: 데스크탑 record 페이지 개발 (#360)

* feat: LiveAudioVisualizer 데스크탑, 모바일로 분리

* feat: 복기 대기 중인 면접 mock API 연동

* feat: /record 페이지 추가

* feat: 로딩 오버레이 추가

* refactor: query 사용하게 변경

* [DEV-220/FE] feat: 자소서 연동 mock-api 연결 (#356)

* fix: 하이라이팅 API 응답에 맞추어 pageNumber로 변수명 통일

* feat: 자기소개서 연결된 텍스트 실시간으로 보이도록 UI 변경 및 버튼 파일 분리

* feat: useSuspenseQueries 사용하여 질답별 하이라이트 조회 API 연결 및 하이라이트 생성, 수정 API 연결

* feat: 뒤로 가기 버튼 추가

* feat: 질답 조회 API 연결 및 fallback skeleton 처리 추가

* feat: 하이라이팅 관련 mock handler 추가

* fix: 하이라이팅 API 응답에 맞추어 pageNumber로 변수명 통일

* fix: minimized sidebar skeleton 추가

* fix: qnaSetId null filter 추가

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* [DEV-221/FE] feat: 스크랩 모달 UI 구현 및 회고 작성 페이지 일부 mock-api 연결 (#359)

* feat: 회고 페이지 mock-api 등록

* feat: 질답 리스트 조회 API 연결

* feat: 스크랩 모달 구현 및 스크랩 폴더 목록 조회 API 연결

* fix: 모달 사이즈에 따라 title mb 스타일 수정

* feat: 회고 저장 useUpdateQnaSet API 연동 및 스크랩 아이콘 추가

* feat: 사이드바에서 번호 변경 시, 회고 저장되도록 추가 예정

* fix: Number(interviewId) 변수화

* fix: 초기 페이지 0으로 변경

* fix: import 에러 수정

* feat: 프론트 요청에 따라 dto 응답에 review status 를 응답하도록 추가 (#367)

* [DEV-257/BE] docs: 모든 API 응답의 필수 필드에 @NotNull 어노테이션 추가 (#376)

* docs: 프론트 요청에 따라 response 필드 중 not null 필드에 @NotNull 어노테이션 추가

* feat: user profile image url 필드에 not null 제약 추가 및 @NotNull 어노테이션 추가

* [DEV-258/FE] fix: 스크롤 폴더 이름 입력 안되는 이슈 수정 (#374)

* fix: prevIsOpen 제거하고 key 기반 리마운트로 초기화 처리

* fix: 다른 폴더 선택 뿐만 아니라 열기/닫기(activeModal 상태 변경) 시에도 key 바뀌도록 수정

* [DEV-261/BE] refactor: Swagger의 Pageable 객체 렌더링 개선 (#382)

* [DEV-263/BE] feat: 사용자 조회 API 응답에 동의 여부 필드 추가 (#386)

* [DEV-176/BE] test: QnaSetController 테스트 작성 (#369)

* feat: QnaSetIntegrationTest 생성

* test: 질답_세트_생성에_성공한다 작성

* feat: 질답 세트 생성 시 interview가 qnaSetDraft 상태인지 검증 로직 추가

* test: 인터뷰 상태에 검증 추가로 테스트 로직 수정

* chore: 프롬프트 파일 삭제

* test: 어려웠던 질문 마킹 등록/해제 테스트 작성

* feat: 인터뷰 상태 검증 로직 추가

* test: 질답 세트 수정 테스트 작성

* test: 면접 생성을 메소드 사용하여 간소화

* test: 질답 세트 수정 테스트 추가

* test: 질문 답변 세트 삭제 테스트 작성

* docs: 하이라이팅 등록/수정 API swagger 작성

* feat: PDF 하이라이팅 업데이트 시 면접 상태 검증 로직 추가

* test: PDF 하이라이팅 등록 테스트 작성

* test: createAndSavePdfHighlighting 메소드 구현

* test: PDF 하이라이팅 조회 테스트 작성

* chore: spotless 적용

* test: 실제 값 검증 로직을 추가

* fix: unmark 메소드가 값을 false로 설정하도록 수정

* chore: 잘못된 테스트 이름 수정

* [DEV-256/BE] test: QnaSetMyController 테스트 작성 (#371)

* feat: QnaSetIntegrationTest 생성

* test: 질답_세트_생성에_성공한다 작성

* feat: 질답 세트 생성 시 interview가 qnaSetDraft 상태인지 검증 로직 추가

* test: 인터뷰 상태에 검증 추가로 테스트 로직 수정

* chore: 프롬프트 파일 삭제

* test: 어려웠던 질문 마킹 등록/해제 테스트 작성

* feat: 인터뷰 상태 검증 로직 추가

* test: 질답 세트 수정 테스트 작성

* test: 면접 생성을 메소드 사용하여 간소화

* test: 질답 세트 수정 테스트 추가

* test: 질문 답변 세트 삭제 테스트 작성

* docs: 하이라이팅 등록/수정 API swagger 작성

* feat: PDF 하이라이팅 업데이트 시 면접 상태 검증 로직 추가

* test: PDF 하이라이팅 등록 테스트 작성

* test: createAndSavePdfHighlighting 메소드 구현

* test: PDF 하이라이팅 조회 테스트 작성

* chore: spotless 적용

* test: 실제 값 검증 로직을 추가

* fix: unmark 메소드가 값을 false로 설정하도록 수정

* chore: 잘못된 테스트 이름 수정

* test: qnaSetCategory 테스트 데이터 추가

* test: qnaSetMy 통합 테스트 작성

* refactor: 테스트 코드의 공통 부분을 외부 클래스의 BeforeEach로 분리

* chore: QnaSetDraft->질답 세트 검토 중, 명칭 변경

* chore: 테스트 코드 들여쓰기 수정

* chore: 일회성 변수 타입을 var로 수정

* test: 테스트에 업데이트된 값 검증 추가

* test: 질답 세트 수정 테스트 ParameterizedTest+EnumSource로 케이스 추가

* test: 테스트 케이스 추가

* chore: given/when/then 주석 추가

* chore: spoless 적용

* [DEV-188/BE] feat: llm 요청에 대한 인터페이스 설계 및 구현 (#378)

* refactor: 요청 URL을 Enum으로 분리

* feat: Gemini 생성 결과에 JSON 이외 텍스트 처리 로직 추가

* chore: gemini 요청 모델을 gemma 3 27B로 변경

* chore: spotless 적용

* feat: Embedding 요청 응답 dto 작성

* feat: 임베딩 요청 메소드 추가

* feat: 임베딩 요청 임시 API 추가

* chore: 불필요한 로그 제거

* chore: 메소드 명칭 수정

* chore: 에러 코드에서 의미가 명확하게 드러나도록 수정

* chore: 정적 팩토리 메소드 네이밍 수정

* chore: GenerateModel 필드명 변경 id->name

* refactor: 테스트 메소드의 계층 분리 제거

* refactor: 임베딩 테스트 메소드를 테스트 컨트롤러로 이동

* chore: spotless 적용

* refactor: 최근 한달의 정의를 30일에서 실제 월 별 1달로 수정

* feat: 나의 최근 한달동안 기록전 면접 조회

# Conflicts:
#	backend/src/main/java/com/shyashyashya/refit/domain/interview/dto/InterviewSimpleDto.java

* test: 나의 최근 한 달 기록전 면접 리스트 조회 테스트 작성

* refactor: 최근 한달의 정의를 30일에서 실제 월 별 1달로 수정

---------

Co-authored-by: forhyundaisofteer <[email protected]>
Co-authored-by: Joohee Hwang <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Jangan Lee <[email protected]>
Co-authored-by: Yeong-beom Song <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[DEV-188/] feat: LLM 요청에 대한 인터페이스 설계 및 구현

3 participants