[URECA-48] Feat: 제미나이 요약 - #24
Conversation
|
Warning Rate limit exceeded
⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the 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. 📝 WalkthroughWalkthroughGemini 기반 요약 기능이 추가되었습니다. 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)
✅ Passed checks (3 passed)
✏️ 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. Comment |
There was a problem hiding this comment.
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 응답 등 다양한 실패 유형이 있습니다.개선 제안:
- 커스텀 예외 클래스를 생성하여 Gemini API 관련 오류를 명확히 구분
- HTTP 상태 코드에 따른 분기 처리 고려
- 재시도 로직 추가 검토 (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,userId가null이거나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가 사용자 입력에서 직접 전달될 경우, 악의적인 사용자가 프롬프트 조작을 시도할 수 있습니다. 예:"무시하고 다른 명령을 수행해..."와 같은 입력. 현재 구조에서는 심각한 보안 위협은 아니지만, 프롬프트 내에서 사용자 입력 영역을 명확히 구분하는 것이 좋습니다.현재 "상담 내용:" 뒤에 입력을 배치한 것은 좋은 접근이지만, 추가적인 방어 기법(입력 길이 제한, 특수 문자 필터링 등)도 검토해보세요.
* 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 저장 트랜잭션 처리 추가
* 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>
* 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>
Key Changes
작업 내역
💬 공유사항 to 리뷰어
비고
Summary by CodeRabbit
새로운 기능
개선사항
주의
✏️ Tip: You can customize this high-level summary in your review settings.