이번 카우치코딩 수업에서는 학생의 코드를 보고 피드백을 주고 리팩토링을 하는 작업을 진행하였습니다.
그 중 읽기 쉬운 코드를 만들기위해 학생의 코드를 리팩토링 했던 내용을 공유하고자 적어보았습니다.
초보 분들이 코드를 작성할때 참고하면 좋을 것입니다.
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
에서 사용자에게 보여주기 위해 필요하다는 점입니다.
sortByKeywordCount
는 StoreSummaryDTO
로 옮겨가는게 맞습니다.
수정한 코드는 다음과 같습니다.
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
로 옮겼습니다.
카우치코딩에서는 6주 포트폴리오 수업을 진행중에있습니다. 혼자 포트폴리오 준비를 하는데 어려움이 있으면 관심가져주세요~
카우치코딩 고동휘 멘토의 글입니다.
couchcoding
2022-12-07
웹 서비스를 구성하는 구성요소들을 알아보자 - 1
현재 우리는 웹서비스의 시대에 살고있다고 과언이 아닙니다. 브라우저를 통해 다양한 컨텐츠와 금융활동, 커뮤니티등의 서비스를 이용하고 있으며 우리가 사용하는 앱 또한 대부분 네이티브 앱이 아닌 웹앱으로 구성되어 있습니다. 그러면서 예전의 클라이언트 - 서버 의 단순한 ...
개발 이론
couchcoding
2022-12-07
웹 서비스를 구성하는 구성요소들을 알아보자 - 2
이전 포스팅에서는 웹서비스의 구성 변화에 대해서 알아보고 웹서비스를 구성하는 요소중 CDN, Load Balancer, Web Application Service, Database, File Storage에 대해서 알아보았습니다. 이번 포스팅에서는 저번에 다루지 않은...
개발 이론
couchcoding
2022-12-07
개발 초보를 위한 RESTful API 설계 가이드
API란 Application Programming Interface의 약자로 프로그램을 실행하는 인터페이스입니다. API를 통해 프로그램에 요청을 전달하기위한 통로 혹은 방법으로 생가하면 됩니다. 라이브러리를 설치하고 호출하는 함수도 API라고 하죠. ...
개발 이론
couchcoding
카우치코딩 공식 계정입니다.