[TIL] 230116

✏️ Check Box

📌 정리


기존코드

    // 기존코드
    List<StudyArticleResponseDto> studyArticleResponseDtos = studyArticleList.getContent().stream()
                .map(studyArticle -> {
                    List<StudyMember> studyMembers = studyArticle.getStudyMembers().stream()
                            .map(memberId -> studyMemberRepository.findById(Long.valueOf(memberId)).orElseThrow()).collect(Collectors.toList()); // 불필요
                    return studyMapper.studyArticleToStudyResponseDto(studyArticle, studyMemberMapper.studyMembersToStudyMemberResponseDtos(studyMembers));
                }).collect(Collectors.toList());

변경코드


    // Response DTO로 변환
    private List<StudyArticleResponseDto> joinStudyMember(List<StudyArticle> studyArticles) {
        return studyArticles.stream()
                .map(this::studyMemberListToEntity)
                .collect(Collectors.toList());
    }

    // 각 Article의 Member Entity를 Member Response DTO로 변환
    private StudyArticleResponseDto studyMemberListToEntity(StudyArticle studyArticle) {

        List<StudyMemberResponseDto> studyMembers = studyArticle.getStudyMembers().stream()
                .map(memberId -> studyMemberRepository.findById(Long.valueOf(memberId)).orElseThrow())
                .map(studyMemberMapper::studyMemberToStudyMemberResponseDto)
                .collect(Collectors.toList());

        return studyMapper.studyArticleToStudyResponseDto(studyArticle, studyMembers);
    }

큰 구조의 변화는 없지만, 기존의 Stream 체이닝만으로 이루어진 구조는 가독성면에서도 상당히 떨어진다고 생각했다. 따라서 메서드로 분리하는 과정에서 불필요하게 collect를 하는 프로세스를 한번 삭제할 수 있었고 이에 조금 더 간결하고 가독성 좋은 코드가 완성되었다.

변경 코드에서 한번의 map에서 DTO 변환을 같이한 것과 두번의 map의 시간차이를 계산해봤는데 신기하게도 두번의 map 연산이 퍼포먼스가 좋게 나왔다. 아무래도 지연연산 때문인 것으로 추측되는데, 내부적으로 분석하기는 쉽지 않았다😪

Back to [TIL] 230105