Page History
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
public void RankTest() { int[] score = {Integer.MIN_VALUE}; int[] no = {0}; int[] rank = {0}; List<AddressAgeRank> ageRankList = addressRepo.findByAgeBetween(10, 90).stream() .sorted((a,b) -> b.getAge() - a.getAge() ) .map(p -> { ++no[0]; if (score[0] != p.getAge()) rank[0] = no[0]; return new AddressAgeRank(p.getName(),score[0] = p.getAge(), rank[0] ); }) .collect(Collectors.toList()); ageRankList.forEach(item ->{ System.out.println(item.toString()); }); } |
Expand | ||
---|---|---|
| ||
Note |
---|
윈도우 함수를 쿼리를 사용하지 않고, 우리가 원하는 랭킹처리를하였습니다. 항상 권장되는 방식은 아니며, SQL 영역에서는 SQL문작성을 못해서 어플리케이션에서 절차식 으로 처리하는 사고방식을 초보라고 언급하기도 합니다. 하지만 이것은 SQL방식과 유사한 식을 사용한 선언형방식이며 실제 데이터베이스 내에서 윈도우 랭크함수가 작동될 구현체를 어플리케이션에서 유사하게 구현을 하였습니다. 단일 성능이 누가 성능에서 DBMS가 더 빠르냐? 랭킹기능을 어플리케이션이 분담하여 처리하느냐? 는 각각 다른문제이며 단순하게 DBMS에서 수행할수 있는 영역을 어플리케이션이 절차식으로 풀었다고 초보로 정의하는것은 바람직하지 않습니다. 어쨋든 랭킹처리 문제는, 쿼리방식은 랭킹처리된것중에 필요한것만 취할수 있는반면 어플리케이션에서는, 쿼리로 1차 범위 제한을 적절하게 한다고 해도 원하는 랭킹을 얻기까지 더많은 결과셋이 필요할수 있다란것이 단점입니다. SQL문 학습과 함께, 어플리케이션에서 데이터 가공을 람다식으로 하는것은 절차식 사고방식을 벗어나 SQL작성과 비슷한 선언형 사고방식을 하는것으로 람다식을 같이 연습하는것을 추천합니다. 결론은 원하는 값을 얻기위해 가장 짧고 깔끔한 SQL문을 작성하는 노력을 함과 동시에 어플리케이션에서 연산을 옮겨왔을시 아주큰 이점이 있는지? 고민을 하는것입니다. |