Skip to content

Commit 76bb022

Browse files
committed
인구수 추이 api 구현
1 parent d078eff commit 76bb022

File tree

5 files changed

+82
-5
lines changed

5 files changed

+82
-5
lines changed

src/main/java/com/dduckddak/domain/data/controller/PopulationController.java

+7
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ public class PopulationController {
2424

2525
private final PopulationService populationService;
2626

27+
@Operation(summary = "행정동의 유동인구 수 추이")
28+
@GetMapping("/floating/transition")
29+
public ApiResponse<PopulationTransitionResponse> getFloatingPopulationTransition(@RequestParam(value = "code") String code){
30+
PopulationTransitionResponse floatingPopulationTransition = populationService.getFloatingPopulationTransition(code);
31+
return success(floatingPopulationTransition);
32+
}
33+
2734
@Operation(summary = "행정동별 전체 유동인구 조회", description = "parameter로 행정동코드(code)를 받아 해당 행정동의 전체 유동인구를 조회")
2835
@GetMapping("/floating/quarter")
2936
public ApiResponse<PopulationByQuarterDto> getFloatingPopulationByCodeTop5(@RequestParam(value = "code") String code) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.dduckddak.domain.data.dto;
2+
3+
import com.dduckddak.domain.data.model.Population;
4+
5+
import java.util.List;
6+
7+
public record PopulationTransitionResponse(
8+
List<PopulationData> populationList
9+
) {
10+
public record PopulationData(
11+
long quarter,
12+
long populationOfTown,
13+
int rankAtCity,
14+
long populationAvgOfCity,
15+
int rankAtDistrict,
16+
long populationAvgOfDistrict
17+
18+
) {
19+
}
20+
21+
public static PopulationTransitionResponse from(List<PopulationData> populations) {
22+
return new PopulationTransitionResponse(populations);
23+
}
24+
}
25+

src/main/java/com/dduckddak/domain/data/repository/PopulationRepositoryCustom.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,6 @@ public interface PopulationRepositoryCustom {
2121

2222

2323
List<PopulationsTop10Response> findPopulationsTop10(String selectCriteria, String orderCriteria, String populationType);
24-
}
24+
25+
List<Population> findFloatingPopulationTransition(String code);
26+
}

src/main/java/com/dduckddak/domain/data/repository/PopulationRepositoryImpl.java

+13
Original file line numberDiff line numberDiff line change
@@ -118,4 +118,17 @@ public List findPopulationsTop10(String selectCriteria, String orderCriteria, St
118118
return responseList;
119119
}
120120

121+
@Override
122+
public List<Population> findFloatingPopulationTransition(String code) {
123+
124+
return queryFactory
125+
.selectFrom(population)
126+
.innerJoin(population.town, town).fetchJoin()
127+
.where(population.populationType.eq(PopulationType.FloatingPopulation)
128+
.and(town.quarter.in(20241, 20234, 20233, 20232, 20231)))
129+
.orderBy(population.town.quarter.desc(), population.totalPopulation.desc())
130+
.fetch();
131+
132+
}
133+
121134
}

src/main/java/com/dduckddak/domain/data/service/PopulationService.java

+34-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package com.dduckddak.domain.data.service;
22

3-
import com.dduckddak.domain.data.dto.PopulationByDistrictResponse;
4-
import com.dduckddak.domain.data.dto.PopulationByQuarterDto;
5-
import com.dduckddak.domain.data.dto.PopulationsTop10Response;
6-
import com.dduckddak.domain.data.dto.TimelyDto;
3+
import com.dduckddak.domain.data.dto.*;
4+
import com.dduckddak.domain.data.dto.PopulationTransitionResponse.PopulationData;
75
import com.dduckddak.domain.data.model.Population;
86
import com.dduckddak.domain.data.model.PopulationType;
97
import com.dduckddak.domain.data.repository.PopulationRepository;
@@ -12,6 +10,7 @@
1210
import org.springframework.stereotype.Service;
1311
import org.springframework.transaction.annotation.Transactional;
1412

13+
import java.util.ArrayList;
1514
import java.util.Comparator;
1615
import java.util.List;
1716

@@ -74,4 +73,35 @@ else if(age.equals("60"))
7473
System.out.println(columnName);
7574
return populationRepository.findPopulationsTop10(columnName, orderCriteria, "'residentPopulation'");
7675
}
76+
77+
public PopulationTransitionResponse getFloatingPopulationTransition(String code) {
78+
List<Population> populations = populationRepository.findFloatingPopulationTransition(code);
79+
List<PopulationData> populationDataList = new ArrayList<>();
80+
81+
long[] quarterArr = new long[]{20241L, 20234L, 20233L, 20232L, 20231L};
82+
for(long quarter : quarterArr){
83+
84+
List<Population> listOfCity = populations.stream().filter
85+
(p -> p.getTown().getQuarter().equals(quarter)).toList();
86+
87+
Population population = listOfCity.stream().filter(p -> p.getTown().getCode().equals(code)).findFirst().get();
88+
long populationOfTown = population.getTotalPopulation();
89+
90+
int rankAtCity = listOfCity.indexOf(population) + 1; // 20241분기 시 내 등수
91+
long populationAvgOfCity = (long) listOfCity.stream().mapToLong(Population::getTotalPopulation).average().getAsDouble();
92+
93+
94+
List<Population> listOfDistrict = listOfCity.stream().filter
95+
(p -> p.getTown().getName().split(" ")[0].equals(population.getTown().getName().split(" ")[0])).toList();
96+
97+
int rankAtDistrict = listOfDistrict.indexOf(population) + 1; // 20241분기 구 내 등수
98+
long populationAvgOfDistrict = (long) listOfDistrict.stream().mapToLong(Population::getTotalPopulation).average().getAsDouble();
99+
100+
populationDataList.add(new PopulationData(quarter, populationOfTown, rankAtCity, populationAvgOfCity, rankAtDistrict, populationAvgOfDistrict));
101+
}
102+
103+
return PopulationTransitionResponse.from(populationDataList);
104+
105+
106+
}
77107
}

0 commit comments

Comments
 (0)