Skip to content

Conversation

@TTaiJin
Copy link
Collaborator

@TTaiJin TTaiJin commented Apr 11, 2025

📌 PR 제목

해시태그 기능 추가 + 파사드 패턴 도입 후 코드 리팩토링

✨ 변경 사항

  • Facade는 병규님꺼 보고 제가 아예 구조를 잘못 잡고 한거같아서 병규님꺼 코드 반영해서 다 고치느라 좀 걸렸습니다.
  • 해시태그 관련 기능 추가
  • 리팩토링하면서 생긴 컴파일 오류들 수정
  • 테스트 코드 수정
  • 미디어 S3 업로드는 비동기 방식으로 변경
  • 미디어 S3 삭제는 즉시 삭제로 하고 예외 발생 시 상태를 FAILED_DELETE 상태로 두고 스케줄러에서 삭제 재시도 하게 변경
  • 임시 상태 파일은 그대로 스케줄러 유지

🔍 변경 이유

시간에 쫓기면서 하느라 좀 코드가 지저분할 수 도 있습니다. 주말에(토 밤부터) 쿼리 튜닝, 인덱스 등 성능 쪽으로 개선사항 찾으면서 코드 좀더 깔끔하게 리팩토링 할 수 있으면 하는 쪽으로 하겠습니다.

✅ 체크리스트

  • 코드가 정상적으로 동작하는지 확인
  • 관련 테스트 코드 작성 및 통과 여부 확인
  • 문서화(README 등) 필요 여부 확인 및 반영
  • 리뷰어가 알아야 할 사항 추가 설명

📸 스크린샷 (선택)

📌 참고 사항

@github-actions
Copy link

Claude의 전체 변경사항 및 관련 파일에 대한 리뷰:

개선된 사항:

  • 파사드 패턴의 도입으로 DiaryService의 책임이 분산되었습니다.
  • 해시태그 기능이 추가되어 다이어리 기능이 확장되었습니다.
  • 비동기 처리를 위한 AsyncConfig가 추가되어 성능 개선이 이루어졌습니다.

주요 이슈:

  1. 해시태그 관련 로직의 성능 최적화

    • 제안: 해시태그 조회 시 N+1 문제를 방지하기 위해 일괄 조회 방식을 사용하세요.
    // HashtagService.java
    public Map<Long, List<String>> getHashtagMapByDiaryIds(List<Long> diaryIds) {
        List<DiaryHashtag> diaryHashtags = diaryHashtagRepository.findByDiaryIdIn(diaryIds);
        List<Long> hashtagIds = diaryHashtags.stream().map(DiaryHashtag::getHashtagId).distinct().toList();
        Map<Long, String> hashtagMap = hashtagRepository.findAllById(hashtagIds).stream()
            .collect(Collectors.toMap(Hashtag::getHashtagId, Hashtag::getName));
        
        return diaryHashtags.stream()
            .collect(Collectors.groupingBy(DiaryHashtag::getDiaryId,
                Collectors.mapping(dh -> hashtagMap.get(dh.getHashtagId()), Collectors.toList())));
    }
  2. 미디어 삭제 프로세스 개선

    • 제안: S3에서 파일 삭제 실패 시 재시도 메커니즘을 구현하세요.
    // S3Service.java
    @Retry(maxAttempts = 3, backoff = @Backoff(delay = 1000))
    public void deleteFileFromS3(String key) {
        try {
            DeleteObjectRequest request = DeleteObjectRequest.builder()
                .bucket(bucketName)
                .key(key)
                .build();
            s3Client.deleteObject(request);
        } catch (S3Exception e) {
            log.error("Failed to delete file from S3: {}", key, e);
            throw new RuntimeException("Failed to delete file from S3", e);
        }
    }
  3. 다이어리 검색 기능 개선

    • 제안: 전문 검색 엔진(예: Elasticsearch)을 도입하여 검색 성능과 정확도를 향상시키세요.

관련 파일에 대한 영향 분석:

  • DiaryFacade의 도입으로 DiaryController, DiaryService, MediaService, HashtagService 간의 의존성이 감소했습니다. 이는 향후 기능 확장 시 유지보수성을 높일 것입니다.
  • AsyncConfig의 추가로 MediaService의 비동기 처리가 가능해졌습니다. 이는 대용량 파일 처리 시 시스템 반응성을 향상시킬 것입니다.
  • HashtagService의 추가로 DiaryService와 DiaryRepository의 로직이 단순화되었습니다. 그러나 해시태그 관련 쿼리가 증가할 수 있으므로, 데이터베이스 인덱싱 전략을 재검토해야 할 수 있습니다.

전반적인 의견:
코드 품질이 전반적으로 향상되었으며, 특히 파사드 패턴의 도입과 비동기 처리 구현은 긍정적입니다. 다만, 해시태그와 미디어 처리 관련 성능 최적화에 더 주의를 기울일 필요가 있습니다.

@sonarqubecloud
Copy link

@github-actions
Copy link

Claude의 전체 변경사항 및 관련 파일에 대한 리뷰:

Error: API returned status code 400

@TTaiJin TTaiJin merged commit f2a7e96 into develop Apr 13, 2025
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants