Conversation
feat(user): User 엔티티 구현
fix: domain 디렉토리 경로 수정
추가적으로 CorsProperties 클래스 추가하여 cors 설정을 yml에서 할 수 있도록 함
application-local.yml에 allowed-origins 설정 추가
JWT(Access Token) 생성/검증, 예외처리, 에러 응답처리, Spring Security 필터 체인 구성
feat(auth): JWT 인증 시스템 구현
Random Opaque Token 방식을 사용하여 생성했고 jwt가 아니기 때문에 JwtProperties에서 TokenProperties으로 리펙토링
구현 방식보다 역할 중심으로 네이밍 변경
feat(auth): Refresh Token 인증 구현
불필요한 .env 파일 import 제거
DB_USER에서 DB_USERNAME으로 수정
현재 서버가 살아 있는지를 확인하기 위한 용도
ExceptionController에서 공통 포맷(ErrorResponse)으로 에러 응답을 처리하도록 변경
* feat(infra): OAuth2 설정 및 WebClient 구성
WebClient 의존성 및 Bean 구성, 네이버/구글 관련 yml 설정 및 Properties 추가
* feat(auth): OAuth2 Client Infra 구현
NaverOAuth2Client, GoogleOAuth2Client에서 URL 생성, 토큰 발급, 사용자 정보 조회, 인증 서버 사이에서 발생할 수 있는 예외를 처리했고
StateManager에서 authorization code 노출로 인한 CSRF 방지
* feat(user): 소셜로그인 사용자 생성, 조회
createSocialUser, findByProviderAndProviderId 메서드 작성
* refactor(auth): RefreshTokenPair 구조 개선
사용성을 늘리기 위해 inner record인 RefreshTokenPair를 별도 클래스로 분리
* feat(user): UserRepository existsByEmail 메서드 추가
* feat(auth): Cookie 관리 기능 추가
CookieManager 클래스에서 쿠키 생성/삭제/추출, 환경별 쿠키 보안 설정 추가 (application.yml, application-local.yml)
* feat(auth): OAuth2 인증 서비스 및 API 구현
OAuth2Service에서 Authorization Code Flow 구현, TokenService에서 토큰 발급/재발급/삭제 구현, AuthController에서
/{provider}/url, /{provider}/login, /refresh, /logout 엔드포인트 구현
* refactor(infra): 환경별 OAuth2 설정 분리
application.yml에서 OAuth2 공통 설정 제거하고 application-local.yml, application-dev.yml에 환경별 OAuth2 설정 추가
* refactor(auth): OAuth2Provider 메서드 추가 및 쿠키 관리 개선
OAuth2LoginRequest에 @notblank validation 추가, DTO 패키지 request/response 패키지로 세분화, OAuth2Provider에
fromString() 메서드 추가, 중복로직 제거를 위해 CookieManager 리팩토링
* refactor(user): 불필요한 어노테이션 제거
UserRepository에 동작에 영향을 주지 않는 @query 어노테이션 제거
* ci: OAuth2 환경변수 추가
네이버/구글 OAuth2 클라이언트 정보 추가
* refactor(auth): AuthController request에 @Valid 어노테이션 추가
* refactor(auth): Swagger 문서화 및 signupStatus 응답 추가
AuthController에 Swagger 어노테이션 추가, TokenResponse에 signupStatus 필드 추가하여 프론트엔드에서 사용자 가입 상태 확인 가능, 응답 구조
변경으로 인해 TokenService의 TokenBundle에 signupStatus 추가
* refactor(auth): Swagger 문서화 및 예외 처리 개선
OAuth2Provider에서 IllegalArgumentException 대신 BadRequestException 사용, ErrorResponse에 Swagger 어노테이션
추가, ExceptionController에 OAuth2Exception 핸들러 추가
* feat(auth): 프론트엔드 서버 CORS 설정 및 권한 제어 개선
application-dev.yml에 FRONTEND_SERVER_URL 환경변수 추가, GitHub Actions도 최신화 완료,
.anyRequest().authenticated() 제거 후 메서드 레벨 어노테이션으로 권한 제어
* refactor(auth): Controller 어노테이션 순서 변경
* feat(global): ApiResponse 통일 규격 적용 ApiResponseDto와 ApiResponseEntity 클래스 구현 * refactor: ApiResponse 통일 규격 적용에 따른 기존 코드 리팩토링
* refactor(global): JPA Base Entity 상속 구조 재설계 기존에 CreatedAtOnly와 Auditable이 서로 독립적으로 정의되어 있어, createdAt 필드 및 @PrePersist 로직이 중복되는 문제가 있어 이를 해결하고 엔티티 성격에 따라 필요한 기능만 선택적으로 상속받을 수 있도록 구조를 개선 * feat(user): User 엔티티 변경 Setter를 도메인 메소드로 대체, 프로필 이미지 관련 필드 추가, registeredAt 필드 추가 등 * refactor(global): JPA Base Entity 클래스들의 이름 변경
* feat(auth): SocialAccount 엔티티 구현 User와 소셜 로그인 provider을 맵핑하고, 소셜 서비스의 refresh token을 저장 및 관리하는 엔티티 및 테이블을 따로 둠 * refactor(auth): User 엔티티에서 소셜 계정 정보 분리 SocialAccount 엔티티 추가에 따라 User에서 provider와 provider_id 관련 로직 모두 분리하고 소셜 로그인 유저 생성할 때 User 생성 후 SocialAccount 생성 --------- Co-authored-by: 1Seob <moon27456@naver.com>
* feat(auth): 로컬 테스트용 더미 유저 로그인 기능 구현 * feat(user): 나의 프로필 조회 API 구현 로그인한 사용자의 프로필 정보를 조회하는 api
이전 마이그레이션을 진행하면서 provider와 provider_id 칼럼이 제거된 User 삭제
환경 별로 same-site를 공통은 Lax, local은 Lax, dev는 None으로 설정, CookieManager에서 이 값을 받아서 사용할 수 있도록 수정
* feat(user): 프로필 이미지 업로드 PresignedURL 생성 API 구현 * feat(user): 프로필 이미지 삭제 api 구현 * ci(infra): dev 배포 스크립트에 새 환경변수들 추가
기존 쿼리에서 LOWER() 함수를 추가, index 추가로 검색 성능 최적화
구글은 prompt=select_account 파라미터 추가, 네이버는 auth_type=reauthenticate 파라미터 추가
* ci(infra): 운영 서버 CI/CD Github Workflow 스크립트 작성 * refactor(infra): 개발 서버에만 적용되던 @Profile 확장 "dev" -> {"dev", "prod"} * chore(infra): application-prod.yml 설정 파일 추가 운영 서버용 설정 파일
HomeResponse에 answeredFriendProfiles, answeredFriendCount 필드 추가, HomeQueryService에 조건에 맞는 친구 프로필 조회 로직 구현, AnswerEntryQueryRepository에 쿼리 추가
* ci(global): Google Android Client ID 설정 추가 application-*.yml에 android-client-id 설정 추가, GitHub Actions 스크립트에 GOOGLE_ANDROID_CLIENT_ID 환경변수 주입, GoogleProperties에 androidClientId 필드 추가 * feat(auth): Google ID Token 검증 기능 추가 GoogleOAuth2Client에 ID Token 검증 메서드 구현, tokeninfo API 응답 DTO로 GoogleIdTokenInfoResponse 추가 * refactor(auth): 소셜 계정 공통 로직 분리 사용자 조회/생성/복구, 신규 사용자 생성, 탈퇴 계정 자동 복구와 관련된 공통 로직을 SocialAccountService로 모두 분리, 기존 웹 소셜 로그인 서비스 클래스인 SocialAuthService도 이제 SocialAccountService 사용하도록 리팩토링 * feat(auth): Native SDK 소셜 로그인 서비스 구현 NativeAuthService로 구글은 Google ID Token 검증 후 로그인/회원가입하고, 네이버는 Naver Access Token으로 사용자 조회 후 로그인/회원가입하도록 구현, POST /api/v1/auth/google/native-login, POST /api/v1/auth/naver/native-login 엔드포인트 구현 * fix(infra): Testcontainers 2.0.3으로 업그레이드 Docker 29.x 호환성 문제 해결을 위해 testcontainers-bom 2.0.3 적용
* feat(ai): Gradle 의존성 추가 - Claude, Gemini * feat(ai): application.yml에 클로드, 제미나이 관련 부분 추가 * feat(ai): LlmRouter, LlmClientsConfig 클래스 구현 * feat(ai): LlmRouter 클래스 구현 provider → ChatClient 매핑 * feat(global): Llm Rewrite 관련 에러 코드 추가 * feat(ai): LlmClient 클래스들 수정 다중 프로바이더 옵션 분기를 통해 여러 AI 모델의 API 활용 * ci(infra): 배포 워크플로우 스크립트에 Gemini, Claude API key 환경변수 추가
…dayQuestion 메소드 수정 (#103) 오늘의 질문 리롤 시 유저의 관심 주제 내에서만 다시 선택
* refactor(ai): WeeklyReportLlmClient.rewriteOne 메소드의 프롬프트 보완 입력 말투가 반말/해체인 경우에 교정하도록 보완 * refactor(ai): WeeklyReportGenerationListener의 MAX_LEN 값 수정 240 -> 245 * refactor(report): MonthlyReportGenerationListener의 MAX_LEN 값 수정 240 -> 245 * feat(report): 월간 리포트에 멀티 프로바이더 라우팅 및 2-pass rewrite 설계 적용
* ci(global): 카카오 OAuth 설정 및 CI/CD 환경 변수 추가 application-*.yml local/dev/prod에 카카오 OAuth 설정 추가, GitHub Actions dev/prod 스크립트에 카카오 환경 변수 추가, KakaoProperties OAuth 설정 바인딩 클래스 추가 * feat(auth): OAuth2Provider와 ProviderType에 KAKAO 추가 추가적으로 enum 순서 알파벳순으로 통일 * feat(auth): 카카오 OAuth2Client 및 DTO 구현 KakaoOAuth2Client에 Authorization URL 생성, Access Token 발급, 사용자 정보 조회, 앱 키 검증 (Native SDK용) 관련 로직 구현, 관련 3가지 DTO 추가 * feat(auth): 카카오 로그인 Service 및 API 엔드포인트 추가 NativeAuthService의 executeKakaoLogin 메서드로 Native SDK 로그인 처리, 웹 소셜 로그인의 경우 네이버와 구글 방식과 동일하므로 switch문으로 분기, GET /api/v1/auth/kakao/url, POST /api/v1/auth/kakao/login, POST /api/v1/auth/kakao/native-login 엔드포인트 추가 * fix(auth): 구글 ID Token audience 검증 수정 aud 검증 시 Web Client ID 사용 * refactor(auth): 소셜 로그인 이메일 중복 시 제공자별 에러 메시지 개선 다른 로그인 방식을 사용해주세요에서 이제는 네이버 계정으로 가입된 이메일입니다. 네이버로 로그인해주세요로 변경
* feat(report): analysis_types 테이블 생성 및 AnalysisType 엔티티 구현 테이블 시드 포함 * feat(report): overall_reports 테이블 생성 및 OverallReport 엔티티 구현 * feat(report): 리포트 생성에 필요한 dto 클래스들 구현 * feat(report): 주간/월간 리포트 레포지토리에 메소드 구현 특정 시점 이전에 완료된 리포트들을 조회 * feat(report): overall_reports 테이블 및 OverallReport 엔티티 수정 * feat(report): OverallDailyEntryQueryRepository 클래스 구현 리포트 생성에 필요한 데이터를 조회하는 레포지토리 * feat(report): dto 클래스들 변경 * refactor(report): 명칭을 OverallReport에서 TypeReport로 수정 * feat(report): TypeEvidenceCardPromptLoader 인터페이스 및 구현체들 구현 * feat(report): EvidenceEntriesAssembler 클래스 구현 입력 entries 문자열 조립기 * feat(report): 임시 커밋 * refactor(db): 유형 리포트 관련 마이그레이션 sql 파일명 변경 가장 최근 순서로 이동 * feat(ai): Evidence Card 생성 관련 에러 코드 추가 * feat(ai): TypeEvidenceCardLlmClient 클래스 수정 멀티 프로바이더 라우팅 적용 및 에러 처리 * feat(ai): TypePatternExtractPromptLoader 인터페이스 및 구현체들 구현 * feat(ai): 패턴 추출 로직 구현 TypePatternExtractLlmClient, PatternExtractionSevice 클래스 구현 * feat(ai): TypeSelectPromptLoader 인터페이스 및 구현체들 구현 * feat(ai): 유형 선택 로직 구현 TypeSelectionInputAssembler, TypeSelectLlmClient, TypeSelectionService 클래스 구현 * feat(ai): TypeReportPromptLoader 인터페이스 및 구현체들 구현 * feat(ai): 유형 분석 리포트 생성 로직 구현 TypeReportInputAssembler, TypeReportLlmClient, TypeReportContentGenerationService 클래스 구현 * feat(ai): PendingTypeReportSerivce, TypeReportRepository 클래스 구현 * feat(ai): TypeReportTxService 클래스 구현 * feat(ai): TypeReportTxService 클래스 구현 * feat(ai): TypeReportService 클래스 구현 * feat(ai): TypeReportController 클래스 구현 * feat(ai): 나의 유형 리포트 단읠 조회 api 구현 * feat(ai): 테스트용 유형 리포트 삭제 api 구현 * feat(ai): 나의 유형 리포트 통합 조회 api 구현 * feat(ai): 리포트 재생성 시 기존 COMPLETED 리포트를 soft delete하는 로직 구현 * feat: 조회 메소드 개선 * feat(ai): 유형 리포트 단일 조회 api 개선 Dto에 현재 데이터를 포함하여 신규 리포트 생성 중 여부/생성 조건 충족 여부 관련 Dto 포함 * feat(ai): 단일/통합 조회 응답에서 생성 중인 리포트의 상태를 객체화 IN_PROGRESS, FAILED, NONE의 status 및 reportId 포함 * feat(ai): 특정 관심 주제에 대한 유형 리포트 최초 무료 1회 생성 로직 구현 * docs(ai): Swagger 문서화 개선
* feat(report): 일간 리포트의 날짜 경계 엣지 케이스 처리 로직 구현 n일에 할당된 오늘의 질문에 대한 답변이 n+1일에 제출된 경우 * refactor(report): AnswerEntryService, PendingDailyReportService의 조회 로직 변경 createdAt 시간 범위(Range) 기반 조회 -> 비즈니스 날짜(Date) 필드 기반 조회 * refactor(report): QuestionCommandService의 조회 로직 변경 createdAt 시간 범위(Range) 기반 조회 -> 비즈니스 날짜(Date) 필드 기반 조회
DailyReport -> AnswerEntry -> DailyQuestion을 명시적으로 join하고, DailyQuestion.interest는 left join으로 변경해 path-expression의 암묵적 inner join로 인한 누락을 방지
* feat(global): 공통 DTO 구현 Hypersistence Utils 의존성도 추가 * feat(global): ReportContentFactory 클래스 구현 PENDING 리포트용 빈 content 제공 목적 * feat(report): weekly_reports, monthly_reports 테이블에 content 컬럼 추가 jsonb * feat(report): WeeklyReport 엔티티 수정 * feat(ai): WeeklyReportLlmClient 클래스 수정 * feat(report): DB 저장 및 조회 코드 수정 * feat(ai): MonthlyReportLlmClient 클래스 수정 * feat(report): MonthlyReport 엔티티 클래스 수정 * feat(report): weekly_reports 레코드 DB 저장 및 조회 로직 변경 * refactor(ai): WeeklyReportLlmClient 수정 rewriteStyled의 LLM 모델을 GEMINI로 변경 * refactor(report): WeeklyReport/MonthlyReport 조회 API의 Swagger 문서 개선
수정/삭제/신규 시드 적용
* feat(db): summary 컬럼 추가 Flyway DDL 컬럼 추가 + 기존 레코드 backfill + NOT NULL * feat(report): ReportContent, ReportContentFactory 수정 * feat(report): LlmResultDto 및 WeeklyReport 엔티티 수정 * feat(ai): WeeklyReportLlmClient 수정 * feat(report): 주간 리포트 생성 로직 수정 * feat(report): 주간 리포트 조회 로직 수정 * feat(report): MonthlyReport 엔티티 수정 * feat(ai): MonthlyReportLlmClient 수정 * feat(report): 월간 리포트 생성 및 조회 로직 수정
* feat: DailyStatsRepository 구현 * feat: 일간 통계 페이지 구현 * feat: TotalStatsRepository 구현 * feat: 전체 통계 페이지 구현 * feat: 서버 상태 뱃지 추가
* feat(infra): FCM 푸시 알림 기본 인프라 및 Firebase 설정 Firebase Admin SDK 9.7.1 의존성, 환경 변수 Base64 방식의 FirebaseConfig 구현, CI/CD에 FIREBASE_ADMIN_KEY 환경 변수 추가 # Conflicts: build.gradle * feat(notify): 알림 도메인 엔티티 및 마이그레이션 추가 Notification, NotificationSetting, UserDevice 엔티티 추가 및 마이그레이션 추가 * feat(notify): 알림 도메인 리포지토리 추가 상태 기반 처리를 위한 쿼리들에 대해 원자성을 보장하기 위해 더티체킹보다는 조건부 쿼리를 이용, Modifying 어노테이션을 이용한 배치 쿼리 추가 * feat(global): 비동기 관련 AsyncConfig 코드 추가 및 fcm 관련 errorcode, 예외 추가 * feat(notify): FCM 인프라 및 이벤트 기반 발송 구현 FCM 배치 발송 및 Invalid Token 자동 정리, 이벤트 기반 즉시 발송, fcm 호출과의 트랜잭션 분리로 db 커넥션 확보, fcmsent 필드 이용 중복 발송 방지 * feat(notify): 스케줄러 기반 재시도 및 최적화 PENDING/FAILED 재시도 (Exponential Backoff), SENDING 타임아웃 복구 (fcmSent 체크), 조건부 update로 동시성 제어 * feat(notify): 알림 기능 Service 및 API 계층 구현 알림 생성, 읽음, 삭제 API, 알림 설정 관리 API, 토큰 등록/삭제 API, 테스트 알림 발송 API 구현 완료 * feat(global): 알림 메시지 템플릿 관리 시스템 구현 YAML 기반 메시지 템플릿 관리, 환경별 로딩 전략 (Local: 파일, Dev/Prod: 환경변수 Base64), NotificationMessageFactory로 템플릿 파싱 및 파라미터 치환, CI/CD 스크립트에 환경변수 추가 * feat(notify): 친구 요청/수락 알림 이벤트 기반 구현 Friend 이벤트 정의 및 발행, FriendNotificationEventListener로 알림 생성 * feat(notify): 주간/월간/유형 리포트 완성, 제작 가능 이벤트, 스케줄러 기반 구현 기존 로직과 새로운 로직 모두 비동기 방식으로 변경, 필요한 쿼리 추가 * feat(notify): 미답변 사용자 푸시 알림 스케줄러 구현 매일 밤 22시 2일 이상 미답변 사용자에게 푸시 알림 발송, 알림 테이블 저장x, 메모리 기반 중복 방지, fcmclient 직접 호출, 필요한 쿼리 추가 * feat(notify): 일일 작성 알림 스케줄러 구현 매분 실행, 사용자 설정 시간(분 단위)에 정확히 푸시 발송, 알림 테이블에 저장x, 필요한 쿼리 추가 * fix(notify): NotificationRecoveryScheduler 순환 참조 문제 해결 트랜잭션 제거 후 NotificationTransactionHelper에게 트랜잭션 위임 * feat(global): 알림 메시지 템플릿 업데이트 주간 리포트 제작 가능 알림 문구 수정, NotificationMessageFactory에 랜덤 메시지 선택 로직 추가, 템플릿 로드/검증 성공 로그 레벨 조정 (INFO → DEBUG)
* fix(notify): 디바이스 없는 사용자의 불필요한 FCM 발송 시도 및 재시도 방지 알림 생성 시 디바이스 존재 여부를 사전 체크하도록 수정, 디바이스가 없는 경우 NOTIFICATION_DISABLED 상태로 저장하고 알림 발송 관련 이벤트는 생략 * fix(notify): 일간 리포트 생성 시 LazyInitializationException 발생 관련 수정 Interest가 Lazy Loading이라 트랜잭션 밖에서 접근 시 예외 발생, DailyQuestion 조회 시 Interest를 fetch join으로 즉시 로딩으로 수정 * fix(notify): NotificationSetting 조회 시 User lazy loading 방지 InactiveUserNotificationScheduler에서 User 정보 접근 시 LazyInitializationException 방지를 위해 fetch join 추가
* refactor(notify): 운영 환경 로깅 개선 정상 동작은 debug, 중요 이벤트는 info로 로깅 개선 * refactor(notify): 메모리 최적화를 위해 스케줄러 재시도 횟수 1회로 감소 FAILED 알림 큐로 인한 메모리 부족 문제 해결, 추후 DEAD_LETTER 비율 모니터링 후 필요시 점진적 증가 * refactor(notify): 스케줄러 조건부 INFO 로깅 복구, 재시도 발생 시에만 조건부로 info 로깅으로 수정
* refactor(ai): 유형 리포트 작성 LLM 메인 모델 변경 GPT -> GEMINI * feat(report): 유형 리포트 길이 미준수 시 부분 리라이트로 보정 * refactor: 유형 리포트의 일부 ErrorCode의 message 수정 "타입" -> "유형"
* refactor(report): getOrCreateTodayAnswerEntry 메소드 수정 이미 존재하는 AnswerEntry를 조회한 경우 Content를 answerText로 업데이트 * docs: 공유 상태 조회 API의 스웨거 문서 수정 필요 없어진 404 Not Found 관련 내용 제거 * fix: daily_question question_text 맞춤법 오타 수정 공부할 떄 -> 공부할 때 * feat: 비속어 필터에 커스텀 금칙어 등록 로직 추가
운영 환경에서 테스트 도메인이 불필요하게 로드되거나 사용되는 것을 방지
Merged
1Seob
added a commit
that referenced
this pull request
Mar 15, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
📝 요약(Summary)
#124 까지 반영하여 운영 서버에 배포합니다.
🔗 Related Issue
💬 공유사항
✅ PR Checklist
PR이 다음 요구 사항을 충족하는지 확인하세요.