전체 보기
🍀

Stream vs For, TIL의 장점

작성일자
2023/02/27
태그
DIARY_DEVELOP
프로젝트
BeachCombine
책 종류
1 more property

공부한 내용

Stream VS For

리스트 형태로 된 response DTO를 생성할 때 어떤 로직에선 stream을 썼고, 어떤 로직에선 for문을 썼다. 이 부분이 아띠즈 플젝을 하면서 부터 궁금했다. 하나로 통일하면 안되는지!!
우선 플젝에서 썼던 코드들로 예시를 들어보겠다.
stream
@Transactional(readOnly = true) public List<BeachMarkerResponse> findBeachMarkers() { List<Beach> findBeachList = beachRepository.findAll(); List<BeachMarkerResponse> responseList = findBeachList.stream() .map(m -> BeachMarkerResponse.builder() .id(m.getId()) .lat(String.valueOf(m.getLat())) .lng(String.valueOf(m.getLng())) .image(getRecordMemberImage(m)) .build()) .collect(Collectors.toList()); return responseList; }
Java
복사
@Transactional(readOnly = true) public ArtistDetailResponse getArtistDetail(Long loginMemberId, Long artistId) { Member member = memberRepository.findById(loginMemberId) .orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_MEMBER)); Member artist = memberRepository.findById(artistId) .orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_ARTIST)); List<ArtWork> artWorkList = artWorkRepository.findArtWorkByMember(artist); return ArtistDetailResponse.builder() .pick(memberPreferredArtistRepository.existsByMemberAndArtist(member, artist)) .member(ArtistDetailResponse.MemberDto.from(artist, awsStorageUrl)) .artworks(artWorkList.stream() .map(m -> ArtistDetailResponse.ArtWorkDto.from(m, awsStorageUrl)) .collect(Collectors.toList())) .build(); }
Java
복사
for
public List<RecordResponse> getRecordList(Long memberId) { List<RecordResponse> recordResponseList = new ArrayList<>(); List<Record> recordList = recordRepository.findAllByMemberId(memberId); for (Record record: recordList){ String beforeImageUrl = imageService.processImage(record.getBeforeImage()); String afterImageUrl = imageService.processImage(record.getAfterImage()); RecordResponse recordResponse = RecordResponse.builder() .recordId(record.getId()) .beachId(record.getBeach().getId()) .time(record.getDuration()) .date(record.getCreatedDate()) .range(record.getDistance()) .beforeImage(beforeImageUrl) .afterImage(afterImageUrl) .build(); recordResponseList.add(recordResponse); } return recordResponseList; }
Java
복사
일단 검색 전에 든 생각은 for문이 성능 상 더 안 좋아서 다들 Stream.map 형태를 쓰는 게 아닐까 싶었다.
검색해보고 알게된 사실은,, for문이 성능이 더 좋단 것이었다! 충격,,
그러면 우리는 왜 Stream문을 썼던 것일까,,,
바로, Stream문이 더 가독성이 좋기 때문이라는데 사실 난 크게 공감하지 못했다,,,
for문이 훨씬 익숙하고 Stream은 덜 익숙했기 때문이었다.
그래서 프로젝트 전체에서 Stream을 쓰지 말까 잠시 고민했다,,,
하지만 이 역시 많은 사람들이 Stream을 쓰는 이유가 있지 않을까 싶어 좀 더 찾아봤다.
아래 블로그 글을 보고 가독성 측면에서 Stream이 더 좋단 말을 단번에 이해할 수 있었다.
이중 for문으로 가니 확실히 Stream이 짧은 걸 확인할 수 있었기 때문이다.
결론적으로 팀원분과 Stream을 default로 쓰고, 간혹 Stream으로 해결되지 않는 것들(예를 들면 반복문 중간에 추가적인 작업들을 해줘야 하는 것들)만 For문을 사용하기로 결정했다.

하루 정리

TIL 작성하기
20시-21시 Atties 백엔드 회의
정정서 내기,, (정정 성공!)
22시-24시 BeachCombine 코어타임
이번주 목요일은 개강이다,,, 개강 목표는 매일 TIL 작성하기,, 학교에서 배운 내용으로도 좋음!
배운 내용 뿐만 아니라 할 일 정리도 할 겸 TIL 작성은 좋은 거 같다.
2년째 아래 처럼 매일 매일을 엑셀에다가 할 일을 정리해왔는데,, 이번 학기엔 TIL에 정리해봐야겠다!
사실 이전부터 TIL을 매번 써야지 써야지 하고서 안 쓰고 있었다.
가장 큰 비중을 차지했던 이유는 그냥 포스팅을 하는 게 낫지 않을까 하는 생각 때문이었다.
고런 생각에 TIL을 잠시 잊고 살았다,,,
그러던 내게 팀원분이 혹시 TIL을 쓰냐고 여쭤보셨는데
곰곰히 생각해보니 플젝을 하면서 함께 의논하며 배워나간 부분들을
정리하지 않으면 너무 아까울 거 같단 생각에 가볍게 TIL을 써보기로 결심했다.
막상 써보니 포스팅은 쓰다 보면 약간 부담이 가는 데 반해
가볍게 쓸 수 있는 TIL만의 매력을 느낄 수 있었다.
앞으로 잊지 않고 매일 써보려 도전해 보아야겠다. 개강 목표로,,
(아무래도 포스팅은 나만의 생각을 바탕으로 정리해야 한단 생각에 쓰다 보면 추가되는 내용들이 많아 쓰는 데 오래 걸리는 편이다,,, 뭔가 처음 보는 사람이 내 글을 보고 배울 수 있게 써야 한다는 강박이 든다,, 선생님 하던 버릇 어디 안 가는,, )
(TIL은 내 생각을 넣는 건 마찬가지이지만 막 보기 좋게 정리하고, 총 정리 느낌으로 정리할 필요 없이 짧게 짧게 쓸 수 있어, 그리고 나만 알아볼 수 있게 써도 된단 마음으로 일기장처럼 부담 없이 쓸 수 있어 좋은 거 같다!)