Conversation
This reverts commit 7efaebe.
This reverts commit bf91a99.
chore/#1 spotless
- flyway, r2dbc 의존성 추가 - flyway 관련 설정 추가 - local 환경 개발용 docker compose 추가 - yapp-net network 추가 - postgresql container 추가
* chore: app url, version 설정 추가 * chore: swagger config 추가 * feat: test용 controller 추가
* feat: User Entity 생성 및 UserPrincipal 세팅 * feat: ExceptionHandler 및 BaseResponse 세팅 * feat: Swagger 403/500 이슈 해결 및 auth 패키지 분리 * fix: spotlessApply * fix: @repository 제거 * fix: security 관련 설정 user 패키지로 이동 * fix: User Entity 및 repository 관련 파일 user 패키지로 이동 * fix: spotless 적용 --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local>
Chore/#2 S3
feat: transactionRunner 추가
* feat: 앱 버전 관리 API 기능 개발 * feat: 클래스 주석 추가 * fix: spotless 적용
* fix: 포즈 추천시 인원수 필터링 * test: test 코드 수정 * feat: 1차 작업 * fix: 포즈 스크랩 오동작 수정 및 포즈 스크랩 목록 조회 개발 --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local>
* chore: user domain dto 패키지명 통일 * feat: media domain 이미지 조회 후 업로드 usecase 추가 * feat: 사용자 정보 갱신 API * feat: 회원가입시 임의 닉네임 생성 * fix: 이미지 업로드 제거 * fix: 사용자 정보 조회 API 프로필 이미지 포함 * docs: user 도메인 swagger 스키마 추가 * fix: 사용자 프로필 이미지 검증 로직 추가 * fix: 사용자 프로필 이미지가 storageKey를 사용하게 수정 * fix: 기본 프로필 이미지 설정 추가 * docs: 사용자 정보 갱신 swagger docs 수정
* feat: application-prod.yaml 생성 및 flyway 싱크 * fix: user 테이블 email, oid nullable flyway 적용 및 code formmater 적용
* chore: local profile kakak api key 추가 * chore: user domain request 파일 병합 * chore: 사용하지 않는 메서드, 파일 삭제 * fix: 사용자 정보 수정, 프로필 이미지 수정 API 분리 * fix: 사용자 프로필 기본 이미지 설정 로직 추가 * fix: 사용자 프로필 수정 멱등성 반영 * test: 사용자 프로필 변경 테스트 추가
* fix: 소셜로그인 providerType 타입 String으로 변경 (대소문자 모두 허용을 위해) * fix: enum클래스 from 메서드 추가
* fix: 카카오 로그인 시 platform 파람 추가 할당 * fix: 프론트 검증을 위해 임시 배포 * fix: spotless 적용 * fix: 엑세스, 리프레쉬 토큰 expiry 변경 * fix: deploy-staging.yml fix/#106 브랜치 제거 * fix: auth Platform enum으로 타입 세이프 --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local>
fix: Brand 목록조회 id 오름차순으로 변경
* fix: 사용자 닉네임 최대 글자 수정 * fix: 사용자 닉네임 제약 조건 추가 * fix: 닉네임 제약 조건 메시지 수정 * chore: 닉네임 flyway 제약 조건 버전 추가
feat/#113: 포즈목록 조회시 scrap 여부 반환
* feat: 약관 목록 및 약관 동의 개발 * fix: 약관 목록 조회시 버전 컬럼 제거 * fix: Gemini 성능 개선 반영 * fix: 중복 정렬 코드 제거
* fix: 랜덤포즈 조회시 excludeIds 추가 * fix: 랜덤포즈 조회할 포즈 없을 시 문구 수정 * test: 테스트 코드 수정
Co-authored-by: darren <darren@darrenui-MacBookPro.local>
* fix: media 생성시 width, height 입력 받기 * fix: 포즈 상세 및 랜덤포즈 오동작 문제 해결 (관리자 계정만 동작했었음) --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local>
fix: : presignedURL 업로드 시 media 엔티티 size 추가 저장 (#129)
chore: iOS 개발/상용 키 분리 (#131)
# Conflicts: # src/main/kotlin/com/yapp2app/auth/infra/oauth/OidcTokenValidator.kt # src/main/kotlin/com/yapp2app/auth/infra/oauth/oidc/KakaoOidc.kt # src/main/kotlin/com/yapp2app/common/exception/handler/ExceptionHandler.kt # src/main/kotlin/com/yapp2app/common/filter/ServletFilterConfig.kt # src/main/kotlin/com/yapp2app/media/api/converter/MediaCommandConverter.kt # src/main/kotlin/com/yapp2app/media/api/dto/UploadTicketRequest.kt # src/main/kotlin/com/yapp2app/media/application/command/MediaCommand.kt # src/main/kotlin/com/yapp2app/media/application/port/MediaRepositoryPort.kt # src/main/kotlin/com/yapp2app/media/application/result/MediaResult.kt # src/main/kotlin/com/yapp2app/media/application/usecase/GenerateUploadTicketUseCase.kt # src/main/kotlin/com/yapp2app/media/application/usecase/GetMediaStorageInfoUseCase.kt # src/main/kotlin/com/yapp2app/media/application/usecase/GetMediaStorageInfosUseCase.kt # src/main/kotlin/com/yapp2app/media/domain/entity/Media.kt # src/main/kotlin/com/yapp2app/media/infra/persist/MediaRepositoryAdapter.kt # src/main/kotlin/com/yapp2app/media/infra/persist/jpa/JpaMediaRepository.kt # src/main/kotlin/com/yapp2app/photo/api/converter/PhotoImageResultConverter.kt # src/main/kotlin/com/yapp2app/photo/api/dto/PhotoImageResponse.kt # src/main/kotlin/com/yapp2app/photo/application/contract/MediaContract.kt # src/main/kotlin/com/yapp2app/photo/application/result/GetPhotosResult.kt # src/main/kotlin/com/yapp2app/photo/application/usecase/GetFavoritePhotosUseCase.kt # src/main/kotlin/com/yapp2app/photo/application/usecase/GetPhotoUseCase.kt # src/main/kotlin/com/yapp2app/photo/application/usecase/GetPhotosUseCase.kt # src/main/kotlin/com/yapp2app/photo/infra/client/PhotoMediaClient.kt # src/main/kotlin/com/yapp2app/pose/api/converter/PoseResultConverter.kt # src/main/kotlin/com/yapp2app/pose/api/converter/ScrapPoseResultConverter.kt # src/main/kotlin/com/yapp2app/pose/api/dto/PoseResponse.kt # src/main/kotlin/com/yapp2app/pose/application/contract/MediaAvailability.kt # src/main/kotlin/com/yapp2app/pose/application/port/MediaClientPort.kt # src/main/kotlin/com/yapp2app/pose/application/result/GetPosesResult.kt # src/main/kotlin/com/yapp2app/pose/application/usecase/GetPoseUseCase.kt # src/main/kotlin/com/yapp2app/pose/application/usecase/GetPosesUseCase.kt # src/main/kotlin/com/yapp2app/pose/application/usecase/GetScrapPosesUseCase.kt # src/main/kotlin/com/yapp2app/pose/application/usecase/RandomPoseUseCase.kt # src/main/kotlin/com/yapp2app/pose/infra/client/PoseMediaClient.kt # src/main/kotlin/com/yapp2app/pose/infra/persist/jpa/PosesQueryRepository.kt # src/main/resources/application-staging.yaml # src/main/resources/logback-spring.xml
Code Format Check ✅
|
Test ✅
|
Summary of ChangesHello @Darren4641, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! 이 풀 리퀘스트는 스테이징 환경의 변경 사항을 메인 브랜치로 병합하는 것을 목표로 합니다. 주요 변경 사항으로는 시스템 로깅 기능을 강화하여 API 요청의 수명주기 및 예외 처리에 대한 가시성을 높였습니다. 또한, 미디어 파일에 대한 width, height, size와 같은 추가 메타데이터를 저장하고 조회할 수 있도록 데이터 모델과 관련 API 및 비즈니스 로직을 확장했습니다. 이는 미디어 처리의 유연성을 높이고, 클라이언트 애플리케이션에서 더 풍부한 미디어 정보를 활용할 수 있게 합니다. Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Code Review
staging 브랜치를 main으로 병합하는 대규모 PR이네요. 전체적으로 클린 아키텍처 원칙을 잘 따르고 있고, 도메인과 레이어(api, application, domain, infra) 간의 역할 분리가 명확합니다. Port와 Adapter 패턴도 일관성 있게 사용되었습니다. 복잡한 쿼리에 QueryDSL을 사용하고, 보안을 위해 토큰 로테이션을 구현하고, 외부 API 호출에 대한 재시도 메커니즘을 갖추는 등 좋은 개발 프랙티스를 많이 발견할 수 있었습니다. 코드도 전반적으로 잘 작성되었습니다. 몇 가지 이슈를 발견했으며, 인증 DTO의 심각한 버그, 성능 개선 기회, 로깅 개선점 등이 포함됩니다. 전반적으로 애플리케이션의 견고한 기반이 될 것이라고 생각합니다.
I am having trouble creating individual review comments. Click here to see my feedback.
src/main/kotlin/com/yapp2app/auth/api/dto/AuthRequest.kt (12-17)
CreateAuthRequest의 idToken이 String?으로 선언되어 있지만, AuthCommandConverter에서 !! (non-null assertion)을 사용하여 NPE가 발생할 수 있습니다. @NotBlank 어노테이션은 null 값 자체는 허용하므로, null이 들어올 경우 런타임 에러가 발생합니다. 이 필드는 필수 값이므로 nullable이 아니어야 합니다.
data class CreateAuthRequest(
@field:NotBlank(message = "ID 토큰은 필수 입니다")
val idToken: String,
@field:Pattern(regexp = "^(android|ios)$", message = "플랫폼은 android 또는 ios만 가능합니다")
val platform: String? = null,
)
src/main/kotlin/com/yapp2app/auth/api/dto/AuthRequest.kt (19)
RefreshTokenRequest의 refreshToken이 String?으로 선언되어 있지만, AuthCommandConverter에서 !! (non-null assertion)을 사용하여 NPE가 발생할 수 있습니다. @NotBlank 어노테이션은 null 값 자체는 허용하므로, null이 들어올 경우 런타임 에러가 발생합니다. 이 필드는 필수 값이므로 nullable이 아니어야 합니다.
data class RefreshTokenRequest(@field:NotBlank(message = "Refresh 토큰은 필수입니다") val refreshToken: String)
build.gradle.kts (8)
Spring Boot 버전을 3.5.8로 설정하셨는데, 이는 아직 출시되지 않은 미래 버전입니다. 아마도 오타인 것 같습니다. 현재 안정 버전(예: 3.3.1)이나 프로젝트에서 의도한 다른 버전(예: 3.2.8)으로 수정해야 합니다. 잘못된 버전은 의존성 문제를 일으킬 수 있습니다.
id("org.springframework.boot") version "3.3.1"src/main/kotlin/com/yapp2app/auth/infra/oauth/helper/KakaoOauthHelper.kt (168-176)
예외 처리 시 e.printStackTrace()를 사용하고 있습니다. 이는 로깅 프레임워크의 제어를 벗어나 표준 에러 스트림으로 출력되므로, 로그 수집 및 관리가 어려워질 수 있습니다. log.error()를 사용하여 예외를 기록하는 것이 좋습니다. AppleOauthHelper.kt 파일에도 동일한 패턴이 존재하니 함께 수정하는 것을 권장합니다.
} catch (e: ExpiredJwtException) {
log.error("Token verification failed: {}", e) // TODO 캐싱이후로 oidc검증 실패시 어떤 예외 찍히는지 모니터링용
throw BusinessException(ResultCode.EXPIRED_TOKEN_ERROR)
} catch (e: Exception) {
log.error("Token verification failed: {}", e) // TODO 캐싱이후로 oidc검증 실패시 어떤 예외 찍히는지 모니터링용
throw BusinessException(ResultCode.INVALID_TOKEN_ERROR)
}src/main/kotlin/com/yapp2app/photo/infra/persist/PhotoImageRepositoryAdapter.kt (47-57)
deleteOwnedPhotos 메소드에서 jpaRepository.deleteAll(photos)를 사용하여 여러 사진을 삭제하고 있습니다. 이 방식은 각 엔티티에 대해 개별적인 DELETE 쿼리를 생성하여 성능 저하를 유발할 수 있습니다. 대량 삭제 시에는 deleteAllInBatch()를 사용하는 것이 더 효율적입니다.
override fun deleteOwnedPhotos(userId: Long, photoIds: List<Long>): List<PhotoImage> {
val photos = jpaRepository.findAllByUserIdAndIdIn(userId, photoIds)
if (photos.isEmpty()) {
return emptyList()
}
jpaRepository.deleteAllInBatch(photos)
return photos
}* feat: 이미지 조회를 위한 분산락 추가 * feat: redis media 캐시 어댑터 추가 * ref: 메서드 시그니처 변경에 따른 media fake 구현체 메서드 수정 * chore: 사용하지 않는 클래스 제거 * feat: media 조회 usecase 분산락 추가 * feat: redis binary template 추가 * feat: async config 추가 * fix: Redis 분산락 test profile 추가 * fix: media S3 fallback 후 cache 재확인 * fix: RedisMediaBinaryCacheAdapter nullable type 수정 * fix: media 캐시 ttl 만료 전 expire로 갱신하도록 수정 * fix: async 설정 제거 * fix: media type별 캐시 ttl 적용 * fix: 분산락 single-flight 제거
Code Format Check ✅
|
Test ✅
|
Description