Skip to content

[Release] merge develop to main#52

Merged
seoahS01 merged 61 commits into
mainfrom
develop
Feb 13, 2026
Merged

[Release] merge develop to main#52
seoahS01 merged 61 commits into
mainfrom
develop

Conversation

@seoahS01
Copy link
Copy Markdown
Contributor

#️⃣ 연관된 이슈

관련된 이슈 번호를 적어주세요. 예: #이슈번호

#️⃣ 작업 내용

이번 PR에서 작업한 내용을 간략히 설명해주세요. (이미지 첨부 가능)

#️⃣ 테스트 결과

코드 변경에 대해 테스트를 수행한 결과를 요약해주세요. 예: 모든 테스트 통과 여부, 새로 작성한 테스트 케이스 등

#️⃣ 변경 사항 체크리스트

  • 코드에 영향이 있는 모든 부분에 대한 테스트를 작성하고 실행했나요?
  • 문서를 작성하거나 수정했나요? (필요한 경우)
  • 코드 컨벤션에 따라 코드를 작성했나요?
  • 본 PR에서 발생할 수 있는 모든 의존성 문제가 해결되었나요?

#️⃣ 스크린샷 (선택)

관련된 스크린샷이 있다면 여기에 첨부해주세요.

#️⃣ 리뷰 요구사항 (선택)

리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요.
예시: 이 부분의 코드가 잘 작동하는지 테스트해 주실 수 있나요?

📎 참고 자료 (선택)

관련 문서, 스크린샷, 또는 예시 등이 있다면 여기에 첨부해주세요

seoahS01 and others added 30 commits January 13, 2026 14:43
[Feature] Oauth 유저 조회 방법 수정
seoahS01 and others added 24 commits February 11, 2026 03:31
[Feature] 폴더 이동, 이름 수정, 조회, 삭제 API 구현
[Feature] 이메일 인증 여부 반환 api 구현
[Feature] 전체 허용과 편집 허용 분리
[Fix] ImageUrl 어노테이션 수정 및 마이페이지 로직 변경
[Fix] 변수명 및 매개변수 순서 변경
[Feature] 누끼따기 및 첫 템플릿 합성 API 구현
@seoahS01 seoahS01 merged commit ac65e1a into main Feb 13, 2026
@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello @seoahS01, 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!

이 PR은 AI 기반 이미지 처리 기능을 도입하고, 기존 폴더 관리 시스템을 대폭 개선하며, 인증 관련 기능을 확장합니다. 사용자들은 이제 AI를 활용하여 이미지 배경을 제거하거나 템플릿에 합성할 수 있으며, 폴더를 더욱 유연하게 관리(삭제, 이름 변경, 이동, 하위 폴더 조회)할 수 있게 됩니다. 또한, 이메일 인증 상태를 확인하는 새로운 API가 추가되었고, Google OAuth 사용자 식별 방식이 업데이트되었습니다. 이러한 변경 사항들은 전반적인 시스템의 기능성과 유용성을 크게 향상시킬 것입니다.

Highlights

  • AI 기반 이미지 처리 기능 도입: Gemini AI 클라이언트를 통합하여 이미지 배경 제거 및 템플릿 합성 기능을 추가했습니다. S3 프리사인 URL 발급, 이미지 업로드/다운로드 유틸리티도 함께 도입되었습니다.
  • 폴더 관리 기능 강화: 폴더 삭제, 이름 변경, 폴더 이동 기능이 추가되었으며, 특정 폴더의 하위 폴더를 페이지네이션하여 조회하는 API가 구현되었습니다. 폴더 권한 시스템도 확장되어 FULL_ACCESS 권한이 추가되고, 공유 및 방문 가능 여부를 확인하는 로직이 개선되었습니다.
  • 이메일 인증 및 OAuth 로직 개선: 이메일 인증 상태를 확인할 수 있는 새로운 API 엔드포인트가 추가되었고, Google OAuth 사용자 조회 방식이 googleSub 대신 이메일을 사용하도록 변경되었습니다.
  • 새로운 Project 엔티티 및 관련 서비스 도입: 이미지 생성을 관리하기 위한 Project 엔티티가 새로 추가되었으며, 이에 따라 Image 엔티티 구조가 변경되고 ProjectService가 도입되었습니다.
  • 템플릿 검색 기능 추가 및 이미지 URL 처리 개선: 키워드를 이용한 템플릿 검색 기능이 추가되었고, ImageUrl 어노테이션의 동작 방식이 개선되어 이미지 도메인과 객체 키 사이에 슬래시가 자동으로 추가되도록 변경되었습니다.
Changelog
  • src/main/java/net/studioxai/studioxBe/StudioxBeApplication.java
    • Gemini AI 관련 설정 클래스 임포트 및 활성화 어노테이션이 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/auth/controller/CustomAuthController.java
    • 이메일 유효성 검증을 위한 @Email@NotBlank 어노테이션이 추가되었습니다.
    • @Validated 어노테이션이 컨트롤러에 추가되었습니다.
    • 이메일 인증 상태를 조회하는 GET /v1/auth/email/validation 엔드포인트가 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/auth/controller/OauthController.java
    • Google OAuth 콜백 경로가 /oauth/google/callback에서 /v1/oauth/google/callback으로 변경되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/auth/dto/response/EmailValidationResponse.java
    • 이메일과 인증 여부를 담는 EmailValidationResponse 레코드가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/auth/entity/EmailVerificationToken.java
    • 불필요한 빈 줄이 제거되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/auth/service/AuthService.java
    • EmailValidationResponse 클래스가 임포트되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/auth/service/EmailVerificationService.java
    • EmailValidationResponse 클래스가 임포트되었습니다.
    • 이메일의 인증 상태를 확인하는 getEmailValidation 메서드가 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/auth/service/OauthService.java
    • Google OAuth 사용자 조회 로직이 findByGoogleSub에서 findByEmail로 변경되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/folder/controller/FolderController.java
    • java.util.List 임포트가 제거되었습니다.
    • Spring Data의 Sort 클래스가 임포트되었습니다.
    • 특정 폴더의 하위 폴더를 페이지네이션하여 조회하는 GET /v1/folder/{folderId} 엔드포인트가 추가되었습니다.
    • 폴더를 삭제하는 DELETE /v1/folder/{folderId} 엔드포인트가 추가되었습니다.
    • 폴더 이름을 업데이트하는 PUT /v1/folder/{folderId}/name 엔드포인트가 추가되었습니다.
    • 폴더를 이동하는 PUT /v1/folder/{targetFolderId}/{destinationFolderId} 엔드포인트가 추가되었습니다.
    • myfolders 엔드포인트가 folderService.getMyFolders를 호출하도록 변경되었습니다.
    • 폴더 연결 해제 엔드포인트 경로가 /v1/folder/{folderId}에서 /v1/folder/{folderId}/link로 변경되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/folder/controller/FolderManagerController.java
    • Permission enum이 임포트되었습니다.
    • folderManagerUpdate 엔드포인트가 Permission을 요청 파라미터로 받도록 수정되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/folder/dto/FoldersDto.java
    • 폴더 상세 정보를 담는 FoldersDto 레코드가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/folder/dto/response/FolderResponse.java
    • 사용되지 않는 FolderResponse 파일이 제거되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/folder/dto/response/FoldersResponse.java
    • 페이지네이션된 폴더 목록을 담는 FoldersResponse 레코드가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/folder/entity/Folder.java
    • 폴더 이름을 업데이트하는 updateName 메서드가 추가되었습니다.
    • 폴더를 이동시키는 move 메서드가 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/folder/entity/FolderManager.java
    • updateDirectPermission 메서드가 Permission enum을 파라미터로 받도록 수정되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/folder/entity/enums/Permission.java
    • FULL_ACCESS 권한이 추가되었습니다.
    • toggle() 추상 메서드 및 구현이 제거되었습니다.
    • canShare 필드와 isShareable() 메서드가 추가되었습니다.
    • 생성자 파라미터가 업데이트되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/folder/exception/FolderErrorCode.java
    • 폴더 이동 관련 오류 코드 INVALID_FOLDER_HIERARCHY_MOVEINVALID_MOVE_FOLDER_TO_ITSELF가 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/folder/repository/ClosureFolderMoveRepository.java
    • 클로저 테이블의 복잡한 이동 작업을 처리하는 ClosureFolderMoveRepository가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/folder/repository/ClosureFolderRepository.java
    • @Modifying 임포트가 추가되었습니다.
    • 하위 폴더 ID를 찾는 findDescendantFolderIds 메서드가 추가되었습니다.
    • 조상 ID 목록으로 삭제하는 deleteByAncestorIds 메서드가 추가되었습니다.
    • 자손 ID 목록으로 삭제하는 deleteByDescendantIds 메서드가 추가되었습니다.
    • 읽기 가능한 하위 폴더 존재 여부를 확인하는 existsReadableDescendant 메서드가 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/folder/repository/FolderManagerRepository.java
    • @Modifying 임포트가 추가되었습니다.
    • 폴더 ID 목록으로 폴더 관리자를 일괄 삭제하는 deleteAllByFolderIds 메서드가 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/folder/repository/FolderRepository.java
    • FoldersDto, Page, PageRequest, Pageable 임포트가 추가되었습니다.
    • 부모 폴더로 페이지네이션된 하위 폴더를 찾는 findByParentFolder 메서드가 추가되었습니다.
    • updateAclRootForSubtree 메서드가 targetFolderId를 파라미터로 받도록 수정되었습니다.
    • 폴더 ID 목록으로 폴더를 일괄 삭제하는 deleteAllByIdsIn 메서드가 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/folder/service/FolderManagerService.java
    • 사용되지 않는 UserErrorCode, UserExceptionHandler, UserRepository 임포트가 제거되었습니다.
    • updatePermission 메서드가 Permission enum을 파라미터로 받도록 수정되었습니다.
    • inviteManagerupdatePermission 메서드에서 isUserWritable 대신 isUserShareable을 사용하도록 변경되었습니다.
    • 폴더 방문 가능 여부를 확인하는 canVisit 메서드가 추가되었습니다.
    • 사용자의 읽기 권한을 확인하는 isUserReadable 메서드가 추가되었습니다.
    • 사용자의 공유 권한을 확인하는 isUserShareable 메서드가 추가되었습니다.
    • isUserAdmin 메서드가 제거되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/folder/service/FolderService.java
    • FoldersDto, FoldersResponse, Page, PageRequest, Sort, PageInfo 임포트가 추가되었습니다.
    • FolderManagerRepositoryClosureFolderMoveRepository가 주입되었습니다.
    • 특정 폴더의 하위 폴더를 페이지네이션하여 조회하는 getFoldersByFolderId 메서드가 추가되었습니다.
    • changeLinkMode 메서드에서 updateAclRootForSubtree 호출 시 targetFolderId를 전달하도록 수정되었습니다.
    • findFolders 메서드가 getMyFolders로 이름이 변경되었습니다.
    • 폴더를 재귀적으로 삭제하는 deleteFolder 메서드가 추가되었습니다.
    • 폴더 이름을 업데이트하는 updateFolderName 메서드가 추가되었습니다.
    • 폴더를 이동시키는 moveFolder 메서드가 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/controller/ImageController.java
    • S3 프리사인 URL 발급, AI 기반 이미지 배경 제거 및 합성, 이미지 상세 조회를 위한 ImageController가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/controller/ProjectController.java
    • 프로젝트 대시보드 데이터를 조회하는 ProjectController가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/dto/request/CutoutImageGenerateRequest.java
    • 컷아웃 이미지 생성을 위한 CutoutImageGenerateRequest 레코드가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/dto/request/ImageGenerateRequest.java
    • 합성 이미지 생성을 위한 ImageGenerateRequest 레코드가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/dto/response/CutoutImageGenerateResponse.java
    • 컷아웃 이미지 생성 응답을 위한 CutoutImageGenerateResponse 레코드가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/dto/response/ImageDetailResponse.java
    • 이미지 상세 정보를 위한 ImageDetailResponse 레코드가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/dto/response/ImageGenerateResponse.java
    • 합성 이미지 생성 응답을 위한 ImageGenerateResponse 레코드가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/dto/response/PresignResponse.java
    • S3 프리사인 URL 응답을 위한 PresignResponse 레코드가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/dto/response/ProjectDashboardResponse.java
    • 프로젝트 대시보드 응답을 위한 ProjectDashboardResponse 레코드가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/entity/Image.java
    • Image 엔티티에서 foldertemplate 필드가 제거되고 project 필드로 대체되었습니다.
    • rawImageUrlimageUrl 필드가 imageObjectKey로 이름이 변경되었습니다.
    • 이미지 생성을 위한 create 빌더 메서드가 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/entity/Project.java
    • 컷아웃 이미지, 템플릿, 폴더, 제목, 대표 이미지 필드를 포함하는 Project 엔티티가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/exception/ImageErrorCode.java
    • 템플릿을 찾을 수 없거나 S3 및 AI 관련 오류를 위한 새로운 오류 코드들이 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/exception/ImageExceptionHandler.java
    • 이미지 관련 예외 처리를 위한 ImageExceptionHandler가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/exception/ProjectErrorCode.java
    • 프로젝트를 찾을 수 없을 때 발생하는 PROJECT_NOT_FOUND 오류 코드가 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/exception/ProjectExceptionHandler.java
    • 프로젝트 관련 예외 처리를 위한 ProjectExceptionHandler가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/repository/ImageRepository.java
    • 폴더 기반 이미지 조회 메서드들이 제거되었습니다.
    • @EntityGraph를 사용하여 프로젝트, 템플릿, 폴더 정보를 함께 가져오는 findDetailById 메서드가 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/repository/ProjectRepository.java
    • Project 엔티티를 관리하는 ProjectRepository가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/service/ImageService.java
    • 새로운 리포지토리 및 서비스(ProjectRepository, TemplateRepository, FolderRepository, S3UrlHandler, S3ImageLoader, S3ImageUploader, GeminiImageClient, FolderManagerService, ProjectService)가 주입되었습니다.
    • 기존 이미지 조회 메서드들이 제거되었습니다.
    • S3 프리사인 URL을 발급하는 issuePresign 메서드가 추가되었습니다.
    • AI 기반 배경 제거 이미지를 생성하는 generateCutoutImage 메서드가 추가되었습니다.
    • AI 기반 합성 이미지를 생성하는 generateImage 메서드가 추가되었습니다.
    • 이미지 상세 정보를 조회하는 getImage 메서드가 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/image/service/ProjectService.java
    • Project 엔티티를 관리하는 ProjectService가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/template/controller/TemplateController.java
    • TemplateByKeywordResponseTemplateCategoryGet 임포트가 업데이트되었습니다.
    • 키워드 기반 템플릿 검색을 위한 searchTemplates 엔드포인트가 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/template/dto/TemplateCategoryGet.java
    • 파일이 src/main/java/net/studioxai/studioxBe/domain/template/dto/response/TemplateCategoryGet.java로 이름이 변경되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/template/dto/TemplateKeywordGet.java
    • 사용되지 않는 TemplateKeywordGet 파일이 제거되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/template/dto/response/TemplateByKeywordResponse.java
    • imageUrl 필드가 imageObjectKey로 이름이 변경되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/template/entity/Template.java
    • imageUrl 필드가 imageObjectKey로 이름이 변경되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/template/entity/TemplateKeywordType.java
    • 키워드 제목으로 검색하는 findByTitleLike 정적 메서드가 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/template/exception/TemplateManagerErrorCode.java
    • enum 정의에 세미콜론이 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/template/repository/TemplateKeywordRepository.java
    • TemplateByKeywordResponse 생성자가 imageObjectKey를 사용하도록 업데이트되었습니다.
    • 키워드 기반 템플릿을 검색하는 searchByKeyword 메서드가 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/template/repository/TemplateRepository.java
    • TemplateByCategoryResponse 생성자가 imageObjectKey를 사용하도록 업데이트되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/template/service/TemplateService.java
    • 임포트가 업데이트되었습니다.
    • getTemplatesByCategory 메서드가 imageObjectKey를 사용하도록 수정되었습니다.
    • 키워드 기반 템플릿을 검색하는 searchTemplatesByKeyword 메서드가 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/user/dto/request/ProfileUpdateRequest.java
    • profileImage 필드의 유효성 검증 로직이 간소화되었습니다.
  • src/main/java/net/studioxai/studioxBe/domain/user/repository/UserRepository.java
    • findByGoogleSub 메서드가 제거되었습니다.
  • src/main/java/net/studioxai/studioxBe/global/annotation/ImageUrl.java
    • JacksonAnnotationsInside 임포트 및 어노테이션이 추가되었습니다.
    • @TargetMETHODPARAMETER를 포함하도록 확장되었습니다.
  • src/main/java/net/studioxai/studioxBe/global/aop/ImageUrlSerializer.java
    • BeanProperty, JsonMappingException, ContextualSerializer 임포트가 추가되었습니다.
    • ContextualSerializer가 구현되었고 createContextual 메서드가 추가되었습니다.
    • 이미지 URL 변환 시 imageDomainimage 사이에 슬래시(/)를 추가하도록 수정되었습니다.
  • src/main/java/net/studioxai/studioxBe/global/config/AiPropertiesConfig.java
    • AI 속성 설정을 위한 AiPropertiesConfig 클래스가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/infra/ai/dto/request/GeminiGenerateRequest.java
    • Gemini API 요청을 위한 GeminiGenerateRequest 레코드가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/infra/ai/dto/response/GeminiGenerateResponse.java
    • Gemini API 응답을 위한 GeminiGenerateResponse 레코드가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/infra/ai/exception/AiErrorCode.java
    • AI 관련 오류 처리를 위한 새로운 오류 코드들이 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/infra/ai/exception/AiExceptionHandler.java
    • AI 관련 예외 처리를 위한 AiExceptionHandler가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/infra/ai/gemini/GeminiImageClient.java
    • Gemini API를 사용하여 이미지 배경 제거 및 합성 이미지를 생성하는 GeminiImageClient가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/infra/ai/gemini/GeminiProperties.java
    • Gemini API 설정을 위한 GeminiProperties 레코드가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/infra/s3/S3ImageLoader.java
    • S3에서 이미지를 Base64로 로드하는 S3ImageLoader 컴포넌트가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/infra/s3/S3ImageUploader.java
    • 바이트 배열을 S3에 업로드하는 S3ImageUploader 컴포넌트가 새로 추가되었습니다.
  • src/main/java/net/studioxai/studioxBe/infra/s3/S3UrlService.java
    • PresignResponseRequestBody 임포트가 추가되었습니다.
  • src/test/java/net/studioxai/studioxBe/auth/EmailVerificationServiceTest.java
    • 어설션 라이브러리가 Assertions에서 assertThat으로 변경되었습니다.
    • getEmailValidation 메서드에 대한 테스트 케이스가 추가되었습니다.
  • src/test/java/net/studioxai/studioxBe/auth/OauthServiceTest.java
    • Google OAuth 사용자 조회 로직이 findByEmail을 사용하도록 테스트가 업데이트되었습니다.
  • src/test/java/net/studioxai/studioxBe/folder/FolderManagerServiceTest.java
    • updatePermission 메서드 호출 시 Permission 파라미터가 포함되도록 테스트가 업데이트되었습니다.
    • 권한 확인 로직이 조정되었으며, canVisitisUserReadable 메서드에 대한 테스트가 추가되었습니다.
  • src/test/java/net/studioxai/studioxBe/folder/FolderServiceTest.java
    • 새로운 리포지토리들이 테스트에 주입되었습니다.
    • changeLinkMode 호출이 업데이트되었습니다.
    • findFoldersgetMyFolders로 이름이 변경되었습니다.
    • getFoldersByFolderId, deleteFolder, updateFolderName, moveFolder 메서드에 대한 테스트가 추가되었습니다.
  • src/test/java/net/studioxai/studioxBe/image/ImageServiceTest.java
    • 새로운 이미지 생성 및 관리 기능에 대한 테스트를 위해 대대적으로 리팩토링되었습니다.
  • src/test/java/net/studioxai/studioxBe/template/TemplateServiceTest.java
    • getTemplatesByCategorygetTemplatesByKeywords 테스트가 imageObjectKey를 사용하도록 업데이트되었습니다.
    • searchTemplatesByKeyword 메서드에 대한 테스트가 추가되었습니다.
Using Gemini Code Assist

The 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 /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

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 .gemini/ folder in the base of the repository. Detailed instructions can be found here.

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

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request introduces a significant number of new features, including image generation capabilities with AI, project management, and extensive enhancements to the folder and permission system. The overall direction is good, with many improvements to the data model and API design. However, I've identified a critical security vulnerability where an endpoint exposes all users' projects, which must be addressed immediately. I've also found some high-severity performance issues related to database operations that should be fixed. Additionally, there are several opportunities for medium-severity improvements regarding API design, code clarity, and removal of redundant code. Please review the detailed comments for specific suggestions.

Comment on lines +28 to +32
public List<ProjectDashboardResponse> getProjects() {
return projectRepository.findAll().stream()
.map(ProjectDashboardResponse::from)
.toList();
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

critical

This method fetches and returns all projects from all users by calling projectRepository.findAll(). This is a critical security vulnerability as it exposes potentially sensitive user data to anyone who calls this endpoint. The query must be scoped to retrieve only the projects belonging to the currently authenticated user. You should pass the user's ID to this method and update the repository to filter projects based on user ownership or permissions.

Comment on lines +157 to +159
Long existsReadableDescendant(@Param("folderId") Long folderId,
@Param("aclRootFolderId") Long aclRootFolderId,
@Param("userId") Long userId);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

high

The method parameter aclRootFolderId is declared but not used within the native query. The query instead relies on fd.acl_root_folder_id fetched from a join. This discrepancy can lead to confusion and potential bugs. Please either utilize the :aclRootFolderId parameter in your query or remove it from the method signature if it's truly not needed.

Comment on lines +141 to +144
for (Long id : subFolderIds) {
folderRepository.deleteById(id);
folderRepository.flush();
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

high

Deleting folders one by one within a loop and flushing after each deletion is inefficient and can lead to significant performance degradation, especially for folders with many sub-items. The FolderRepository already provides a deleteAllByIdsIn(List<Long> folderIds) method for bulk deletion. Using this method will perform the deletion in a single, much more efficient database operation.

        folderRepository.deleteAllByIdsIn(subFolderIds);

Comment on lines +7 to +9
public static EmailValidationResponse create(String email, boolean isVerified) {
return new EmailValidationResponse(email, isVerified);
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The static factory method create is redundant for a Java record. Records automatically provide a public canonical constructor, so you can instantiate this record directly using new EmailValidationResponse(email, isVerified). Removing this method will result in cleaner and more idiomatic code. This feedback also applies to FoldersDto and FoldersResponse.

}

public EmailValidationResponse getEmailValidation(String email) {
boolean isAvailable = verifiedEmailRepository.findById(email).isPresent();
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The variable name isAvailable is misleading in this context. The method checks if an email has been verified. Renaming the variable to isVerified would make the code's intent clearer and align it with the field name in the EmailValidationResponse DTO.

Suggested change
boolean isAvailable = verifiedEmailRepository.findById(email).isPresent();
boolean isVerified = verifiedEmailRepository.findById(email).isPresent();
References
  1. In a DTO, a boolean field representing email verification status should be named isVerified for clarity, rather than a more generic name like isAvailable.

Comment on lines 29 to 36
public void folderManagerUpdate(
@AuthenticationPrincipal JwtUserPrincipal principal,
@PathVariable Long folderId,
@PathVariable Long targetUserId
@PathVariable Long targetUserId,
@RequestParam Permission permission
) {
folderManagerService.updatePermission(principal.userId(), targetUserId, folderId);
folderManagerService.updatePermission(principal.userId(), targetUserId, folderId, permission);
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

Using PUT with @RequestParam is not a standard RESTful practice for updates. PUT requests are typically expected to contain the resource's state in the request body. To make this endpoint more REST-compliant, consider passing the permission in the request body.

For example:

// DTO
public record UpdatePermissionRequest(
    @NotNull Permission permission
) {}

// Controller method
@PutMapping("/v1/folder/manager/{folderId}/{targetUserId}")
public void folderManagerUpdate(
        @AuthenticationPrincipal JwtUserPrincipal principal,
        @PathVariable Long folderId,
        @PathVariable Long targetUserId,
        @RequestBody @Valid UpdatePermissionRequest request
) {
    folderManagerService.updatePermission(principal.userId(), targetUserId, folderId, request.permission());
}

Comment on lines +13 to +23
public static FoldersDto create(
Long folderId,
String folderName,
List<String> images
) {
return new FoldersDto(
folderId,
folderName,
images
);
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The static factory method create is redundant for a Java record. Records automatically provide a public canonical constructor. You can directly instantiate the record using new FoldersDto(...), which makes the code more concise and idiomatic.

Comment on lines +12 to +14
public static FoldersResponse create(List<FoldersDto> folders, PageInfo pageInfo) {
return new FoldersResponse(folders, pageInfo);
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The static factory method create is redundant for a Java record. Records automatically provide a public canonical constructor. You can directly instantiate the record using new FoldersResponse(...), which makes the code more concise and idiomatic.


return folderManagerRepository.save(
FolderManager.create(targetUser, folder, permission)
FolderManager.create(targetUser, folder, userPermission)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

When creating a new FolderManager entry, it is first created with the user's existing inherited permission (userPermission) and then immediately updated to the new permission in a subsequent step. This results in an unnecessary UPDATE query right after an INSERT. You can optimize this by creating the FolderManager directly with the new permission from the request.

Suggested change
FolderManager.create(targetUser, folder, userPermission)
FolderManager.create(targetUser, folder, permission)

Comment on lines +7 to +9
@Configuration
@EnableConfigurationProperties(GeminiProperties.class)
public class AiPropertiesConfig {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

This configuration class is redundant. The main application class, StudioxBeApplication, is already annotated with @ConfigurationPropertiesScan, which automatically discovers and registers @ConfigurationProperties beans like GeminiProperties. You can safely remove this class to simplify the configuration.

@jiminnimij jiminnimij changed the title develop to main [Release] merge develop to main Feb 13, 2026
@jiminnimij jiminnimij added the 🌏Deploy 배포 관련 label Feb 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🌏Deploy 배포 관련

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants