내가 하려는것
이 화면에 들어갈 데이터들을 모두 쿼리로 가져와서 차트에 뿌려주는것!
차트에 뿌리기위해 데이터들을 가져오는 쿼리를 작성했다.
그런데 문제는 찜과 리뷰같은건 딱 int나 String데이터지만 인기메뉴나 일별 방문인원같은건 여러개의 묶음인 데이터가 여러개 있는 형태... 그니까 List<VO>
같은 형태다
그냥 list로도 할라면 하겠지만....
[PopularVO(
franId=null, stDate=null, enDate=null, wishCnt=0, reviewCnt=0,
menuName=치킨텐더 샐러드, sumQty=7,
menuMap=null, morderDate=null, allPcnt=0, allPcntMap=null, resvDate=null, resvPcnt=0, resvPcntmap=null),
PopularVO(franId=null, stDate=null, enDate=null, wishCnt=0, reviewCnt=0,
menuName=달링 포인트 스트립, sumQty=5, menuMap=null, morderDate=null, allPcnt=0, allPcntMap=null,
resvDate=null, resvPcnt=0, resvPcntmap=null),
PopularVO(franId=null, stDate=null, enDate=null, wishCnt=0, reviewCnt=0, menuName=갈릭 립아이, sumQty=5,
menuMap=null, morderDate=null, allPcnt=0, allPcntMap=null, resvDate=null, resvPcnt=0, resvPcntmap=null),
PopularVO(franId=null, stDate=null, enDate=null, wishCnt=0, reviewCnt=0, menuName=퀸즈랜드 립아이,
sumQty=5, menuMap=null, morderDate=null, allPcnt=0, allPcntMap=null, resvDate=null, resvPcnt=0, resvPcntmap=null),
PopularVO(franId=null, stDate=null, enDate=null, wishCnt=0, reviewCnt=0, menuName=멜티드 치즈, sumQty=1,
menuMap=null, morderDate=null, allPcnt=0, allPcntMap=null, resvDate=null, resvPcnt=0, resvPcntmap=null)]
VO가 아래상태와 같기 때문에 list의 상태가 영... 가독성이 좋지않다..ㅎㅎ;;
@Data
@Alias("PopularVO")
public class PopularVO {
// 검색조건
private String franId;
private String stDate;
private String enDate;
//찜 갯수
private int wishCnt;
// 리뷰누적갯수
private int reviewCnt;
// 메뉴별 판매량
private String menuName;
private int sumQty;
// 전체 방문인원(일별)
private String morderDate;
private int allPcnt;
// 예약 방문 인원(일별)
private String resvDate;
private int resvPcnt;
}
VO 를 다 쪼갤까 하다가 너무 정신없어서 그냥 관련된거 다 묶어놨다. vo하나에 싹다 세팅해서 넘겨버리고싶어서.... 혀튼 그럼 판매량, 인원같은건 map처럼 예를들어 스테이크=3개, 일요일=10명 이런식으로 들어와야 한다. 그래서 저 세가지 데이터는 MAP으로 가져오고 싶었다.
그래서 MyBatis에서 resultMap="HashMap" 이런 방식을 찾아봤으나 그닥 와닿는게 없었다. 키값을 내가 정해주지 않고 데이터끼리 묶어주고싶은데말야...
이런저런 고민끝에 그냥 일단 코드 짜면서 방식을 찾아봤다!
그냥 List로 쿼리결과를 발생시킨 뒤 그 데이터를 Map으로 변환해 VO에 넣기로 결정!
따라서 VO에 map이 생겨야한다
// 메뉴별 판매량
private String menuName;
private int sumQty;
Map<String, Integer> menuMap;
// 전체 방문인원(일별)
private String morderDate;
private int allPcnt;
Map<String, Integer> allPcntMap;
// 예약 방문 인원(일별)
private String resvDate;
private int resvPcnt;
Map<String, Integer> resvPcntmap;
이렇게 추가해줬고
sql은 그냥 List안에 vo를 담아서 필요한 데이터들을 각자 불러왔다. 그리고 그 리스트들을 돌면서 map을 생성해주면 됨^-^
List<PopularVO> menulist = dao.getMenuCnt(vo);
Map<String, Integer> tempMap = new HashMap<>();
for(PopularVO menu : menulist) {
tempMap.put(menu.getMenuName(),menu.getSumQty());
}
vo.setMenuMap(tempMap);
List<PopularVO> allPcntlist = dao.getAllPcntCnt(vo);
Map<String, Integer> temp2Map = new HashMap<>();
for(PopularVO pcnt : allPcntlist) {
temp2Map.put(pcnt.getMorderDate(),pcnt.getAllPcnt());
}
vo.setAllPcntMap(temp2Map);
List<PopularVO> resvPcntlist = dao.getResvPcntCnt(vo);
Map<String, Integer> temp3Map = new HashMap<>();
for(PopularVO resv : resvPcntlist) {
temp3Map.put(resv.getResvDate(),resv.getResvPcnt());
}
vo.setResvPcntmap(temp3Map);
그러면 결과를 콘솔에 찍어보면 VO 하나에 모든 데이터가 들어오는걸 볼 수 있다
PopularVO(franId=CB2022901, stDate=2022/08/01, enDate=2022/09/01, wishCnt=1, reviewCnt=0, menuName=null, sumQty=0,
menuMap={치킨텐더 샐러드=7, 퀸즈랜드 립아이=5, 달링 포인트 스트립=5, 갈릭 립아이=5, 멜티드 치즈=1},
morderDate=null, allPcnt=0,
allPcntMap={2022-08-31=15, 2022-08-30=9}, resvDate=null, resvPcnt=0,
resvPcntmap={2022-08-31=15, 2022-08-30=9, 2022-08-27=2, 2022-08-25=2})
null이거나 0인애들은 파라미터 용도로 쓴거라서 그런것!
위의 list로 불러왔을때의 데이터보다 훨씬 가독성이 좋아졌다ㅎㅎ