Skip to content

[DDING-000] VodProcessingJob 필드 수정 #204

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jan 9, 2025
Merged

Conversation

5uhwann
Copy link
Collaborator

@5uhwann 5uhwann commented Jan 9, 2025

🚀 작업 내용

  • VodProcessingJob 엔티티 필드 추가
    • FileMetaData
  • 트리깅을 통한 VodProcessingJob 생성 시 FileMetaData 지정 로직 추가

🤔 고민했던 내용

  • 피드 업로드 시 VodProcessingJob status에 따른 notification 전송 시 2가지 케이스가 존재하는데 이를 모두 만족하기 위해 feedId를 확인해야 하기 때문에 VodProcessingJob 필드에 FileMetaData를 추가하여 이를 해결했습니다.
  • 2가지 케이스
    1. 피드 업로드 완료 시 이미 jobStatus가 COMPLETE일 경우 즉시 notification 전송
      (Feed 기준 내 vodProcessingJob을 식별해야 함)
    2. 피드 업로드 완료 시 아직 jobStatus가 COMPLETE가 아닐 경우 jobStatus가 complete로 변경되는 시점에 notify
      (VodPorcessingJob 기준 해당되는 Feed 식별해야 함)

💬 리뷰 중점사항

Summary by CodeRabbit

  • 새로운 기능

    • VOD 처리 작업에 파일 메타데이터 연결 기능 추가
    • 파일 ID를 사용한 VOD 처리 작업 생성 지원
  • 개선 사항

    • VOD 처리 작업과 파일 메타데이터 간 일대일 관계 구현
    • 데이터베이스 스키마 업데이트로 파일 메타데이터 참조 지원
  • 기술적 변경

    • 관련 서비스 및 엔티티 클래스 업데이트
    • 테스트 케이스 확장 및 검증 로직 개선

@5uhwann 5uhwann added 🎯리팩토링 리팩토링 및 고도화 이슈 D-0 labels Jan 9, 2025
@5uhwann 5uhwann self-assigned this Jan 9, 2025
Copy link

coderabbitai bot commented Jan 9, 2025

워크스루

이 풀 리퀘스트는 비디오 처리 작업(VodProcessingJob)과 파일 메타데이터(FileMetaData) 간의 관계를 구현합니다. 새로운 fileId 필드를 추가하여 CreatePendingVodProcessingJobRequest와 관련 클래스들을 수정했습니다. 데이터베이스 마이그레이션 스크립트를 통해 vod_processing_job 테이블에 file_meta_data_id 컬럼을 추가하고, 외래 키 제약 조건을 설정했습니다.

변경 사항

파일 경로 변경 요약
src/.../CreatePendingVodProcessingJobRequest.java fileId 필드 추가, @NotNull@UUID 검증
src/.../VodProcessingJob.java FileMetaData 엔티티와의 일대일 관계 추가
src/.../FacadeVodProcessingJobServiceImpl.java FileMetaDataService 의존성 추가, create 메서드 수정
src/.../CreatePendingVodProcessingJobCommand.java fileId 필드 추가, toPendingVodProcessingJob 메서드 변경
src/.../V32__alter_table_vod_proceessing_job_add_column.sql file_meta_data_id 컬럼 추가, 외래 키 및 고유성 제약 조건 설정

가능한 관련 PR들

제안된 레이블

✨기능

제안된 리뷰어

  • wonjunYou

Finishing Touches

  • 📝 Generate Docstrings

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

sonarqubecloud bot commented Jan 9, 2025

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (8)
src/main/java/ddingdong/ddingdongBE/domain/vodprocessing/controller/dto/request/CreatePendingVodProcessingJobRequest.java (1)

13-15: 오타 수정이 필요합니다

검증 메시지에 오타가 있습니다: "빌수입니다" → "필수입니다"

-        @NotNull(message = "파일Id는 빌수입니다.")
+        @NotNull(message = "파일Id는 필수입니다.")
src/main/java/ddingdong/ddingdongBE/domain/vodprocessing/entity/VodProcessingJob.java (2)

33-35: cascade 설정 검토가 필요합니다

FileMetaData와의 일대일 관계에서 cascade 동작을 명시적으로 정의하는 것이 좋습니다. VodProcessingJob이 삭제될 때 FileMetaData의 처리 방식을 명확히 해야 합니다.

-    @OneToOne(fetch = FetchType.LAZY)
+    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
     @JoinColumn(name = "file_meta_data_id")
     private FileMetaData fileMetaData;

47-54: 생성자 매개변수 정렬이 필요합니다

가독성을 위해 생성자의 매개변수를 더 깔끔하게 정렬하는 것이 좋습니다.

-    private VodProcessingJob(Long id, VodProcessingNotification vodProcessingNotification, FileMetaData fileMetaData,
-                             String convertJobId, String userId, ConvertJobStatus convertJobStatus) {
+    private VodProcessingJob(
+            Long id,
+            VodProcessingNotification vodProcessingNotification,
+            FileMetaData fileMetaData,
+            String convertJobId,
+            String userId,
+            ConvertJobStatus convertJobStatus
+    ) {
src/test/java/ddingdong/ddingdongBE/domain/vodprocessing/service/FacadeGeneralVodProcessingJobServiceTest.java (3)

29-30: 생성자 주입 방식으로 변경 권장

@Autowired 필드 주입보다는 생성자 주입 방식을 사용하는 것이 권장됩니다. 이는 다음과 같은 이점이 있습니다:

  • 불변성 보장
  • 순환 참조 방지
  • 테스트 용이성 향상

다음과 같이 변경하는 것을 추천드립니다:

-    @Autowired
-    private FacadeVodProcessingJobService facadeVodProcessingJobService;
-    @Autowired
-    private VodProcessingJobRepository vodProcessingJobRepository;
-    @Autowired
-    private FileMetaDataRepository fileMetaDataRepository;

+    private final FacadeVodProcessingJobService facadeVodProcessingJobService;
+    private final VodProcessingJobRepository vodProcessingJobRepository;
+    private final FileMetaDataRepository fileMetaDataRepository;
+
+    public FacadeGeneralVodProcessingJobServiceTest(
+            FacadeVodProcessingJobService facadeVodProcessingJobService,
+            VodProcessingJobRepository vodProcessingJobRepository,
+            FileMetaDataRepository fileMetaDataRepository) {
+        this.facadeVodProcessingJobService = facadeVodProcessingJobService;
+        this.vodProcessingJobRepository = vodProcessingJobRepository;
+        this.fileMetaDataRepository = fileMetaDataRepository;
+    }

36-38: 테스트 헬퍼 메서드 추출 권장

테스트 데이터 생성 로직을 별도의 헬퍼 메서드로 추출하면 테스트 코드의 가독성과 재사용성이 향상됩니다.

다음과 같이 변경하는 것을 추천드립니다:

+    private FileMetaData createTestFileMetaData() {
+        UUID fileId = UuidCreator.getTimeBased();
+        FileMetaData fileMetaData = FileMetaData.createPending(fileId, "test", "test");
+        return fileMetaDataRepository.save(fileMetaData);
+    }

     @Test
     void createPendingVodProcessingJob() {
         //given
-        UUID fileId = UuidCreator.getTimeBased();
-        FileMetaData fileMetaData = FileMetaData.createPending(fileId, "test", "test");
-        FileMetaData savedFileMetaData = fileMetaDataRepository.save(fileMetaData);
+        FileMetaData savedFileMetaData = createTestFileMetaData();

51-56: 테스트 검증 강화 필요

현재 테스트는 기본적인 필드만 검증하고 있습니다. FileMetaData와의 관계에 대해 더 자세한 검증이 필요합니다.

다음과 같이 검증을 강화하는 것을 추천드립니다:

         assertThat(result.get())
                 .extracting(
                         VodProcessingJob::getConvertJobId,
                         VodProcessingJob::getUserId,
                         VodProcessingJob::getConvertJobStatus)
                 .containsExactly(convertJobId, userId, PENDING);
-        assertThat(result.get().getFileMetaData().getId()).isEqualTo(fileId);
+        assertThat(result.get().getFileMetaData())
+                .extracting(
+                        FileMetaData::getId,
+                        FileMetaData::getOriginalName,
+                        FileMetaData::getStoredName)
+                .containsExactly(fileId, "test", "test");
src/main/resources/db/migration/V32__alter_table_vod_proceessing_job_add_column.sql (2)

Line range hint 7-9: 외래 키에 대한 인덱스 추가 필요

외래 키 file_meta_data_id에 대한 인덱스가 없습니다. 조회 성능 향상을 위해 인덱스 추가를 권장드립니다.

CREATE INDEX IX_VOD_PROCESSING_JOB_FILE_META_DATA_ID ON vod_processing_job (file_meta_data_id);

Line range hint 1-9: 마이그레이션 파일명 오타 수정 필요

파일명에 'proceessing'이라는 오타가 있습니다. 정확한 이력 관리를 위해 수정이 필요합니다.

파일명을 다음과 같이 수정해주세요:

  • 현재: V32__alter_table_vod_proceessing_job_add_column.sql
  • 수정: V32__alter_table_vod_processing_job_add_column.sql
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between af4c6be and 6a9411a.

📒 Files selected for processing (6)
  • src/main/java/ddingdong/ddingdongBE/domain/vodprocessing/controller/dto/request/CreatePendingVodProcessingJobRequest.java (1 hunks)
  • src/main/java/ddingdong/ddingdongBE/domain/vodprocessing/entity/VodProcessingJob.java (3 hunks)
  • src/main/java/ddingdong/ddingdongBE/domain/vodprocessing/service/FacadeVodProcessingJobServiceImpl.java (2 hunks)
  • src/main/java/ddingdong/ddingdongBE/domain/vodprocessing/service/dto/command/CreatePendingVodProcessingJobCommand.java (1 hunks)
  • src/main/resources/db/migration/V32__alter_table_vod_proceessing_job_add_column.sql (1 hunks)
  • src/test/java/ddingdong/ddingdongBE/domain/vodprocessing/service/FacadeGeneralVodProcessingJobServiceTest.java (2 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Build and analyze
🔇 Additional comments (3)
src/main/java/ddingdong/ddingdongBE/domain/vodprocessing/service/dto/command/CreatePendingVodProcessingJobCommand.java (1)

13-19: 구현이 적절합니다

FileMetaData를 포함하도록 수정된 toPendingVodProcessingJob 메서드의 구현이 적절합니다.

src/test/java/ddingdong/ddingdongBE/domain/vodprocessing/service/FacadeGeneralVodProcessingJobServiceTest.java (1)

Line range hint 63-67: 테스트 데이터 불완전

VodProcessingJob 엔티티에 FileMetaData가 추가되었으나, 테스트 데이터에는 이 관계가 포함되어 있지 않습니다.

테스트의 완전성을 위해 FileMetaData를 포함하도록 수정이 필요합니다:

         vodProcessingJobRepository.save(VodProcessingJob.builder()
                 .convertJobStatus(PENDING)
                 .userId("1")
                 .convertJobId("test")
+                .fileMetaData(createTestFileMetaData())
                 .build());
✅ Verification successful

테스트 데이터에 FileMetaData 관계가 누락되어 있습니다

VodProcessingJob 엔티티는 FileMetaData와의 @OnetoOne 관계가 필수적으로 필요합니다. 현재 테스트 데이터에서는 이 관계가 누락되어 있어 실제 운영 환경에서 문제가 발생할 수 있습니다.

다음과 같이 FileMetaData를 포함하도록 테스트를 수정해야 합니다:

FileMetaData fileMetaData = fileMetaDataService.getById("fileId");
vodProcessingJobRepository.save(VodProcessingJob.builder()
        .convertJobStatus(PENDING)
        .userId("1")
        .convertJobId("test")
        .fileMetaData(fileMetaData)  // FileMetaData 관계 추가
        .build());
🏁 Scripts executed

The following scripts were executed for the analysis:

Error: No shell scripts found


Script:

#!/bin/bash
# Find VodProcessingJob entity definition
echo "=== VodProcessingJob Entity Definition ==="
ast-grep --pattern 'class VodProcessingJob {
  $$$
}'

# Find FileMetaData relationship in VodProcessingJob
echo -e "\n=== FileMetaData Relationship ==="
rg "FileMetaData" -A 5 -B 5

# Find test files using VodProcessingJob
echo -e "\n=== Test Files Using VodProcessingJob ==="
fd "Test.java" --exec grep -l "VodProcessingJob"

# Look for test helper methods
echo -e "\n=== Test Helper Methods ==="
rg "createTestFileMetaData|createMockFileMetaData" -A 5

Length of output: 76117


Script:

#!/bin/bash
# Find VodProcessingJob entity definition and its relationship with FileMetaData
echo "=== VodProcessingJob Entity Definition ==="
rg -B 5 -A 10 "class VodProcessingJob"

# Find builder patterns in VodProcessingJob
echo -e "\n=== VodProcessingJob Builder Patterns ==="
rg "VodProcessingJob\.builder\(\)"

# Find any references to FileMetaData in VodProcessingJob related files
echo -e "\n=== FileMetaData in VodProcessingJob ==="
fd "VodProcessingJob" --exec grep -l "FileMetaData" {} \;

Length of output: 5155


Script:

#!/bin/bash
# Check FileMetaData relationship in VodProcessingJob entity
echo "=== FileMetaData Relationship in VodProcessingJob ==="
rg -B 5 -A 5 "FileMetaData" src/main/java/ddingdong/ddingdongBE/domain/vodprocessing/entity/VodProcessingJob.java

# Check FileMetaData usage in CreatePendingVodProcessingJobCommand
echo -e "\n=== FileMetaData in CreatePendingVodProcessingJobCommand ==="
rg -B 5 -A 5 "FileMetaData" src/main/java/ddingdong/ddingdongBE/domain/vodprocessing/service/dto/command/CreatePendingVodProcessingJobCommand.java

# Check implementation in FacadeVodProcessingJobServiceImpl
echo -e "\n=== FileMetaData in FacadeVodProcessingJobServiceImpl ==="
rg -B 5 -A 5 "FileMetaData" src/main/java/ddingdong/ddingdongBE/domain/vodprocessing/service/FacadeVodProcessingJobServiceImpl.java

Length of output: 3872

src/main/resources/db/migration/V32__alter_table_vod_proceessing_job_add_column.sql (1)

1-2: NULL 허용 여부 검토 필요

file_meta_data_id 컬럼이 NULL을 허용하도록 설정되어 있습니다. 비즈니스 로직상 이 필드가 필수값이라면 NOT NULL 제약조건을 추가해야 합니다.

 ALTER TABLE vod_processing_job
-    ADD file_meta_data_id BINARY(16) NULL;
+    ADD file_meta_data_id BINARY(16) NOT NULL;
✅ Verification successful

NULL 허용 설정이 적절해 보입니다

vod_processing_job 테이블의 기존 설계를 보면 notification_id와 같은 관계형 필드들이 NULL을 허용하도록 되어있습니다. file_meta_data_id 역시 이러한 패턴을 따르는 것이 일관성 있어 보입니다. 현재 NULL 허용 설정을 유지하시는 것을 추천드립니다.

🏁 Scripts executed

The following scripts were executed for the analysis:

Error: No shell scripts found


Script:

#!/bin/bash
# Find all migration scripts related to these tables
fd -e sql . src/main/resources/db/migration

# Search for references to file_meta_data table
rg -l "file_meta_data" --type sql

# Search for references to vod_processing_job table
rg -l "vod_processing_job" --type sql

Length of output: 2933


Script:

#!/bin/bash
# View the table creation scripts
cat src/main/resources/db/migration/V29__create_tables_vod_processing.sql
cat src/main/resources/db/migration/V10__create_file_meta_data_table.sql

# Search for code references to these tables
rg "vod_processing_job" --type java -A 5 -B 5

Length of output: 1681

Comment on lines +23 to +24
FileMetaData fileMetaData = fileMetaDataService.getById(command.fileId());
return vodProcessingJobService.save(command.toPendingVodProcessingJob(fileMetaData));
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

FileMetaData 조회 실패에 대한 예외 처리가 필요합니다

fileMetaDataService.getById() 호출 시 FileMetaData를 찾을 수 없는 경우에 대한 예외 처리가 누락되었습니다.

     @Transactional
     public Long create(CreatePendingVodProcessingJobCommand command) {
-        FileMetaData fileMetaData = fileMetaDataService.getById(command.fileId());
+        FileMetaData fileMetaData = fileMetaDataService.getById(command.fileId());
+        if (fileMetaData == null) {
+            throw new IllegalArgumentException("파일 메타데이터를 찾을 수 없습니다: " + command.fileId());
+        }
         return vodProcessingJobService.save(command.toPendingVodProcessingJob(fileMetaData));
     }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
FileMetaData fileMetaData = fileMetaDataService.getById(command.fileId());
return vodProcessingJobService.save(command.toPendingVodProcessingJob(fileMetaData));
FileMetaData fileMetaData = fileMetaDataService.getById(command.fileId());
if (fileMetaData == null) {
throw new IllegalArgumentException("파일 메타데이터를 찾을 수 없습니다: " + command.fileId());
}
return vodProcessingJobService.save(command.toPendingVodProcessingJob(fileMetaData));

@5uhwann 5uhwann merged commit 07ad473 into develop Jan 9, 2025
4 checks passed
@5uhwann 5uhwann deleted the refactor/DDING-000 branch January 9, 2025 09:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
D-0 🎯리팩토링 리팩토링 및 고도화 이슈
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant