[Spring Boot] For Loop vs Stream, FindById vs GetOne
개인 프로젝트 중에 mvpscore저장방식 고민
1. For loop vs stream
// mvpscore
//걸린 시간 : 0.00455935 milli seconds
List<Map.Entry<Long,Double>> entries = statisticsService.getMvpScore(participants, winTotalKills, loseTotalKills, winTotalGoldEarned, loseTotalGoldEarned);
for (GameRecordDto gameRecordDto : result) {
gameRecordDto.getParticipants().forEach(
parti->{
long mvp=0l;
for( Map.Entry<Long,Double> entry : entries){
if(entry.getKey().equals(parti.getAccountId())){
mvp = entry.getValue().longValue();
break;
}
}
parti.getStats().setMvpScore(mvp);
}
);
}
statisticsService.getMvpScore 에서
map에 id : mvpscore 저장하고 mvpscore 정렬해서 1~10 순위 매겨줘야해서 List로 감쌌다.
gameRecordDto > participants > stats 에 mvpscore에 저장해줘야하는데
list에 있는 10개 값중에 participants id와 맞는 값을 가져올때 뭔가 효율적으로 해보고싶은데 어떻게해야될지 고민이다
일단 그냥 완탐으로 for문을 돌려서 했는데 , 그게 맞나 싶기도하고 안예뻐보여서
// mvpscore
// 걸린 시간 : 0.004336385 milli seconds
List<Map.Entry<Long,Double>> entries = statisticsService.getMvpScore(participants, winTotalKills, loseTotalKills, winTotalGoldEarned, loseTotalGoldEarned);
for (GameRecordDto gameRecordDto : result) {
gameRecordDto.getParticipants().forEach(
participant->{
long mvp = entries.stream()
.filter(mvpScoreOfAccountId -> mvpScoreOfAccountId.getKey().equals(participant.getAccountId()))
.findAny()
.get().getValue().longValue();
participant.getStats().setMvpScore(mvp);
}
);
}
stream filter를 이용해봤다. 코드 가독성??자체가 더 좋아질까 싶어서 ..
근데 어짜피 하나만 가져올건데 findAny 써야되는지 안써도되는지도 잘 모르겠음..ㅎ
findAny랑 findFirst는 1개만 가져오는건 같은데 병렬적으로 써야되는 상황에서 좀 다르다고함 (?)
근데 for문을 돌리면 break로 나올수라도 있는데 stream은 뭔가 다 탐색하고있어서 오히려 별로인거같기도했다.
https://www.popit.kr/java8-stream%EC%9D%80-loop%EA%B0%80-%EC%95%84%EB%8B%88%EB%8B%A4/
다시 원래 코드로 바꿨고,,
생각해보니까 entries값은 어짜피 이때 쓰이고 말거라서 한번 찾은 값 리스트에서 삭제하면 검색할 양 줄지않을까..싶기도 ..?!?
이런생각으로 한번 entries.remove(entry)해봤는데 오히려 시간 재봤더니 더 늘었다..ㅋㅋ 걍 원래코드로 해야될듯
그리고 맨처음할땐 시간이 4단위나오는데 새로고침하면 1로 줄어든다..! ㅇ_ㅇ
이 코드는 그냥 for loop으로 하는것으로 ...
하여튼 포문을 무지성으로 stream으로 변환해버리면 오히려 성능상 안좋을수도 있다는 점 .. 알아두길 ~!!
2. getOne과 findbyid 차이점
2021-07-12 01:38:49.798 INFO 84259 --- [ main] c.m.l.r.GameRecordRepositoryTest : findById
Hibernate:
select
gamerecord0_.game_id as game_id1_2_0_,
gamerecord0_.created as created2_2_0_,
gamerecord0_.modified as modified3_2_0_,
gamerecord0_.game_created as game_cre4_2_0_,
gamerecord0_.game_duration as game_dur5_2_0_
from
game_records gamerecord0_
where
gamerecord0_.game_id=?
2021-07-12 01:38:49.845 INFO 84259 --- [ main] c.m.l.r.GameRecordRepositoryTest : getone
https://granger.tistory.com/50
"A가 B를 필드로 가지고 있는데, B엔티티의 모든 필드가 당장 필요한게 아니라 A엔티티를 반환하기 위해 참조만 필요한 경우에! JPA는 Lazy Evaluation 을 적용해요."
출처: https://yongdev.tistory.com/137 [JDragon]
getone - lazy loading