Backend/개발

[Spring Boot] For Loop vs Stream, FindById vs GetOne

지수쓰 2021. 7. 12. 01:08
반응형

개인 프로젝트 중에  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://homoefficio.github.io/2016/06/26/for-loop-%EB%A5%BC-Stream-forEach-%EB%A1%9C-%EB%B0%94%EA%BE%B8%EC%A7%80-%EB%A7%90%EC%95%84%EC%95%BC-%ED%95%A0-3%EA%B0%80%EC%A7%80-%EC%9D%B4%EC%9C%A0/

 

for-loop 를 Stream.forEach() 로 바꾸지 말아야 할 3가지 이유

for-loop를 Stream.forEach()로 바꾸지 말아야 할 3가지 이유 원문 : https://blog.jooq.org/2015/12/08/3-reasons-why-you-shouldnt-replace-your-for-loops-by-stream-foreach/ 간디작살! 소스 코드를 Java8로 바꾸자. 뭐든지 함수를 써

homoefficio.github.io

https://www.popit.kr/java8-stream%EC%9D%80-loop%EA%B0%80-%EC%95%84%EB%8B%88%EB%8B%A4/

 

Java8 Stream은 loop가 아니다. | Popit

Java8에서는 Lambda와 Stream이라는 새로운 개념을 통해 기존 Java를 이용하는 프로그램 방식과는 완전 다른 형태의 프로그램을 가능하도록 하고 있습니다. 필자도 최근 Presto의 소스 코드를 보면서 이

www.popit.kr

 

 

다시 원래 코드로 바꿨고,,

생각해보니까 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

 

Spring Data JPA 에서 getOne 과 findById 차이점

Spring Data JPA에서 getOne과 findById의 차이점은 무엇일까? 기본 데이터 저장소에서 개체를 검색하는 데 findById()및 getOne()메서드가 모두 사용된다. 그러나 레코드를 검색하는 기본 메커니즘은이

granger.tistory.com

 

 

"A가 B를 필드로 가지고 있는데, B엔티티의 모든 필드가 당장 필요한게 아니라 A엔티티를 반환하기 위해 참조만 필요한 경우에! JPA는 Lazy Evaluation 을 적용해요."
출처: https://yongdev.tistory.com/137 [JDragon]

 

getone - lazy loading