logo
한달 포트폴리오 멘토링
블로그

이번 카우치코딩 수업에서는 학생의 코드를 보고 피드백을 주고 리팩토링을 하는 작업을 진행하였습니다.

그 중 읽기 쉬운 코드를 만들기위해 학생의 코드를 리팩토링 했던 내용을 공유하고자 적어보았습니다.

초보 분들이 코드를 작성할때 참고하면 좋을 것입니다.

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

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주 포트폴리오 수업을 진행중에있습니다. 혼자 포트폴리오 준비를 하는데 어려움이 있으면 관심가져주세요~

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

PortfolioAD
관련있는 글

couchcoding

2022-12-07

웹 서비스를 구성하는 구성요소들을 알아보자 - 1

현재 우리는 웹서비스의 시대에 살고있다고 과언이 아닙니다. 브라우저를 통해 다양한 컨텐츠와 금융활동, 커뮤니티등의 서비스를 이용하고 있으며 우리가 사용하는 앱 또한 대부분 네이티브 앱이 아닌 웹앱으로 구성되어 있습니다. 그러면서 예전의 클라이언트 - 서버 의 단순한 ...

개발 이론

웹 서비스
클라우드 아키텍처
CDN
load balancer
WAS
database
file storage

couchcoding

2022-12-07

웹 서비스를 구성하는 구성요소들을 알아보자 - 2

이전 포스팅에서는 웹서비스의 구성 변화에 대해서 알아보고 웹서비스를 구성하는 요소중 CDN, Load Balancer, Web Application Service, Database, File Storage에 대해서 알아보았습니다. 이번 포스팅에서는 저번에 다루지 않은...

개발 이론

웹 서비스
클라우드 아키텍처
web cache
redis
message queue
kafka
log service
ELK
grafana

couchcoding

2022-12-07

개발 초보를 위한 RESTful API 설계 가이드

API란 Application Programming Interface의 약자로 프로그램을 실행하는 인터페이스입니다. API를 통해 프로그램에 요청을 전달하기위한 통로 혹은 방법으로 생가하면 됩니다. 라이브러리를 설치하고 호출하는 함수도 API라고 하죠. ...

개발 이론

초보 개발자
API 설계
HTTP
RESTful
API

couchcoding

카우치코딩 공식 계정입니다.