[SpringBoot] 데이터 가공
DB에서 조회된 결과가 화면에서 뿌리기 어려운 데이터라면 내가 원하는 형태의 데이터로 가공할 필요성이 있다. 보통 나는 스크립트 측에서 데이터 가공을 했었는데, 다른 방식도 알게 되어 공유하고자 한다. 아래와 같은 DB 조회 결과가 있다고 생각해 보자.
movie_no | movie_name | show_date | hall_no | hall_name | start_time | end_time |
---|---|---|---|---|---|---|
100 | 스파이더맨 | 2월 17일 | 1 | 1관 | 11시 00분 | 13시 10분 |
100 | 스파이더맨 | 2월 17일 | 1 | 1관 | 14시 00분 | 16시 10분 |
100 | 스파이더맨 | 2월 17일 | 2 | 2관 | 20시 00분 | 22시 10분 |
100 | 스파이더맨 | 2월 17일 | 2 | 2관 | 14시 00분 | 16시 10분 |
101 | 해적:도깨비 깃발 | 2월 17일 | 4 | 4관 | 9시 00분 | 10시 40분 |
101 | 해적:도깨비 깃발 | 2월 17일 | 4 | 4관 | 11시 10분 | 12시 50분 |
100 | 스파이더맨 | 2월 18일 | 1 | 1관 | 10시 00분 | 12시 10분 |
100 | 스파이더맨 | 2월 18일 | 2 | 2관 | 22시 00분 | 24시 10분 |
위와 같은 조회 결과가 있을 때, 보통 상영 극장 정보는 사진과 같이 영화 이름, 선택한 날짜, 관 정보는 중복적으로 나오지 않는 것을 확인할 수 있다. DB 조회 결과 그대로 화면에 뿌리게 된다면 중복적으로 나오는 정보가 있으니 이 데이터를 가공해야 한다.
데이터 가공 예시
// 위 테이블과 같은 결과 반환
List<MovieShowSchedule> lists = scheduleMapper.getAllSchedules();
List<Dto> result = new ArrayList<Dto>();
for (MovieShowSchedule schedule : lists) {
dto = getDto(result, schedule.getMovieNo(), schedule.hallNo(), schedule.showDate());
if (dto == null) {
dto = new Dto();
dto.setNo(schedule.getMovieNo());
dto.setName(schedule.getMovieName());
dto.setShowDate(schedule.getShowDate());
dto.setHallNo(schedule.getHallNo());
dto.setHallName(schedule.getHallName());
result.add(dto);
}
TimeTable timeTable = new TimeTable(schedule.getStartTime, schedule.getEndTime());
dto.getTimeTables().add(timeTable);
}
private static Dto getDto(List<Dto> result, int movieNo, String showDate, int hallNo) {
for (Dto dto : result) {
if (dto.getNo() == movieNo && dto.getHallNo == hallNo && dto.getShowDate().equals(showDate)) {
return dto;
}
}
}
위의 코드를 돌린 후 나온 코드를 정리해 보자면 아래와 같다.
[
Dto [name=스파이더맨, showDate=2월 17일, hallName=1관[[startTime=11시 00분, endTime=13시 10분], [startTime=14시 00분, endTime=16시 10분]]],
Dto [name=스파이더맨, showDate=2월 17일, hallName=2관[[startTime=20시 00분, endTime=22시 10분], [startTime=14시 00분, endTime=16시 10분]]],
Dto [name=해적:도깨비 깃발, showDate=2월 17일, hallName=4관[[startTime=9시 00분, endTime=10시 40분], [startTime=11시 10분, endTime=12시 50분]]],
...
]