Conversation
1Seob
added a commit
that referenced
this pull request
Mar 9, 2026
* feat(user): User 엔티티 구현 * fix: domain 디렉토리 경로 수정 * feat(global): SecurityConfig에 CORS 설정 추가적으로 CorsProperties 클래스 추가하여 cors 설정을 yml에서 할 수 있도록 함 * chore(infra): CORS 설정 추가 application-local.yml에 allowed-origins 설정 추가 * chore(infra): JWT 설정 및 의존성 추가 * feat(auth): JWT 인증 구현 JWT(Access Token) 생성/검증, 예외처리, 에러 응답처리, Spring Security 필터 체인 구성 * feat(auth): Refresh Token 엔티티, 리포지토리 구현 * feat(auth): Refresh Token 생성 Provider 구현 및 Properties 네이밍 수정 Random Opaque Token 방식을 사용하여 생성했고 jwt가 아니기 때문에 JwtProperties에서 TokenProperties으로 리펙토링 * chore: Provider 클래스명 변경 구현 방식보다 역할 중심으로 네이밍 변경 * chore: 프로젝트 이름 변경 반영 (#8) * ci(infra): 개발 서버의 GitHub Actions CI/CD 구축 (#9) * fix(infra): application-dev.yml 수정 (#10) 불필요한 .env 파일 import 제거 * fix: CI 빌드 오류 방지를 위한 contextLoads 테스트 임시 비활성화 (#11) * fix: contextLoads 제거 및 빈 테스트 클래스로 정리 (#12) * fix(infra): 개발 서버 배포 시 JAR 파일 경로 문제 해결 (#13) * fix(infra): DB_USER 환경변수 이름 수정 (#14) DB_USER에서 DB_USERNAME으로 수정 * feat: 헬스 체크 API 구현 (#15) 현재 서버가 살아 있는지를 확인하기 위한 용도 * refactor(global): 예외 클래스 정리 및 목적별로 분리 (#17) ExceptionController에서 공통 포맷(ErrorResponse)으로 에러 응답을 처리하도록 변경 * feat(auth): OAuth2 소셜 로그인 시스템 구현 (#16) * 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): 공통 API 응답 구조 적용 및 리팩토링 (#19) * feat(global): ApiResponse 통일 규격 적용 ApiResponseDto와 ApiResponseEntity 클래스 구현 * refactor: ApiResponse 통일 규격 적용에 따른 기존 코드 리팩토링 * feat(user): JPA Base Entity 상속 구조 재설계, User 엔티티 변경 (#27) * refactor(global): JPA Base Entity 상속 구조 재설계 기존에 CreatedAtOnly와 Auditable이 서로 독립적으로 정의되어 있어, createdAt 필드 및 @PrePersist 로직이 중복되는 문제가 있어 이를 해결하고 엔티티 성격에 따라 필요한 기능만 선택적으로 상속받을 수 있도록 구조를 개선 * feat(user): User 엔티티 변경 Setter를 도메인 메소드로 대체, 프로필 이미지 관련 필드 추가, registeredAt 필드 추가 등 * refactor(global): JPA Base Entity 클래스들의 이름 변경 * feat(auth): User 엔티티에서 소셜 정보 분리 (#28) * 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: 로컬 테스트용 더미 유저 로그인 기능 구현, 나의 프로필 조회 API 구현 (#29) * feat(auth): 로컬 테스트용 더미 유저 로그인 기능 구현 * feat(user): 나의 프로필 조회 API 구현 로그인한 사용자의 프로필 정보를 조회하는 api * fix(auth): 소셜 계정 매핑되지 않은 사용자 정리 (#30) 이전 마이그레이션을 진행하면서 provider와 provider_id 칼럼이 제거된 User 삭제 * fix(auth): Cross-Site 환경을 위한 쿠키 SameSite 설정 개선 (#32) 환경 별로 same-site를 공통은 Lax, local은 Lax, dev는 None으로 설정, CookieManager에서 이 값을 받아서 사용할 수 있도록 수정 * feat(user): 프로필 이미지 업로드 및 삭제 API 구현 (#31) * feat(user): 프로필 이미지 업로드 PresignedURL 생성 API 구현 * feat(user): 프로필 이미지 삭제 api 구현 * ci(infra): dev 배포 스크립트에 새 환경변수들 추가 * feat(user): 나의 프로필 수정 API 구현 (#33) 로그인한 사용자의 프로필 정보를 수정하는 API 구현 * feat(user): 닉네임 사용 가능 여부 조회 API 구현 (#34) * feat(user): 닉네임 사용 가능 여부 조회 API 구현 * refactor(user): CheckNicknameResponse에 Swagger 문서화 추가 * feat(notify): 이메일 인증 시스템 구현 (#35) * feat(notify): EmailVerification 엔티티 및 마이그레이션 추가 * feat(notify): EmailVerificationRepository 구현 이메일과 인증 타입으로 조회, 삭제 구현 * feat(notify): SMTP 설정 및 EmailSender 구현 spring-boot-starter-mail 의존성 추가 및 Gmail SMTP 환경변수 설정, AsyncConfig로 비동기 설정, EmailSender로 비동기 메일 발송 로직 구현 * refactor(notify): EmailVerification 엔티티 메서드 분리 및 UNIQUE 제약조건 추가 한 이메일과 타입에 대해 인증 코드가 중복되는 것을 막기 위해 UNIQUE INDEX를 추가 * ci: GitHub Actions에 이메일 관련 환경변수 추가 추가적으로 APP_PASSWORD를 MAIL_PASSWORD로 환경변수명 변경 * feat(notify): 이메일 인증 서비스 구현 CQRS 패턴으로 Command/Query 분리, 발송, 검증, 조회 로직 구현, EmailSender를 EmailSendService로 패키지명 변경하고 보낼 html 수정 * feat(notify): 이메일 인증 API 및 DTO 구현 인증 코드 발송과 인증 코드 검증 API 구현, Swagger 문서화로 비동기 처리 설명 * ci: Swagger 관련 cors origin 수정 cors origin에서 SWAGGER_SERVER_URL을 SWAGGER_ORIGIN_PUBLIC_IP와 SWAGGER_ORIGIN_DOMAIN로 변경, Github Actions도 최신화 * refactor(notify): json 파싱 예외와 validation 예외 처리 응답 구조 통일 json 파싱의 경우 enum 값 이외의 값이 들어오면 오류가 나서 우선 String으로 받고 controller에서 enum으로 변환하면서 검증, validation은 ExceptionController에서 예외 처리 * fix(infra): GitHub Actions 스크립트에서 빠진 환경 변수 복구 (#36) SWAGGER_SERVER_URL 환경 변수가 필요한데 제거해버려서 다시 복구 * feat(auth): 일반 회원가입 및 로그인 시스템 구현 (#37) * feat(user): 프로필 완성 메서드 추가 및 이메일로 사용자 조회 추가 * refactor(global): 409 Conflict 예외 추가 및 HTTP 상태 코드 순 정렬 ConflictException을 추가하여 이메일 중복 시 409 Conflict, ExceptionController 핸들러를 HTTP 상태 코드 순으로 정렬 * feat(auth): 일반 회원가입 및 로그인 서비스, API 구현 BasicAuthService 추가하여 이메일/비밀번호 기반 회원가입 및 로그인 엔드포인트 구현, 관련 DTO 추가, User의 completeProfile 메서드 불필요하여 제거, 네이밍 개선 * feat(auth): 회원가입 완료 시 이메일 인증 레코드 삭제 회원가입 성공 후 EmailVerification 레코드를 삭제하여 DB 정리 * feat(auth): 패스워드 검증 정규 표현식 수정 프론트엔드와 패스워드 검증 방식을 일치시키기 위해 정규 표현식을 수정 * docs(auth): Swagger 문서 간소화 AuthController swagger 중복 설명 부분 제거 * feat: 관심 주제 도메인 구현 (#38) * feat: 관심 주제 테이블 & 엔티티 구현 Interest 엔티티 구현, interests 테이블 생성 DDL, seed 데이터 DML flyway 마이그레이션 sql문 * feat(user): UserInterest 엔티티 구현 및 user_interests 테이블 생성 * feat(user): 유저의 관심 주제 업데이트 API 구현 * feat(user): 나의 프로필 조회 API의 응답 DTO에 관심 주제 코드 필드 추가 * refactor(auth): SocialAccount 엔티티 생성 메소드의 이름 변경 socialAccountCreate -> create로 단순화 * fix: UpdateUserInterestRequest의 interestCode 필드에 validation 적용 * fix(global): RuntimeException 핸들러가 Security 예외를 가로채지 않도록 수정 (#39) AuthenticationException, AccessDeniedException 발생 시 다시 던지도록 변경 & JwtAuthenticationEntryPoint, JwtAccessDeniedHandler가 정상적으로 작동하도록 복구 & JWT 누락/만료 시 401/403 응답이 정상적으로 출력되도록 수정 * feat(auth): 이메일 인증 사전 검증 추가, 비밀번호 찾기 및 변경 기능 구현 (#40) * feat(notify): 이메일 인증 사전 검증 추가 이메일 발송 전에 회원가입이라면 기존 회원인지 검증, 비밀번호 찾기라면 소셜 계정인지 탈퇴 회원인지 검증하고 예외 발생 * feat(auth): 비밀번호 찾기 및 변경 기능 구현 이메일 인증 기반 비밀번호 찾기 시 비밀번호 재설정 후 모든 기기 로그아웃, 비밀번호 변경 시 현재 기기는 토큰 재발급 * refactor(auth): passwordEncoder bean으로 등록해서 의존성 주입해서 사용하도록 변경 * refactor(auth): DTO 및 메서드 네이밍 변경, /password/reset 엔드포인트 POST 메서드로 변경 * feat(auth): SocialAccountRepository에 existsByUser 메서드 추가 EmailVerificationCommandService와 PasswordService에서 소셜 계정 차단을 위해 existByUser 메서드를 사용, 사용하지 않는 isSocialAccount 메서드는 User에서 삭제 * feat(ai): 오늘의 리포트 생성 API(테스트용) 구현 (#42) * feat(ai): Spring AI 설정 및 DailyReportPromptLoader 인터페이스 구현 로컬에서 프롬프트를 불러오는 LocalDailyPromptLoader 구현체와 개발 서버에 프롬프트를 불러오는 SecretDailyReportPromptLoader 구현체를 구현 * feat(ai): 일간 리포트 생성 API(초기 버전) 구현 Spring AI 설정과 OpenAI API 호출이 정상적으로 됐는지 확인용 * fix: .gitignore 문제 해결 파일이 .gitignore에 포함되어 있음에도 이미 Git에 트래킹된 상태여서 원격 저장소에 업로드되는 문제 해결 * feat(ai): 프롬프트 및 응답에 감정 관련 부분 추가, OpenAI API의 응답 JSON을 DTO로 변환 구현 * ci(ai): 개발 서버 배포 workflow 스크립트에 오늘의 리포트 프롬프트 환경 변수 추가, OpenAI API 설정 변경 * docs(ai): 오늘의 리포트 생성 API 관련하여 Swagger 문서화 * fix(infra): 개발 서버 배포 workflow 파일 수정 (#43) 환경 변수 설정에서 "=" 양쪽의 공백 제거 * fix(infra): 프롬프트 Secret 로딩 오류 해결 및 base64 인코딩 방식으로 전환 (#44) * fix(infra): base64 디코딩된 INSIGHT_PROMPT를 환경 변수로 export하도록 수정 (#45) * fix(infra): inline ENV 리스트가 끊겨 환경 변수가 전달되지 않던 문제 수정 (#46) * fix(infra): 개발 서버 배포 스크립트의 백슬래시 뒤 공백으로 인한 실행 오류 해결 (#47) * fix(infra): 개발 서버 배포 스크립트에 누락된 API 키 환경 변수 추가 (#48) * feat(auth): 약관 API 구현 (#49) * feat(auth): 약관 엔티티 및 DB 마이그레이션 추가 Term과 UserTerm 엔티티를 만들고 terms, user_terms 테이블 DB 스키마 추가 및 v1.0 초기 약관 데이터 삽입 * feat(auth): 약관 Repository 및 Service 레이어 구현 UserTermRepository에서 N+1 방지를 위한 JOIN FETCH 적용, TermsCommandService에서 약관 동의 처리 (생성/업데이트, 검증), TermsQueryService에서 약관 상태 조회, 마케팅 동의 확인 구현 * feat(auth): 약관 API 및 DTO 구현 약관 동의 상태 확인 (재동의 필요 여부, 현재 동의 상태), 약관 동의 처리 (소셜 온보딩, 재동의), 마케팅 동의 여부 조회, 마케팅 동의 여부 변경까지 총 엔드포인트 4개 구현 * feat(auth): 일반 회원가입 시 약관 동의 진행 추가 SignupRequest에 약관 동의 필드 4개 추가(service, privacy, ageVerification, marketing), BasicAuthService에서 TermsCommandService 주입 받아서 약관 동의 처리, AuthController에 Swagger 문서 업데이트 * feat(auth): Swagger 문서 업데이트 * refactor(auth): 엔드포인트 공통 경로 중복 제거, application DTO 네이밍 변경 * feat(auth): 회원 탈퇴 및 복구 기능 구현 (#51) * feat(auth): 회원 탈퇴 및 복구 기능 구현 회원 탈퇴, 일반 계정 복구 API 구현, 소셜 로그인의 경우 로그인 시 자동으로 복구되게 로직 구현, 로그인/회원가입/비밀번호 찾기 시 탈퇴 계정 감지 및 차단 메시지 개선 * feat(auth): 탈퇴 회원 자동 삭제 스케줄러 구현 매일 자정 실행, 14일 경과한 탈퇴 회원 영구 삭제 * Revert "feat(auth): 회원 탈퇴 및 복구 기능 구현 (#51)" (#52) This reverts commit 4671461. * Revert "Revert "feat(auth): 회원 탈퇴 및 복구 기능 구현 (#51)" (#52)" (#53) This reverts commit 3018923. * feat(auth): 탈퇴 계정 로그인 시 에러 응답 데이터로 닉네임과 삭제 예정일 반환 (#54) * feat(auth): 탈퇴 계정 로그인 시 닉네임과 삭제 예정일 반환 ApiResponseDto/Entity에 data 포함 error 메서드 추가, WithdrawnException이라는 데이터 포함 커스텀 예외 추가, 로그인 시 탈퇴 계정 감지하여 에러와 함께 데어터로 정보 제공 * feat(auth): 삭제 예정일이 최소 14일 보장하도록 수정 부등호 바꿔서 날짜 정확도 개선 * feat(ai): 테스트용 오늘의 리포트 생성 API 개선 (#55) * feat(global): AI 관련 예외 클래스 구현 AiServiceException 클래스 구현 및 ExceptionController에 해당 핸들러 추가 * feat(ai): 테스트용 오늘의 리포트 생성 API 개선 프롬프트와 temperature을 파라미터로 입력받을 수 있도록 변경 * feat(global): AI 관련 예외 클래스들 세분화 AiResponseParseException과 AiServiceUnavailableException으로 세분화 * feat: 크리스탈 도메인 구현 및 Testcontainers 기반 테스트 인프라 도입 (#56) * feat: 크리스탈 관련 테이블 및 엔티티 구현 DB 테이블 DDL sql 파일 작성 및 UserWallet, CrystalLog 엔티티 구현, NotEnoughCrystalException 예외 클래스 구현 * feat: 회원가입 로직에 UserWallet 초기화 추가, 기존 유저들의 user_wallets 테이블 백필 * feat: WalletCommandService 구현 * feat: 크리스탈 조회 api 구현 WalletQueryService를 추가 * test(infra): Testcontainers 기반 테스트 인프라 도입 & WalletSerivce 테스트 클래스 작성 * ci(infra): PR 테스트 워크플로우 스크립트 추가 이에 따라 기존 개발 서버 배포 워크플로우 스크립트에서 test 부분 제거 * feat: CrystalLogStatus 추가, 크리스탈 차감, 환불, 충전을 원자적 DB 업데이트 방식으로 변경 UserWallet 클래스 내부의 크리스탈 차감, 충전 메소드 제거, WalletCommandService 삭제 * test: UserWallet 관련 테스트 변경 * feat: 신규 소셜 유저 생성에 UserWallet 신규 생성 추가 * feat: 오늘의 질문 도메인 구현 (#58) * test: UserWallet 관련 추가 테스트 UserWalletRepository의 모든 메소드들에 대한 테스트 완료 * feat: daily_questions 테이블 생성 및 시드 SQL 작성, DailyQuestion 엔티티 구현 '꿈'에 해당하는 관심 주제가 필요 없어져 해당 레코드 삭제 * feat: user_daily_questions 테이블 생성, UserDailyQuestion 엔티티 구현 오늘의 질문을 저장하는 테이블 * feat: DailyQuestion, UserDailyQuestion 관련 레포지토리 클래스 구현 * feat: 헬퍼 클래스 구현 * feat: 서비스 클래스 구현 QuestionCommandService, QuestionQueryService 클래스 구현 * feat: 오늘의 질문 조회하기 api 구현 * feat: 오늘의 질문 재생성 api 구현 * feat: answer_entries 테이블 생성, AnswerEntry 엔티티 구현 * feat: 질문 선정 로직에서 유저가 이미 답변한 질문들을 제외하는 로직 추가 * feat: 관심 주제 코드 및 스웨거 문서에서 꿈(DREAM) 제거 더 이상 사용하지 않음 * feat: getOrCreateTodayQuestion 메소드의 반환 수정 메소드가 반환하는 응답 DTO의 answered 필드를 false로 고정했던 것을 실제 답변 여부로 수정 * feat(report): 오늘의 리포트 생성 API 구현 (#59) * feat(report): emotions, daily_reports 테이블 생성 및 엔티티 구현 * feat(report): daily_reports 테이블에 status 컬럼 추가 엔티티에도 반영 * feat(report): AnswerEntry, DailyReport 레포지토리 클래스 구현 * feat: CrystalLogRepository 업데이트 * feat(report): 오늘의 리포트 생성 API 구현 * feat(report): 오늘의 리포트 생성하기 api 구현 (2) 스웨거 문서화 추가 등 * feat(report): 오늘의 리포트 조회 API 구현 * feat: 오늘의 질문 응답 DTO에 관심 주제 코드 필드 추가 DailyQuestionResponse 클래스에 interestCode 필드 추가 * refactor(report): 스웨거 문서화, 메소드명 리팩토링 * refactor: 오늘의 질문 응답 스웨거 문서화 개선 * refactor(report): 증복 코드 리팩토링 prepareDaily 메소드에서 AnswerEntry 조회 중복 제거, confirmDailyAndReward 메소드에서 Emotion 조회 중복 제거 * feat: 일부 테이블에 date 컬럼 추가 및 unique 제약 추가 & 리팩토링 & 예외 처리 추가 (#60) * refactor: answer_entries 테이블에서 deleted_at 컬럼 제거 soft delete 불필요함 * refactor(global): 오늘의 날짜 시작, 내일 날짜 시작까지의 범위를 구하는 중복 로직을 제거하기 위한 헬퍼 클래스 도입 TodayDateTimeRangeProvider 클래스와 TodayDateTimeRangeDto 클래스 구현 및 리팩토링 * feat(report): 질문 리롤 로직에서 이미 답변 작성 시의 예외 처리 추가 * fix: DailyQuestionRepository의 조회 쿼리들에 soft deleted 여부 체크 추가 * feat(report): daily_reports 테이블에 date 컬럼 추가 및 unique 제약 추가 * feat: answer_entires 테이블에 date 컬럼 추가 및 unique 제약 추가 & 오늘의 리포트 생성 로직에 예외 처리 추가 유저에게 할당된 오늘의 질문과 요청의 질문이 불일치하는 경우의 예외 처리 추가 * refactor: AnswerEntry 엔티티에 unique 제약 명시 * refactor(global): 오늘의 LocalDate를 구하는 중복 로직 제거 TodayDateTimeProvider로 헬퍼 클래스명을 변경하고, 이 클래스에 메소드로 추출 * refactor: emotions 테이블에서 '사랑', '고통'에 해당하는 레코드 제거 (#61) * feat(report): 주간 리포트 도메인 구현 (#64) * feat(report): weekly_reports 테이블 생성 및 WeeklyReport 엔티티 구현 * feat(global): WeekRangeCalculator 유틸 클래스 구현 이번 주의 범위 반환, 주어진 날짜가 속한 주의 범위 반환 * feat(report): WeeklyReportPromptLoader 인터페이스 및 구현체 구현 * feat(report): WeeklyEntriesAssembler 헬퍼 클래스 및 WeeklyReportEntryInputDto 구현 주간 리포트 생성 프롬프트의 입력값 생성에 활용 * feat(report): WeeklyReportLlmClient 클래스 구현 프롬프팅을 통해 OpenAI API를 호출하여 주간 리포트를 생성 * feat(report): WeeklyReportRepository 구현 등 * feat(report): PendingWeeklyReportService 클래스 구현 이번 주의 주간 리포트가 있으면 반환하고, 없으면 PENDING으로 생성하는 서비스 * feat(report): WeeklyReportTxService 클래스 구현 * feat(report): WeeklyReportGenerationListener 클래스, WeeklyQueryRepository 클래스 구현 비동기 리슨 * feat(report): WeeklyReportService 구현 * fix(report): 조회 대상을 이번주에서 저번주로 변경 주간 리포트는 저번주의 기록을 통해서 생성하는 것 * feat(report): 주간 리포트 조회 API 구현 * feat(report): 주간 리포트 작성 자격 확인 로직 추가 저번 주에 4회 이상 작성했어야 생성 가능 * feat(report): 기능 작동 확인 트랜잭션 안에서 event publish하도록 수정, weekly_reports 테이블에서 discovered, good, improved 컬럼의 not null 제약 제거 등 * feat(report): id로 주간 리포트 조회 API 구현 * feat(report): PENDING 리포트 생성 또는 기존 리포트 조회 로직에서 기존 리포트의 status를 PENDING으로 변경하는 로직 추가 * feat(global): Llm용 TaskExecutor 추가 구현 및 적용 * feat(report): 테스트용 오늘의 리포트 생성 API 변경 프롬프트와 temperature는 개발 서버와 동일하게 고정, 질문과 답변만 입력받도록 수정 * refactor(report): WeeklyReportController 스웨거 문서화 보강 * feat(report): id로 주간 리포트 조회 API에 인증 추가, 주간 리포트 생성 시작 응답에 작성 후 크리스탈 잔액 필드 추가 * feat(report): OpenAI API 모델 변경 gpt-5-mini * refactor: 공통 에러 응답 개선 (#65) * feat(global): ApiErrorResponseDto, ErrorCode 추가, ApiResponseDto, ApiResponseEntity 수정 추후 전체 코드의 에러 응답 개선이 끝난 후에 기존 에러 응답 구조 코드를 정리해야됨 * feat(global): 기존 exception 클래스에 ErrorCode 기반 예외 처리 추가, ExceptionController 수정 BusinessException을 비즈니스 예외의 공통 부모 클래스로 하여 예외들이 상속 받도록 하였고 호환성을 위해 기존 방식을 남겨뒀기 때문에 추후 제거해야됨, MethodArgumentNotValidException은 커스텀 메시지 방식으로 구현, Ai 관련 exception 3가지랑 NoSuchKeyException, NotEnoughCrystalException는 아직 수정 안 함 * feat(auth): auth 패키지 에러 응답 ErrorCode 기반으로 개선 * feat(notify): email 패키지 에러 응답 ErrorCode 기반으로 개선 * feat(auth): terms 패키지 에러 응답 ErrorCode 기반으로 개선 * feat(auth): global/sercurity 패키지 에러 응답 ErrorCode 기반으로 개선 JwtAuthException의 ErrorCode를 쓰기 위해 JwtAuthenticationFilter의 request에 errorCode request attribute에 저장 * docs: AuthController, EmailVerificationController, TermsController 스웨거 문서 에러 설명을 ErrorCode 기반으로 변경 * refactor(user): user 패키지 에러 응답 ErrorCode 기반으로 개선 스웨거 문서 수정 포함 * refactor(user): UserController 스웨거 문서 수정 * refactor: question 패키지 에러 응답 ErrorCode 기반으로 개선 스웨거 문서 수정도 포함 * refactor: wallet 패키지 에러 응답 ErrorCode 기반으로 개선 * refactor(report): dailyreport 패키지 에러 응답 ErrorCode 기반으로 개선 스웨거 문서 수정 포함 * refactor(report): weeklyreport 패키지 에러 응답 ErrorCode 기반으로 개선 스웨거 문서 수정 포함 * refactor: NoSuchKeyException에 대한 ErrorCode 추가 및 ExceptionController에서 관련 부분 수정 * refactor(global): ExceptionController에서 Ai와 크리스탈에 관련된 메소드 수정 * refactor(report): global/core/prompt 패키지 에러 응답 ErrorCode 기반으로 개선 관련하여 WeeklyReportLlmClient, TestDailyReportService 클래스의 에러 응답도 개선 * refactor(user): user 패키지의 InterestCode enum 에러 응답 ErrorCode 기반으로 개선 기존처럼 에러 메시지에 code가 들어가지는 않게 구현 * refactor(global): 호환성을 위해 남겨둔 기존 에러 응답 코드 제거 ApiResponseDto와 ApiResponseEntity의 기존 error 메서드 제거, exception 클래스들에 message 관련 기존 방식 제거 * docs: DailyReportController, UserController 스웨거 문서 수정 --------- Co-authored-by: 1Seob <moon27456@naver.com> * refactor(report): 리포트 관련 리팩토링 (#66) * refactor(report): 주간 리포트 생성 API 스웨거 문서 보강 * refactor(report): 오늘의 리포트 조회 API의 응답에 유저의 답변 내용 필드 추가 * refactor(report): 주간 리포트 작성 자격 미달 시 지난 주에 작성한 일간 리포트 수를 에러 응답에 포함 * feat(search): 최근 검색어 기능, 답변 검색, 답변/리포트 상세보기 기능 구현 (#67) * feat(search): 검색 기능 엔티티 및 마이그레이션 구현 최근 검색어 저장을 위한 search_histories 테이블 생성, 기존 단일 인덱스 제거 후 검색 결과 페이징 최적화를 위한 복합 인덱스 추가, SearchHistory 엔티티 구현, commitlint에 search scope 추가 * feat(search): 검색 기능 repository 구현 updateTimestamp 메서드는 동일한 검색어로 다시 검색했을 때 update_at을 최신화, 그외 최신 10개 조회, 삭제 메서드 구현 * feat(search): 검색 기능 Service, Controller 구현 최근 검색어 10개 조회 (최신순), 검색어 개별/전체 삭제, 저장할 때마다 검색어 100개 초과 시 오래된 검색어 자동 삭제, 검색어 저장 실패 시 검색 결과에 영향 없도록 예외 처리 * refactor(search): search 패키지 에러 응답 ErrorCode 기반으로 개선 * refactor(search): SearchController 스웨거 문서 에러코드 기반으로 수정, ErrorCode에 Answer 관련 에러 코드 추가 * feat(report): 답변, 리포트 상세보기 API 구현 answerId로 답변, 리포트를 조회하는 api를 구현, COMPLETED 상태의 리포트만 조회 * feat(report): 답변 검색 API 구현 키워드, 감정, 키워드 + 감정으로 검색 가능하도록 구현, 파라미터 생략 시 전체 답변 목록 반환, Cursor-based Pagination으로 무한 스크롤 지원 (20개씩), 검색하면서 자동으로 검색어 저장, matchedSnippet으로 문장 미리보기 추출 * refactor(search): 정적 팩토리 메서드를 response 내부로 이동 컨트롤러와 서비스 단에서는 변환 메서드 제거 * fix(search): PostgreSQL 타입 추론 오류 해결 (#68) * fix(search): PostgreSQL 타입 추론 오류 해결 cursorDate null 체크 시 PostgreSQL이 타입을 추론하지 못하는 문제가 발생하여 JPQL에서 cast(:cursorDate as date) 명시적 타입 캐스팅 추가 * docs(search): AnswerController 스웨거 문서 수정 * refactor(search): JPQL 호환성 문제 해결 (#69) limit :size를 Pageable로 변경, cast() 조건을 메서드 분리로 대체 * fix(db): 과거 마이그레이션 삭제 후 최신 버전으로 재발급 (#70) 이미 DB에 적용된 최신 마이그레이션보다 이전 버전의 마이그레이션 파일이 추가되면서 Flyway validation 오류가 발생하던 문제를 해결 * refactor(report): 주간 리포트 관련 리팩토링 (#71) * refactor(report): WeeklyReserveResultDto에 balanceAfter 필드 추가 주간 리포트 생성 이후 정확한 크리스탈 잔액 반환 * perf(report): PENDING 주간 리포트 생성에서 트랜잭션에 대해 REQUIRES_NEW 제거 준비 과정을 하나의 트랜잭션으로 묶음 * fix(auth): 쿠키 생성 시 path 설정 변경 (#72) path를 "/"로 변경, 이에 따라 쿠키 삭제 시에 기존 path의 쿠키와 새로운 path의 쿠키를 함께 삭제하도록 변경 * Revert "fix(auth): 쿠키 생성 시 path 설정 변경 (#72)" (#73) This reverts commit 7beb033. * feat: test 도메인 구현 (#75) * feat: test 패키지 추가 및 테스트용 오늘의 리포트 API 옮기기 * feat: 테스트용 오늘의 리포트 생성 (프롬프트 포함) API 구현 이전에 삭제했던 것을 롤백 * feat: 테스트용 주간 리포트 삭제 API 구현 * fix(report): 주간 리포트 생성 시 에러 처리 보완 (#76) * fix(report): 생성된 주간 리포트 저장 실패 시에도 "실패+환불" 처리 * refactor(report): weekly_reports 테이블의 discovered, good, improve 컬럼을 varchar(250) 타입으로 변경 이에 따라 엔티티도 수정 * feat(report): 주간 리포트 생성 결과 저장 시 최대 글자 수 초과 시 자르는 처리 추가 150자까지만 잘라서 저장 * feat(user): 나의 프로필 수정 API에 닉네임 변경 제한 횟수 초과 검증 로직 추가 (#77) * feat(user): user_nickname_changes 테이블 추가 및 UserNicknameChange 엔티티 구현 유저의 닉네임 변경 이력 기록용 테이블 * feat: UserNicknameChangeRepository 구현 * feat(user): 나의 프로필 수정 API에 닉네임 변경 제한 횟수 초과 검증 로직 추가 * refactor(report): 일간 리포트 생성 트랜잭션 단순화 및 동시성 안정화 (#78) 일간 리포트 준비 단계를 단일 트랜잭션으로 묶어 원자성 보장, DB 유니크 제약 기반 중복 생성 방지 및 멱등 처리 적용, 유니크 충돌 시 재조회 방식으로 동시 요청 안정성 개선 * refactor(report): 주간 리포트 생성 LLM의 파라미터 변경 (#81) * Revert "refactor(report): 주간 리포트 생성 LLM의 파라미터 변경 (#81)" (#82) This reverts commit 32eaf08. * feat(report): 월간 리포트 도메인 구현 (#80) * feat(report): monthly_reports 테이블 생성 및 MonthlyReport 엔티티 구현 * feat: MonthRangeCalculator 유틸 클래스 구현 특정 날짜가 속한 월의 범위 반환, 저번 달의 범위 반환, 이번 달의 범위 반환 * feat(report): MonthlyReportPromptLoader 인터페이스 및 구현체 구현 * feat(report): MonthlyWeeklySummariesAssmbler 헬퍼 클래스 구현 및 MonthlyWeeklySummaryInputDto 구현 월간 리포트 생성 프롬프트의 입력값 생성에 활용 * feat(report): MonthlyRepresentativePicker 헬퍼 클래스 구현 대표 일간 리포트 샘플 추출 * feat(report): MonthlyWeeklySummariesService 클래스 구현 * feat(report): MonthlyReportLlmClient 클래스 구현 * feat(report): MonthlyReportRepository 구현 * feat(report): PendingMonthlyReportService 클래스 구현 PENDING MonthlyReport를 생성하는 클래스 * feat(report): MonthlyReportTxService 클래스 구현 * feat(report): MonthlyReportGenerationListener, MonthlyQueryRepository 클래스 구현 * feat(report): MonthlyReportService 클래스 구현 * feat(report): MonthlyReportQueryService 클래스 구현 * feat(report): MonthlyReportController 클래스 구현 * refactor(report): 주간, 월간 리포트 생성 비용 조정 * feat(report): 테스트용 월간 리포트 삭제 API 구현 * refactor(report): 주간 리포트 생성 자격 조건을 4회에서 3회로 변경 * refactor(report): 주간, 월간 리포트 생성에서 최대 글자수 변경 200 -> 240 * refactor: emotions 테이블의 레코드 리팩토링 (#83) * refactor(db): Flyway 마이그레이션 sql 파일 생성 * refactor: emotions 레코드 수정에 따른 코드 리팩토링 * feat(report): 캘린더 조회 API 구현 (#85) * feat(report): AnswerEntryQueryRepository에 메서드 추가 월 단위 감정 코드 조회, 최근 n개 답변 조회, 특정 날짜 답변 조회 쿼리 메서드 추가, 기존처럼 DTO Projection 사용 * feat(report): 캘린더에서 답변/리포트 조회 service, controller 구현 비슷한 로직의 경우 기존 response dto를 재활용, 특정 월의 답변이 있는 날짜와 감정 코드 조회, 최근기록 6개까지 미리보기, 특정 날짜 답변 미리보기 API 구현, 예전 감정 코드로 문서가 작성되어 있는 부분 수정 * feat(global): PathVariable 형식 오류가 적절히 처리되지 않던 문제 해결 PathVariable 타입 변환 실패 시 발생하는 MethodArgumentTypeMismatchException를 처리하여 기존 500 에러 대신 400 VALIDATION_FAILED 반환되도록 개선 * feat(report): 나의 주간/월간 리포트 조회 API 응답 및 생성 규칙 변경 (#86) * feat(report): 나의 주간 리포트 조회 API의 응답에 이전 주간 리포트도 포함 * feat(report): 나의 월간 리포트 조회 API의 응답에 이전 월간 리포트도 포함 * refactor(report): 나의 주간 리포트 조회 코드 리팩토링 mapper 활용 추가 * refactor(report): 나의 월간 리포트 조회 API의 스웨거 문서 수정 * refactor(report): 나의 주간/월간 리포트 조회 API 리팩토링 (#87) 이번 리포트의 경우 status를 그대로 응답에 포함 * feat(report): 홈화면 조회 API 구현 (#88) AnswerEntryQueryRepository에 특정 기간 내 답변 날짜 목록 조회, 사용자의 첫 답변 날짜 조회 메서드 추가, HomeQueryService에서 주간 답변 날짜 필터링, 연속 답변 일수와 총 기록 일수 계산 로직 구현, HomeController에 GET /api/v1/home 엔드포인트 추가 * feat(report): 총 기록 일수 계산 방식 변경 (#89) * feat(report): 총 기록 일수 계산 방식 변경 총 기록 일수를 첫 답변 이후 경과 일수에서 실제 답변 작성한 날짜의 개수로 계산 방식 변경, 추가적으로 Repository 쿼리 간소화 * feat(report): AnswerEntryQueryRepository에서 사용하지 않는 메서드 제거 findAnswerDatesByUserIdAndDateBetween 메서드 제거 * feat(report): 답변 상세조회 API 응답 필드 추가 및 검색 API와 검색어 저장 API 분리 (#91) * feat(report): 답변 상세 조회 API 응답 필드 추가 및 개선 GET /answers/{answerId}와 GET /calendar/{date}에 대해 응답으로 질문 내용, 질문 카테고리, 답변 작성일, 답변 내용, 리포트 내용, 감정 상태를 반환하도록 변경, Repository에 findDetailByAnswerId, findDetailByUserAndDate 쿼리 추가, 사용하지 않는 메서드 제거 * refactor(search): 검색 API와 검색어 저장 API 분리 POST /api/v1/search/histories 엔드포인트를 추가 * feat(friend): 친구 관리 기능 구현 (#94) * feat(friend): Friendship, FriendSearchHistory Entity 추가 및 DB 스키마 마이그레이션 Friendship, FriendSearchHistory Entity 추가, 관련 에러 코드 추가, 마이그레이션 추가 * refactor(user): 닉네임 중복 검증 개선 user의 nickname에 UNIQUE 제약 추가, UserProfileUpdateService에 중복 체크 로직 추가, UserController 에러 코드 Swagger 문서 업데이트 * feat(friend): 친구 관리 Repository 레이어 구현 FriendshipRepository에서 JOIN FETCH로 N+1 문제 방지, FriendSearchHistoryRepository에서 기존 리포트 검색과 비슷하게 UPSERT 패턴 지원, UserRepository에서 유저 검색 쿼리 구현하였고 관련도 순으로 쿼리되도록 구현 * feat(friend): 친구 관리 및 검색 API 구현 친구 조회/요청/수락/거절/삭제 API, 커서 기반 유저 검색 API, 검색 기록 저장/조회/삭제 API 구현 * feat(report): 피드 공유 기능 구현 (#95) * feat(report): DailyReport 엔티티에 isShared 필드 추가 및 DB 마이그레이션 status와 isShared를 같이 관리하기 위해 DailyReport 엔티티에 추가, 쿼리 최적화를 위해 인덱스 생성 * feat(report): DailyReportRepository에 쿼리 추가 DTO 프로젝션을 사용하여 필요한 정보 추출 * feat(report): 친구 피드 기능 Service, Controller 구현 피드 조회 API, 공유 시작/중단 API, 공유 상태 조회 API 구현 * feat(report): 오늘의 리포트 조회 응답에 isShared 필드 추가 응답 필드 값 변경에 따라 DailyReportQueryService도 수정 * refactor(report): 피드 기능 코드 개선 불필요한 FeedShareStatusScheduler 제거에 따른 resetAllShareStatus 리포지토리 메서드 제거, NPE 방어 코드 추가, 인덱스 이름 수정 * refactor(report): MonthlyReport AiChatOption reasoningEffort 변경 (#96) medium으로 변경 * feat(friend): 친구 검색 대소문자 구분 제거 (#97) 기존 쿼리에서 LOWER() 함수를 추가, index 추가로 검색 성능 최적화 * refactor(auth): 소셜 로그인 시 다른 계정 선택 가능하도록 개선 (#98) 구글은 prompt=select_account 파라미터 추가, 네이버는 auth_type=reauthenticate 파라미터 추가 * ci(infra): 운영 서버의 CI/CD 구축 (#99) * ci(infra): 운영 서버 CI/CD Github Workflow 스크립트 작성 * refactor(infra): 개발 서버에만 적용되던 @Profile 확장 "dev" -> {"dev", "prod"} * chore(infra): application-prod.yml 설정 파일 추가 운영 서버용 설정 파일 * feat(friend): 같은 질문에 답변한 친구 프로필 표시 기능 추가 (#100) HomeResponse에 answeredFriendProfiles, answeredFriendCount 필드 추가, HomeQueryService에 조건에 맞는 친구 프로필 조회 로직 구현, AnswerEntryQueryRepository에 쿼리 추가 * feat(auth): Native SDK 소셜 로그인 서비스 구현 (#101) * 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: 리포트 LLM에 멀티 프로바이더 라우팅 적용 및 2-pass rewrite 설계 (#102) * 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 환경변수 추가 * feat: WeightedInterestPicker 클래스 삭제 및 QuestionCommandSerivce.rerollTodayQuestion 메소드 수정 (#103) 오늘의 질문 리롤 시 유저의 관심 주제 내에서만 다시 선택 * feat(report): 월간 리포트에 멀티 프로바이더 라우팅 및 2-pass rewrite 설계 적용 (#104) * refactor(ai): WeeklyReportLlmClient.rewriteOne 메소드의 프롬프트 보완 입력 말투가 반말/해체인 경우에 교정하도록 보완 * refactor(ai): WeeklyReportGenerationListener의 MAX_LEN 값 수정 240 -> 245 * refactor(report): MonthlyReportGenerationListener의 MAX_LEN 값 수정 240 -> 245 * feat(report): 월간 리포트에 멀티 프로바이더 라우팅 및 2-pass rewrite 설계 적용 * feat(auth): 카카오 소셜 로그인 기능 구현 (#105) * 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): 유형 리포트 도메인 구현 (#106) * 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 문서화 개선 * refactor(report): weekly_reports, monthly_reports 테이블에서 good 컬럼 제거 (#107) * refactor(report): weekly_reports 테이블에서 good 컬럼 제거 이에 따라 WeeklyReport 엔티티 및 관련 코드 수정 * refactor(report): monthly_reports 테이블에서 good 컬럼 제거 이에 따라 MonthlyReport 엔티티 및 관련 코드 수정 * feat(report): 일간 리포트의 날짜 경계 엣지 케이스 처리 로직 구현 (#108) * feat(report): 일간 리포트의 날짜 경계 엣지 케이스 처리 로직 구현 n일에 할당된 오늘의 질문에 대한 답변이 n+1일에 제출된 경우 * refactor(report): AnswerEntryService, PendingDailyReportService의 조회 로직 변경 createdAt 시간 범위(Range) 기반 조회 -> 비즈니스 날짜(Date) 필드 기반 조회 * refactor(report): QuestionCommandService의 조회 로직 변경 createdAt 시간 범위(Range) 기반 조회 -> 비즈니스 날짜(Date) 필드 기반 조회 * feat(report): ID로 오늘의 리포트 조회하기 API 구현 (#109) * fix(report): id로 일간 리포트 상세 조회 JPQL에서 question/interest 조인 명시화 (#110) DailyReport -> AnswerEntry -> DailyQuestion을 명시적으로 join하고, DailyQuestion.interest는 left join으로 변경해 path-expression의 암묵적 inner join로 인한 누락을 방지 * feat(report): 주간/월간 리포트 볼드/하이라이트 지원을 위한 content(jsonb) 도입 (#112) * 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 문서 개선 * chore(db): daily_questions 질문 리스트 v2로 업데이트 (#113) 수정/삭제/신규 시드 적용 * feat(report): 주간/월간 리포트 요약(summary) 추가 및 styled content 확장 (#114) * 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: Thymeleaf 통계 페이지(일간/전체) 구현 (#115) * feat: DailyStatsRepository 구현 * feat: 일간 통계 페이지 구현 * feat: TotalStatsRepository 구현 * feat: 전체 통계 페이지 구현 * feat: 서버 상태 뱃지 추가 * feat(notify): FCM 기반 푸시 알림 기능 구현 (#116) * 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): 디바이스 없는 사용자의 불필요한 알림 발송 방지 및 이벤트 발행, 스케줄러 버그 수정 (#117) * 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): 운영 환경 로깅 개선 및 스케줄러 재시도 횟수 감소 (#118) * refactor(notify): 운영 환경 로깅 개선 정상 동작은 debug, 중요 이벤트는 info로 로깅 개선 * refactor(notify): 메모리 최적화를 위해 스케줄러 재시도 횟수 1회로 감소 FAILED 알림 큐로 인한 메모리 부족 문제 해결, 추후 DEAD_LETTER 비율 모니터링 후 필요시 점진적 증가 * refactor(notify): 스케줄러 조건부 INFO 로깅 복구, 재시도 발생 시에만 조건부로 info 로깅으로 수정 * feat(report): 유형 리포트 품질 및 리라이트 로직 개선 (#119) * refactor(ai): 유형 리포트 작성 LLM 메인 모델 변경 GPT -> GEMINI * feat(report): 유형 리포트 길이 미준수 시 부분 리라이트로 보정 * refactor: 유형 리포트의 일부 ErrorCode의 message 수정 "타입" -> "유형" * chore(report): 유형 리포트 작성 LLM 프롬프트 길이 제한 및 마진 상수 조정 (#120) * refactor(report): 공유 상태 조회 시 리포트 없을 때 예외 대신 false 반환 (#121) * refactor: 전반적인 도메인 정비 및 부가 기능 개선 (#122) * refactor(report): getOrCreateTodayAnswerEntry 메소드 수정 이미 존재하는 AnswerEntry를 조회한 경우 Content를 answerText로 업데이트 * docs: 공유 상태 조회 API의 스웨거 문서 수정 필요 없어진 404 Not Found 관련 내용 제거 * fix: daily_question question_text 맞춤법 오타 수정 공부할 떄 -> 공부할 때 * feat: 비속어 필터에 커스텀 금칙어 등록 로직 추가 * chore: Test 도메인 Profile 설정 추가 (local, dev) (#124) 운영 환경에서 테스트 도메인이 불필요하게 로드되거나 사용되는 것을 방지 --------- Co-authored-by: Chanhae Lee <charlie815@naver.com> Co-authored-by: Chanhae Lee <146611988+coldsunn@users.noreply.github.com>
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)
현재
develop브랜치에서 GitHub Actions CI가./gradlew test bootJar실행 시NadabApplicationTests.contextLoads()테스트에서 애플리케이션 컨텍스트 로딩 과정에서 실패하고 있습니다.해당 테스트는 실제 DB 및 환경 변수(
DB_URL,DB_USERNAME,DB_PASSWORD,JWT_SECRET,SWAGGER_SERVER_URL등)에 의존적인 상태라,CI 환경(EC2 배포용 워크플로우)에서 필요한 설정을 모두 제공하지 못해 빌드가 깨지는 문제가 발생했습니다.
여러 방식의 해결 방법을 조사했고, 일단은
contextLoads()테스트를 임시로 비활성화하기로 했습니다.🔗 Related Issue
💬 공유사항
향후에는 Testcontainers 기반 통합 테스트를 도입할 예정입니다.
위 작업이 완료되면, 현재
@Disabled처리된contextLoads()테스트를 다시 활성화하거나 Testcontainers 기반 신규 통합 테스트 클래스에서 애플리케이션 컨텍스트 및 주요 흐름을 검증할 예정입니다.✅ PR Checklist
PR이 다음 요구 사항을 충족하는지 확인하세요.