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 조회 결과 그대로 화면에 뿌리게 된다면 중복적으로 나오는 정보가 있으니 이 데이터를 가공해야 한다.

image

데이터 가공 예시

    // 위 테이블과 같은 결과 반환
    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]]],
    ...
]