회사에 들어가 개발자가 된지 3개월차가 되었다.
나는 Stream에 대해 관심이 많으며 그래도 Stream을 써야할 때는 못쓰더라도
쓰지 않아야할 곳에서는 안쓰고 있다고 자부하고 있었다.

하지만...

이번 기회에 그 자부심이 깨져버렸다.


 

여러 반복문

 

엑셀 다운로드기능을 구현중에 각 데이터를 Mapping 해야하는 상황이였습니다.

문제점

//헤더, 로우 정보 셋팅
LinkedHashMap<String, List<Object>> dataMaps = new LinkedHashMap<>();
dataMaps.put("번호", numberList);
dataMaps.put("회원그룹", responseList.stream().map(accountGiftCardDto -> (Object) accountGiftCardDto.getUserGroupName()).toList());
dataMaps.put("아이디", responseList.stream().map(accountGiftCardDto -> (Object) accountGiftCardDto.getSignName()).toList());
dataMaps.put("이름", responseList.stream().map(accountGiftCardDto -> (Object) accountGiftCardDto.getName()).toList());
dataMaps.put("상품권 발급일시", responseList.stream().map(accountGiftCardDto -> (Object) accountGiftCardDto.getSaveAt()).toList());
dataMaps.put("상품권 사용일시", responseList.stream().map(accountGiftCardDto -> (Object) accountGiftCardDto.getUseAt()).toList());
dataMaps.put("사용여부", responseList.stream().map(accountGiftCardDto -> accountGiftCardDto.getUseAt() == null ? (Object) "미사용" : "사용완료").toList());
createDto.setDataMaps(dataMaps);

// 엑셀 다운로드
...생략

 

보면 아시겠지만 각 Map.put()에 반복문이 돌고 있기 때문에 성능저하가 일어난다. 같은 객체의 List 이기 때문에 
한번으 반복문으로 로직을 구현할 수 있음에도 불구하고 이렇게 짠 내 자신에게 화난다.

 

해결방안

//헤더, 로우 정보 셋팅
HashMap<String, List<Object>> dataMaps = new LinkedHashMap<>();
dataMaps.put("회원그룹", Lists.newArrayList());
dataMaps.put("아이디", Lists.newArrayList());
dataMaps.put("이름", Lists.newArrayList());
dataMaps.put("상품권명", Lists.newArrayList());
dataMaps.put("상품권 발급일시", Lists.newArrayList());
dataMaps.put("상품권 사용일시", Lists.newArrayList());
dataMaps.put("사용여부", Lists.newArrayList());


for (AccountGiftCardDto.Response accountGiftCardDto : responseList) {
	String saveAt = accountGiftCardDto.getSaveAt() == null ? null : accountGiftCardDto.getSaveAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
	String useAt = accountGiftCardDto.getUseAt() == null ? null : accountGiftCardDto.getUseAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

	dataMaps.get("회원그룹").add(accountGiftCardDto.getUserGroupName());
	dataMaps.get("아이디").add(accountGiftCardDto.getSignNameList());
	dataMaps.get("이름").add(accountGiftCardDto.getUserName());
	dataMaps.get("상품권명").add(accountGiftCardDto.getGiftCardName());
	dataMaps.get("상품권 발급일시").add(saveAt);
	dataMaps.get("상품권 사용일시").add(useAt);
	dataMaps.get("사용여부").add(accountGiftCardDto.getUseAt() != null ? "사용완료" : "미사용");
    }
복사했습니다!