[CleanCode] 읽기 좋은 코드로 변경시키기 예제

카우치코딩·2022년 12월 16일
1
post-thumbnail

이번 카우치코딩 수업에서는 학생의 코드를 보고 피드백을 주고 리팩토링을 하는 작업을 진행하였습니다. 그 중 읽기 쉬운 코드를 만들기위해 학생의 코드를 리팩토링 했던 내용을 공유하고자 적어보았습니다.
초보 분들이 코드를 작성할때 참고하면 좋을 것입니다.

너무 구체적인 내용이 포함된 코드 예제

    public List<StoreSummaryDTO> getStoreSummaries(String[] storeIds) {
        List<StoreSummary> storeSummaries = storeSummaryRepository.findAllByStoreIdIn(storeIds);
        
        List<StoreSummaryDTO> storeSummaryDTOs = new ArrayList<>();
        
        for (StoreSummary storeSummary : storeSummaries) {
            storeSummary.sortByKeywordCount();
            storeSummaryDTOS.add(new StoreSummaryDTO(storeSummary));
        }

        return storeSummaryDTOs;
    }

위의 코드는 storeIds에 해당되는 StoreSummary List를 가져와서 DTO로 변경하는 코드입니다.그렇게 읽기 어려운 코드는 아니지만 무엇이 문제였을까요?

너무 구체적인 내용이 있는 코드
처음 Repository에서 StoreSummary를 가져오는 코드는 크게 문제가 없어보입니다. 보면 가져오는구나를 바로 알수 있죠.
그러나 List부터 있는 DTO로 변환하는 코드는 차분히 읽지 않으면 어떤 일을 하는지 바로 알아차리기 힘듭니다.
이럴땐 메서드를 추출하여 하나의 의미있는 이름으로 변경하는 것이 좋습니다.
변경한 코드는 다음과 같습니다.

public List<StoreSummaryDTO> getStoreSummaries(String[] storeIds) {
    List<StoreSummary> storeSummaries = storeSummaryRepository.findAllByStoreIdIn(storeIds);
        
    return convertToStoreSummaryDTOs(storeSummaries);
}
    
private List<StoreSummaryDTO> convertToStoreSummaryDTOs(List<StoreSummary> storeSummaries) { 
    List<StoreSummaryDTO> storeSummaryDTOs = new ArrayList<>();
        
    for (StoreSummary storeSummary : storeSummaries) {
        storeSummary.sortByKeywordCount();
        storeSummaryDTOS.add(new StoreSummaryDTO(storeSummary));
    }
    return storeSummaryDTOs;

}

이제 getStoreSummaries 메서드를 볼때 storeSummaries를 가져와서 DTO로 변환해서 리턴하는구나를 단 번에 알 수 있습니다. 만약 DTO를 만드는 과정을 볼 필요가 있을때convertToStoreSummaryDTOs를 보겠죠.

잘못된 책임과 역할
또 코드를 보다보면 불편한 부분이 있습니다.

        storeSummary.sortByKeywordCount();
        storeSummaryDTOS.add(new StoreSummaryDTO(storeSummary));

부분이죠. 첫번째로는 StoreSummaryDTO를 만들기 위해 sortByKeywordCount를 필요로 합니다. 나중에 StoreSummaryDTO를 생성할 일이 있으면 빼먹을 가능성이 높겠죠.

두번째로는 키워드를 인기 순으로 정렬하는 행동은 StoreSummary에서 필요한 것이 아니라 StoreSummaryDTO에서 사용자에게 보여주기 위해 필요하다는 점입니다. sortByKeywordCountStoreSummaryDTO로 옮겨가는게 맞습니다.
수정한 코드는 다음과 같습니다.

        storeSummaryDTOS.add(new StoreSummaryDTO(storeSummary));

또 다른 예제

    public void addReviewInSummary(Review review){
        StoreSummary summary = getStoreSummary(review.getStoreId());
        summary.addStarCount(review.getStarCount());
        summary.increaseStoreKeywordCounts(review.getKeywords());
    }

addReviewInSummary는 리뷰가 추가되면 상점의 평점을 관리하는 StoreSummary을 갱신하는 메서드입니다.
이때 addStarCount increaseStoreKeywordCounts는 Review가 추가되면 StoreSummary에서 처리할 일이지 외부에 세부적이 내용을 노출하는 것은 나중에 Review를 다른데서 추가하게 되었을 경우 문제가 생길 수 있고 또한 너무 세부적인 내용을 외부에 노출하는 것이 됩니다.

코드를 고치면 다음과 같이 바뀔 수 있습니다.

    public void addReviewInSummary(Review review){
        StoreSummary summary = getStoreSummary(review.getStoreId());
        summary.addReview(review);
    }

세부적인 내용에 대한 변경의 책임을 StoreSummary로 옮겼습니다.

About Couchcoding

카우치코딩에서는 6주 포트폴리오 수업을 진행중에있습니다. 혼자 포트폴리오 준비를 하는데 어려움이 있으면 관심가져주세요~

카우치코딩 고동휘 멘토의 글입니다.

profile
포트폴리오 수업 & 코딩 멘토링 서비스 카우치코딩입니다.

0개의 댓글