Skip to content

[URECA-48] Feat: 제미나이 요약 - #24

Merged
Zoo2-bi merged 9 commits into
developfrom
URECA-48/Feat/gemini
Jan 22, 2026
Merged

Zoo2-bi merged 9 commits into
developfrom
URECA-48/Feat/gemini

Conversation

@Zoo2-bi

@Zoo2-bi Zoo2-bi commented Jan 21, 2026

Copy link
Copy Markdown
Contributor

Key Changes

작업 내역

💬 공유사항 to 리뷰어

비고

Summary by CodeRabbit

  • 새로운 기능

    • AI 기반 상담 텍스트 요약 추가 — 제목·주제·키워드·요점 자동 생성
    • 요약 생성용 POST API 추가 (/api/summaries) — 즉시 요약 반환
  • 개선사항

    • 요약 결과 저장(영속화) 기능 추가
    • 외부 요약 서비스 연동 및 로컬 개발용 CORS 설정 추가
  • 주의

    • 설정 파일에 병합 충돌 마커가 포함되어 있습니다.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitai Bot commented Jan 21, 2026

Copy link
Copy Markdown

Warning

Rate limit exceeded

@Zoo2-bi has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 10 minutes and 54 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📝 Walkthrough

Walkthrough

Gemini 기반 요약 기능이 추가되었습니다. Gemini API 호출을 위한 RestClient 빈(GeminiConfig)과 호출 책임 클래스(GeminiClient), 응답 파싱 및 요약 로직을 수행하는 GeminiSummaryService가 도입되었고, 이를 사용하는 SummaryService와 SummaryController가 추가되었습니다. 도메인 관련 DTO/모델(SummaryRequest, SummaryResponse, SummaryModel, GeminiSummaryResponse), MyBatis 매퍼 인터페이스 및 XML(src/main/resources/mapper/summary/Summary.xml)도 추가되었습니다. .gitignore에 항목이 추가되었고 application.yml에 설정 변경 및 머지 충돌 마커가 포함되어 커밋에 반영되어 있습니다.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 3 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
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.
Out of Scope Changes check ❓ Inconclusive application.yml에서 병합 충돌 마크(<<<<<<<, =======, >>>>>>>)가 포함되어 있어 의도된 변경인지 미해결 충돌인지 명확하지 않습니다. application.yml의 병합 충돌을 해결하고, CORS 설정과 쿠키 보안 설정이 제미나이 요약 기능 구현에 필요한 범위 내 변경인지 확인하세요.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목이 변경사항의 핵심을 명확히 전달합니다. 제미나이(Gemini) 요약 기능 구현이라는 주요 목표를 잘 나타냅니다.
Linked Issues check ✅ Passed 코드 변경사항이 연결된 이슈 #23의 목표(제미나이 요약 구현)를 충족합니다. Gemini API 클라이언트, 설정, 서비스, 컨트롤러 및 데이터베이스 매퍼가 모두 구현되었습니다.

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


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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 8

🤖 Fix all issues with AI agents
In `@src/main/java/com/ureca/unity/domain/gemini/dto/GeminiSummaryResponse.java`:
- Around line 7-13: GeminiSummaryResponse lacks a no-args constructor required
for Jackson deserialization; add Lombok's `@NoArgsConstructor` to the
GeminiSummaryResponse class (alongside the existing `@Getter`) so ObjectMapper can
instantiate it, or alternatively implement an explicit public no-argument
constructor in the GeminiSummaryResponse class; reference the class name
GeminiSummaryResponse and the annotation `@NoArgsConstructor` in your change.

In
`@src/main/java/com/ureca/unity/domain/gemini/service/GeminiSummaryService.java`:
- Around line 49-59: The parsing of Gemini responses in GeminiSummaryService
uses objectMapper.readTree(rawResponse) and directly calls .get(0) on the
"candidates" and "parts" arrays which can throw NPE/IndexOutOfBounds when Gemini
returns an empty or unexpected structure; update the extraction logic around
JsonNode root to defensively check that root.path("candidates") is an array and
has size()>0 and that its first element has "content" → "parts" array with
size()>0 before calling .get(0), and if any check fails handle it gracefully
(e.g., log the rawResponse/error and return an empty Optional or throw a
controlled exception) instead of allowing a raw NullPointerException. Ensure
these checks are applied to the code that builds the String text from the nested
nodes so the method fails safely when responses are missing expected fields.

In
`@src/main/java/com/ureca/unity/domain/summary/controller/SummaryController.java`:
- Line 19: Remove the leftover debug variable declaration "Long counselingId =
2L;" from SummaryController (it is unused) and rely on request.getCounselingId()
already used later; locate the unused symbol counselingId in the
SummaryController class and delete that single line so no unused local remains.

In
`@src/main/java/com/ureca/unity/domain/summary/dto/request/SummaryRequest.java`:
- Around line 5-11: The SummaryRequest class lacks a no-args constructor and
validation annotations needed for Jackson deserialization and Bean Validation:
add a default constructor (e.g., Lombok's `@NoArgsConstructor`) and optionally an
all-args constructor (`@AllArgsConstructor`) or builder, and annotate fields like
sttJobId, counselingId, userId with `@NotNull` and counselingText with `@NotBlank`
(from javax.validation or jakarta.validation) so Controller `@Valid` will enforce
input checks; keep existing getters (or add `@Data/`@Getter/@Setter) so Jackson
can populate fields during deserialization.

In `@src/main/java/com/ureca/unity/domain/summary/model/SummaryModel.java`:
- Line 11: SummaryModel 클래스의 필드명 오타(sttJodId)를 sttJobId로 변경하세요: 클래스 SummaryModel
내 필드명 sttJodId를 sttJobId로 바꾸고 이에 따른 getter/setter(또는 Lombok 어노테이션 사용 시 필드명만 수정),
생성자, equals/hashCode/toString 등 해당 필드 참조를 모두 갱신하며, 이 필드가 매핑되는 SummaryRequest,
SummaryMapper, Summary.xml 등 다른 파일의 속성명도 sttJobId와 일치하도록 수정하여 MyBatis 결과 바인딩이 정상
동작하도록 하세요.

In `@src/main/java/com/ureca/unity/domain/summary/service/SummaryService.java`:
- Around line 29-45: The code serializes geminiResult.getKeywords() and
getPoints() directly which yields the literal "null" when those fields are null;
before calling objectMapper.writeValueAsString in SummaryService (the block that
prepares keywordsJson and pointsJson before calling
summaryMapper.insertSummary), guard against null by substituting a stable empty
value (e.g., an empty List/array or empty string) for keywords and points when
geminiResult.getKeywords() or geminiResult.getPoints() is null, then serialize
that safe value so the DB does not receive the unwanted "null" string.
- Around line 18-58: The createSummary method lacks transactional boundaries
causing potential DB inconsistency around summaryMapper.insertSummary; annotate
SummaryService.createSummary (or the SummaryService class) with Spring's
`@Transactional` (import org.springframework.transaction.annotation.Transactional)
so the insertSummary call runs in a managed transaction, and include rollbackFor
= Exception.class if you need to roll back on checked exceptions; ensure the
service is a Spring bean so the annotation takes effect.

In `@src/main/resources/application.yml`:
- Around line 39-50: Remove the leftover Git merge markers (<<<<<<<, =======,
>>>>>>>) from application.yml and keep only the intended configuration entries;
decide whether the cors and cookie blocks (symbols: cors, allowed-origins,
cookie, secure) should be at the root or under a parent (e.g., springdoc) and
adjust indentation accordingly, then validate the YAML syntax so the file parses
and the application can start.
🧹 Nitpick comments (6)
src/main/java/com/ureca/unity/domain/gemini/config/GeminiConfig.java (1)

14-21: RestClient에 타임아웃 설정 추가를 권장합니다.

외부 API 호출 시 네트워크 지연이나 Gemini API 장애 상황에서 무한 대기를 방지하기 위해 connection timeout과 read timeout 설정이 필요합니다. Spring 6의 RestClient는 ClientHttpRequestFactory를 통해 타임아웃을 구성할 수 있습니다.

♻️ 타임아웃 설정 예시
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import java.time.Duration;

 `@Bean`
 public RestClient geminiRestClient() {
+    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
+    factory.setConnectTimeout(Duration.ofSeconds(10));
+    factory.setReadTimeout(Duration.ofSeconds(30));
+
     return RestClient.builder()
             .baseUrl("https://generativelanguage.googleapis.com")
+            .requestFactory(factory)
             .defaultHeader("Content-Type", "application/json")
             .defaultHeader("x-goog-api-key", apiKey)
             .build();
 }

Spring 공식 문서 참고: RestClient

src/main/resources/mapper/summary/Summary.xml (1)

8-30: 생성된 ID 반환 설정 추가를 권장합니다.

INSERT 후 생성된 summaryId를 반환받으면 후속 처리(응답 반환, 로깅 등)에 유용합니다. MyBatis의 useGeneratedKeys 속성을 활용하세요.

♻️ 수정 제안
-    <insert id="insertSummary">
+    <insert id="insertSummary" useGeneratedKeys="true" keyProperty="summaryId" keyColumn="summary_id">
         INSERT INTO summary (

단, 이 기능을 사용하려면 Mapper 메서드의 파라미터를 객체로 변경하거나 반환 타입을 조정해야 할 수 있습니다.

src/main/java/com/ureca/unity/domain/gemini/client/GeminiClient.java (2)

18-41: 외부 API 호출에 대한 에러 처리 개선이 필요합니다.

현재 모든 예외를 IllegalStateException으로 감싸고 있는데, 이는 디버깅 시 원인 파악을 어렵게 합니다. 특히 외부 API 호출에서는 네트워크 오류, 타임아웃, 4xx/5xx 응답 등 다양한 실패 유형이 있습니다.

개선 제안:

  1. 커스텀 예외 클래스를 생성하여 Gemini API 관련 오류를 명확히 구분
  2. HTTP 상태 코드에 따른 분기 처리 고려
  3. 재시도 로직 추가 검토 (Resilience4j 등)
♻️ 개선 예시
+// GeminiApiException.java 생성 권장
+public class GeminiApiException extends RuntimeException {
+    public GeminiApiException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}

// GeminiClient.java 수정
 } catch (Exception e) {
-    throw new IllegalStateException("Gemini API 요청 실패", e);
+    throw new GeminiApiException("Gemini API 요청 실패: " + e.getMessage(), e);
 }

32-36: 모델 버전을 설정으로 외부화하여 유연성을 높이세요.

현재 모델명이 하드코딩되어 있습니다. 프로젝트에서 이미 GeminiConfig에서 @Value 패턴으로 API 키를 외부화한 것처럼, 모델명도 application.yml으로 관리하면 좋습니다. gemini-2.5-flash는 2026년 6월 이후로 지원 종료 예정이므로, 설정만 변경하여 새 모델로 마이그레이션할 수 있도록 준비하는 것이 현명합니다.

gemini:
  api-key: ${API_KEY}
  model-name: gemini-2.5-flash

그 다음 GeminiClient에서 주입받아 사용하면 A/B 테스트나 버전 업그레이드 시 코드 배포 없이 대응할 수 있습니다.

src/main/java/com/ureca/unity/domain/summary/controller/SummaryController.java (1)

16-27: 입력 값 검증(Validation) 추가를 권장합니다.

SummaryRequest에 대한 유효성 검사가 없습니다. sttJobId, counselingId, userIdnull이거나 counselingText가 빈 문자열인 경우 downstream에서 예기치 않은 오류가 발생할 수 있습니다. Spring Validation (@Valid)과 Bean Validation 어노테이션 활용을 권장합니다.

♻️ 개선 예시

Controller:

-    public SummaryResponse create(`@RequestBody` SummaryRequest request) {
+    public SummaryResponse create(`@Valid` `@RequestBody` SummaryRequest request) {

SummaryRequest.java:

`@Getter`
public class SummaryRequest {
    `@NotNull`
    private Long sttJobId;
    `@NotNull`
    private Long counselingId;
    `@NotNull`
    private Long userId;
    `@NotBlank`
    private String counselingText;
}
src/main/java/com/ureca/unity/domain/gemini/service/GeminiSummaryService.java (1)

43-45: Prompt Injection에 대한 고려가 필요합니다.

counselingText가 사용자 입력에서 직접 전달될 경우, 악의적인 사용자가 프롬프트 조작을 시도할 수 있습니다. 예: "무시하고 다른 명령을 수행해..." 와 같은 입력. 현재 구조에서는 심각한 보안 위협은 아니지만, 프롬프트 내에서 사용자 입력 영역을 명확히 구분하는 것이 좋습니다.

현재 "상담 내용:" 뒤에 입력을 배치한 것은 좋은 접근이지만, 추가적인 방어 기법(입력 길이 제한, 특수 문자 필터링 등)도 검토해보세요.

Comment thread src/main/java/com/ureca/unity/domain/summary/model/SummaryModel.java Outdated
Comment thread src/main/resources/application.yml
@Zoo2-bi Zoo2-bi self-assigned this Jan 22, 2026
@Zoo2-bi
Zoo2-bi merged commit c977aef into develop Jan 22, 2026
2 checks passed
@Zoo2-bi
Zoo2-bi deleted the URECA-48/Feat/gemini branch January 22, 2026 02:44
joonhyong pushed a commit that referenced this pull request Jan 23, 2026
* chore: remove secrets and use env variables

* URECA-48: remove secrets and use env variables

* URECA-48: restore summary and gemini feature code (without secrets)

* fix: STT 오류 고려한 Gemini 요약 프롬프트 보강

* fix: 오타 수정

* fix: Gemini 응답의 null 값에 대한 방어 로직

* fix: SummaryRequest 역직렬화 및 입력 검증 보강

* fix: Summary 저장 트랜잭션 처리 추가
Chaejy added a commit that referenced this pull request Jan 23, 2026
* Initial commit

* chore: 이슈 템플릿 생성

* chore: jira user create

* chore: jira issue auto create

* chore: jira issue auto close

* chore: jira key auto prefix in commit&pr

This workflow automatically prefixes pull request titles and new commits with the Jira issue key extracted from the branch name.

* chore: GlobalExceptionHandler, ApiResponse 추가

* fix: auto jira key prefix

* fix: auto jira key prefix

* fix: auto jira key prefix

* fix: jira key auto setting on pr

* feat: Update code rabbit instruction

* fix: pr jira key prefix에 pr type 추가

* fix: create-jira-issue issue type auto setting

* fix: issue 양식 수정

Updated issue template title and branch description for clarity.

* [URECA-21] Chore: domain/auth 및 global/security 구조 정립 (#8)

* chore: domain/auth 구조 및 global/security 구조 분리

* chore: OAuth 공통부분 파일 작성

* chore: KakaoOAuthClient, GoogleOAuthClient 파일 생성

* chore: PR 템플릿 업로드

* chore: OAuthService 시그니처 변경, OAuthProvider Enum 도입, OAuthController 엔드포인트 정리, DTO 불변성 개선

* chore: OAuthController 입력 검증 추가, GlobalExceptionHandler 추가

* chore: GlobalExceptionHandler 에러 발생 시 내부 구현 노출 문제 및 로깅 누락 해결

* [URECA-27] Feat: Ureca 27/feat/oauth client (#14)

* Feat: User 엔티티 생성

* Feat OAuthClient 생성 및 Google, Kakao, Naver OAuthClient 구현

* Feat: OAuthServiceImpl 및 UserMapper.xml 구현 -> 로그인 요청 확인 및 DB 연동

* Fix: GoogleOAuthClient, NaverOAuthClient에 name에 대한 fallback 추가

* [URECA-29] Feat: JWT 기반 AccessToken/RefreshToken 발급/재발급 및 로그아웃 구현 (#17)

* Feat: User 엔티티 생성

* Feat OAuthClient 생성 및 Google, Kakao, Naver OAuthClient 구현

* Feat: OAuthServiceImpl 및 UserMapper.xml 구현 -> 로그인 요청 확인 및 DB 연동

* Fix: GoogleOAuthClient, NaverOAuthClient에 name에 대한 fallback 추가

* Fix: name처리

* Feat: WebMvcConfig 추가 - CORS 설정

* Feat: JWT 발급 로직 구현

* Feat: JWT 발급 로직 구현

* Feat: JWT 검증: JWT 인증 필터 및 보안 설정 적용

* Feat: JWT 검증: JWT 인증 필터 및 보안 설정 적용

* Feat: JWT 인증 예외 401로 정리 + RefreshToken 설계/저장

* Feat: refresh api 구현

* Feat: 리프레쉬토큰 DB 저장 및 RefreshTokenMapper에 resultMap 적용

* Feat: Refresh Rotation 구현

* Feat: 로드아웃 구현

* Docs: .coderabbit.yaml 파일 수정

* Fix: JJWT 버전 수정 및 의ì¡올바르지 않은 ´ì  의존성 제거

* Fix: 쿠키 보안 설정 개선 및 SameSite 속성 추가

* Fix: 로그아웃 엔드포인트 보호 추가 및 로그아웃 서비스 레이어 결합도 제거

* Fix: ãrefreshtoken을 body로 부터 분리

* Fix: ãrefreRefreshTokenServiceImpl 수정

* Fix CookieUtils 유틸 분리

* Fix: 사ìChore하지 않는 import 정리

* Fix RefreshTokenServiceImpl 죽은 코드 제거 및 jjwt 버전 업그레이드

* Fix: 모든 쿠키 생성/삭제 로직을 CookieUtils로 통일

* Fix: Nitpick Comment 정리

* Fix: OAuthServiceImpl 패키지 헬퍼 메소드 분리

* Fix: JWT 서명 검증 먼저하도록 수정

* Fix: userId 변수 중복 선언 수정

* Fix: Refresh Token Rotation에서 Race Condition 해소

* Chore: 들여쓰기 수정

* Fix: 예외사항 범위 확장

* Fix: DB/JWT 시간 통일 및 Access/Refresh Token 타입 Claim 분리

* Fix: REFRESH_TOKEN_INVALID 적용 범위 확장

* [URECA-29] Feat: 스프링, 그래들 버전 다운그레이드 (#20)

* Feat: User 엔티티 생성

* Feat OAuthClient 생성 및 Google, Kakao, Naver OAuthClient 구현

* Feat: OAuthServiceImpl 및 UserMapper.xml 구현 -> 로그인 요청 확인 및 DB 연동

* Fix: GoogleOAuthClient, NaverOAuthClient에 name에 대한 fallback 추가

* Fix: name처리

* Feat: WebMvcConfig 추가 - CORS 설정

* Feat: JWT 발급 로직 구현

* Feat: JWT 발급 로직 구현

* Feat: JWT 검증: JWT 인증 필터 및 보안 설정 적용

* Feat: JWT 검증: JWT 인증 필터 및 보안 설정 적용

* Feat: JWT 인증 예외 401로 정리 + RefreshToken 설계/저장

* Feat: refresh api 구현

* Feat: 리프레쉬토큰 DB 저장 및 RefreshTokenMapper에 resultMap 적용

* Feat: Refresh Rotation 구현

* Feat: 로드아웃 구현

* Docs: .coderabbit.yaml 파일 수정

* Fix: JJWT 버전 수정 및 의ì¡올바르지 않은 ´ì  의존성 제거

* Fix: 쿠키 보안 설정 개선 및 SameSite 속성 추가

* Fix: 로그아웃 엔드포인트 보호 추가 및 로그아웃 서비스 레이어 결합도 제거

* Fix: ãrefreshtoken을 body로 부터 분리

* Fix: ãrefreRefreshTokenServiceImpl 수정

* Fix CookieUtils 유틸 분리

* Fix: 사ìChore하지 않는 import 정리

* Fix RefreshTokenServiceImpl 죽은 코드 제거 및 jjwt 버전 업그레이드

* Fix: 모든 쿠키 생성/삭제 로직을 CookieUtils로 통일

* Fix: Nitpick Comment 정리

* Fix: OAuthServiceImpl 패키지 헬퍼 메소드 분리

* Fix: JWT 서명 검증 먼저하도록 수정

* Fix: userId 변수 중복 선언 수정

* Fix: Refresh Token Rotation에서 Race Condition 해소

* Chore: 들여쓰기 수정

* Fix: 예외사항 범위 확장

* Fix: DB/JWT 시간 통일 및 Access/Refresh Token 타입 Claim 분리

* Fix: REFRESH_TOKEN_INVALID 적용 범위 확장

* fix: spring, gradle 버전 다운그레이드

* [URECA-41] Feat: Stt 구현 (#22)

* feat: stt 1차 짧은 대화 성공

* fix: stt m4a to wav convert 추가

---------

Co-authored-by: 40food <40food@naver.com>

* [URECA-48] Feat: 제미나이 요약 (#24)

* chore: remove secrets and use env variables

* URECA-48: remove secrets and use env variables

* URECA-48: restore summary and gemini feature code (without secrets)

* fix: STT 오류 고려한 Gemini 요약 프롬프트 보강

* fix: 오타 수정

* fix: Gemini 응답의 null 값에 대한 방어 로직

* fix: SummaryRequest 역직렬화 및 입력 검증 보강

* fix: Summary 저장 트랜잭션 처리 추가

* [URECA-49] Feat: DB 수정 반영 (#26)

* fix: jwt필터에서 logout엔드í �¬인트 제거

* fix: users 테이블 관련 수정

* fix: refresh_tokens 테이블 관련 수정

* feat: 카카오 로그인 시 이메일, 닉네임 저장 가능하도록 ì수정

* fix: 쿠키 path 수정

* feat: me api 구현 - 2차 라우트 로직에 쓰임

* fix: 로그아웃 api 호출을 위한 JwtFilter 스킵 및 SecurityConfig 허용

* feat: withdrawal api 구현

* chore: .gitignore에 stt.json 파일 추가

* fix: .gitignore에 stt.json파일 추가 및 ì¿빈 쿠키 오탐 수정

* feat: 탈퇴 회원 재가입 기능 구현

---------

Co-authored-by: 박승연 <70251709+40food@users.noreply.github.com>
Co-authored-by: Jiyeon <144954836+Chaejy@users.noreply.github.com>
Co-authored-by: 박주이 <bagjui068@gmail.com>
Co-authored-by: 40food <40food@naver.com>
joonhyong added a commit that referenced this pull request Jan 26, 2026
* Initial commit

* chore: 이슈 템플릿 생성

* chore: jira user create

* chore: jira issue auto create

* chore: jira issue auto close

* chore: jira key auto prefix in commit&pr

This workflow automatically prefixes pull request titles and new commits with the Jira issue key extracted from the branch name.

* chore: GlobalExceptionHandler, ApiResponse 추가

* fix: auto jira key prefix

* fix: auto jira key prefix

* fix: auto jira key prefix

* fix: jira key auto setting on pr

* feat: Update code rabbit instruction

* fix: pr jira key prefix에 pr type 추가

* fix: create-jira-issue issue type auto setting

* fix: issue 양식 수정

Updated issue template title and branch description for clarity.

* [URECA-21] Chore: domain/auth 및 global/security 구조 정립 (#8)

* chore: domain/auth 구조 및 global/security 구조 분리

* chore: OAuth 공통부분 파일 작성

* chore: KakaoOAuthClient, GoogleOAuthClient 파일 생성

* chore: PR 템플릿 업로드

* chore: OAuthService 시그니처 변경, OAuthProvider Enum 도입, OAuthController 엔드포인트 정리, DTO 불변성 개선

* chore: OAuthController 입력 검증 추가, GlobalExceptionHandler 추가

* chore: GlobalExceptionHandler 에러 발생 시 내부 구현 노출 문제 및 로깅 누락 해결

* [URECA-27] Feat: Ureca 27/feat/oauth client (#14)

* Feat: User 엔티티 생성

* Feat OAuthClient 생성 및 Google, Kakao, Naver OAuthClient 구현

* Feat: OAuthServiceImpl 및 UserMapper.xml 구현 -> 로그인 요청 확인 및 DB 연동

* Fix: GoogleOAuthClient, NaverOAuthClient에 name에 대한 fallback 추가

* [URECA-29] Feat: JWT 기반 AccessToken/RefreshToken 발급/재발급 및 로그아웃 구현 (#17)

* Feat: User 엔티티 생성

* Feat OAuthClient 생성 및 Google, Kakao, Naver OAuthClient 구현

* Feat: OAuthServiceImpl 및 UserMapper.xml 구현 -> 로그인 요청 확인 및 DB 연동

* Fix: GoogleOAuthClient, NaverOAuthClient에 name에 대한 fallback 추가

* Fix: name처리

* Feat: WebMvcConfig 추가 - CORS 설정

* Feat: JWT 발급 로직 구현

* Feat: JWT 발급 로직 구현

* Feat: JWT 검증: JWT 인증 필터 및 보안 설정 적용

* Feat: JWT 검증: JWT 인증 필터 및 보안 설정 적용

* Feat: JWT 인증 예외 401로 정리 + RefreshToken 설계/저장

* Feat: refresh api 구현

* Feat: 리프레쉬토큰 DB 저장 및 RefreshTokenMapper에 resultMap 적용

* Feat: Refresh Rotation 구현

* Feat: 로드아웃 구현

* Docs: .coderabbit.yaml 파일 수정

* Fix: JJWT 버전 수정 및 의ì¡올바르지 않은 ´ì  의존성 제거

* Fix: 쿠키 보안 설정 개선 및 SameSite 속성 추가

* Fix: 로그아웃 엔드포인트 보호 추가 및 로그아웃 서비스 레이어 결합도 제거

* Fix: ãrefreshtoken을 body로 부터 분리

* Fix: ãrefreRefreshTokenServiceImpl 수정

* Fix CookieUtils 유틸 분리

* Fix: 사ìChore하지 않는 import 정리

* Fix RefreshTokenServiceImpl 죽은 코드 제거 및 jjwt 버전 업그레이드

* Fix: 모든 쿠키 생성/삭제 로직을 CookieUtils로 통일

* Fix: Nitpick Comment 정리

* Fix: OAuthServiceImpl 패키지 헬퍼 메소드 분리

* Fix: JWT 서명 검증 먼저하도록 수정

* Fix: userId 변수 중복 선언 수정

* Fix: Refresh Token Rotation에서 Race Condition 해소

* Chore: 들여쓰기 수정

* Fix: 예외사항 범위 확장

* Fix: DB/JWT 시간 통일 및 Access/Refresh Token 타입 Claim 분리

* Fix: REFRESH_TOKEN_INVALID 적용 범위 확장

* [URECA-29] Feat: 스프링, 그래들 버전 다운그레이드 (#20)

* Feat: User 엔티티 생성

* Feat OAuthClient 생성 및 Google, Kakao, Naver OAuthClient 구현

* Feat: OAuthServiceImpl 및 UserMapper.xml 구현 -> 로그인 요청 확인 및 DB 연동

* Fix: GoogleOAuthClient, NaverOAuthClient에 name에 대한 fallback 추가

* Fix: name처리

* Feat: WebMvcConfig 추가 - CORS 설정

* Feat: JWT 발급 로직 구현

* Feat: JWT 발급 로직 구현

* Feat: JWT 검증: JWT 인증 필터 및 보안 설정 적용

* Feat: JWT 검증: JWT 인증 필터 및 보안 설정 적용

* Feat: JWT 인증 예외 401로 정리 + RefreshToken 설계/저장

* Feat: refresh api 구현

* Feat: 리프레쉬토큰 DB 저장 및 RefreshTokenMapper에 resultMap 적용

* Feat: Refresh Rotation 구현

* Feat: 로드아웃 구현

* Docs: .coderabbit.yaml 파일 수정

* Fix: JJWT 버전 수정 및 의ì¡올바르지 않은 ´ì  의존성 제거

* Fix: 쿠키 보안 설정 개선 및 SameSite 속성 추가

* Fix: 로그아웃 엔드포인트 보호 추가 및 로그아웃 서비스 레이어 결합도 제거

* Fix: ãrefreshtoken을 body로 부터 분리

* Fix: ãrefreRefreshTokenServiceImpl 수정

* Fix CookieUtils 유틸 분리

* Fix: 사ìChore하지 않는 import 정리

* Fix RefreshTokenServiceImpl 죽은 코드 제거 및 jjwt 버전 업그레이드

* Fix: 모든 쿠키 생성/삭제 로직을 CookieUtils로 통일

* Fix: Nitpick Comment 정리

* Fix: OAuthServiceImpl 패키지 헬퍼 메소드 분리

* Fix: JWT 서명 검증 먼저하도록 수정

* Fix: userId 변수 중복 선언 수정

* Fix: Refresh Token Rotation에서 Race Condition 해소

* Chore: 들여쓰기 수정

* Fix: 예외사항 범위 확장

* Fix: DB/JWT 시간 통일 및 Access/Refresh Token 타입 Claim 분리

* Fix: REFRESH_TOKEN_INVALID 적용 범위 확장

* fix: spring, gradle 버전 다운그레이드

* [URECA-41] Feat: Stt 구현 (#22)

* feat: stt 1차 짧은 대화 성공

* fix: stt m4a to wav convert 추가

---------

Co-authored-by: 40food <40food@naver.com>

* [URECA-48] Feat: 제미나이 요약 (#24)

* chore: remove secrets and use env variables

* URECA-48: remove secrets and use env variables

* URECA-48: restore summary and gemini feature code (without secrets)

* fix: STT 오류 고려한 Gemini 요약 프롬프트 보강

* fix: 오타 수정

* fix: Gemini 응답의 null 값에 대한 방어 로직

* fix: SummaryRequest 역직렬화 및 입력 검증 보강

* fix: Summary 저장 트랜잭션 처리 추가

* [URECA-49] Feat: DB 수정 반영 (#26)

* fix: jwt필터에서 logout엔드í �¬인트 제거

* fix: users 테이블 관련 수정

* fix: refresh_tokens 테이블 관련 수정

* feat: 카카오 로그인 시 이메일, 닉네임 저장 가능하도록 ì수정

* chore: ErrorCode 확장

* feat: OAuthToken 도메인 추가

* feat: provider 토큰 저장하도록 로직 수정

* feat: provideP unlink/revoke 클라이언트 추가

* feat: 기존 회원탈퇴 로직에 unlink, 토큰삭제 넣기

* feat: 재가입 회원도 requireOnboarding 값을 true로 받도록 수정

* fix: unlink 어노테이션 수정

* fix: 복원된 사용자 인메모리 상태 동기화 수정

* fix: 마이너 리뷰 수정

* fix: provider 검증 추가

* fix: ãunlink를 트랜잭션 밖으로 분리하ê

* fix: RestTemplate 타임아웃 설정

* fix: RestTemplate 타임아웃 설정

* feat: TypeHandler를 통해 OAuthToken 암호화

* fix: TImeTemplate을 의존성 주입으로 변경 및 oauth_tokens expires_at 컬럼 시간대 통일

* fix: 코드 래빗 리뷰 수정 및 oauth

* fix: oauth_tokens expires_at 컬럼 시간대 KST로 변경

* fix: ErrorCode 문구 수정

---------

Co-authored-by: 박승연 <70251709+40food@users.noreply.github.com>
Co-authored-by: Jiyeon <144954836+Chaejy@users.noreply.github.com>
Co-authored-by: 박주이 <bagjui068@gmail.com>
Co-authored-by: 40food <40food@naver.com>
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.

[URECA-48] Feat: 제미나이 요약

3 participants