오늘은 기존 출장 정보 생성 페이지에 출장 비용 정보를 포함한 페이지에서 두 가지 정보를 같이 생성하는 기능을 구현했다. 1개의 출장정보가 생성될 때 4개의 출장비용정보가 같이 생성되어야 하는 상황이었다.
블로그 참고: vo안에 다른 vo리스트 만들어서 사용하기
현재 jsp파일에도 form이 출장정보VO로 되어있는 점을 고려해 그냥 출장정보VO에 출장비용VO의 리스트를 담을 변수를 만들었다.
원래 controller에서 새로운 출장정보 생성 시 출장정보 VO를 생성해서 registerPage로 보내주었다. 그 아래에 출장비용VO를 미리 생성해서 출장VO에 넣은 후 보내주기로 했다. 혹시 접근 안 될까봐 model attribute에도 넣어주었는데 실제로는 출장VO의 변수로 접근한 것 같다. 이 방법으로 일단 addView(출장정보생성화면)까지는 띄웠다.
@RequestMapping(value = "/addBtView2.do", method = RequestMethod.POST)
public String addBtView(@ModelAttribute("searchVO") SampleDefaultVO searchVO, Model model) throws Exception {
BtVO btVO = new BtVO();
// 미리 ExpVO 4개 만들어서 ExpVOList에 넣어주기 (교통비, 일비, 숙박비, 기타)
List<BtExpVO> btExpList = new ArrayList<BtExpVO>();
String [] expenseType = {"교통비", "일비", "숙박비", "기타"};
for (int i=0; i<expenseType.length; i++) {
BtExpVO exp = new BtExpVO();
exp.setExpenseType(expenseType[i]);
exp.setExpenseDetail("");
exp.setPaymentMethod(0);
exp.setPrice(0);
btExpList.add(exp);
}
btVO.setBtExpVOList(btExpList);
model.addAttribute("btVO", btVO);
model.addAttribute("btExpVOList", btExpList);
return registerPage;
}
나는 이미 출장정보 insert기능이 구현되어 있었고, 또 sql에서도 insert는 따로 적혀있는 것을 생각해 순차적으로 쿼리를 실행하도록 했다. 먼저 출장정보 insert를 먼저 실행해서 거기서 생성된 btId
값을 받아온 후, 해당 btId를 외래 키로 하는 비용 정보들을 반복문으로 실행했다.
@RequestMapping(value = "/addBt2.do", method = RequestMethod.POST)
public String addBt(@ModelAttribute("searchVO") SampleDefaultVO searchVO, BtVO btVO, BindingResult bindingResult, Model model, SessionStatus status)
throws Exception {
// Server-Side Validation
beanValidator.validate(btVO, bindingResult);
if (bindingResult.hasErrors()) {
model.addAttribute("btVO", btVO);
return listPage;
}
String bt_id = btService.insertBt(btVO); //bt_id값 반환함
// btVO의 explist 가져와서 Exp 하나씩 insert
for (BtExpVO expVo : btVO.getBtExpVOList()) {
expVo.setBtId(bt_id);
btService.insertBtExp(expVo);
}
status.setComplete();
return "forward:/selectBtList2.do";
}
paymentMethod
라는 속성이 있었는데, select option의 value는 무조건 string으로 반환한다고 해서 이 부분이 문제인가 했었는데 아마도 int로 묵시적 형변환이 되는 것 같다. DB에서 sql 쿼리를 입력할 때도 "1" 이런 식으로 따옴표로 감싸서 넣어도 문제없이 잘 들어간다.// 금액 합계 기능
$(".price").on("change keyup paste", function() {
var total = 0;
$(".price").each(function() {
total += Number($(this).val());
});
// 합계 출력
$("#priceTotal").html(total);
});
상세조회 페이지에서 하나의 출장정보와 거기에 해당되는 4개의 출장비용정보들을 가져와서 보여주어야 한다. sql쿼리에서는 한 문장으로 가져오는게 가능하겠지만 가져오는 출장정보의 중복을 고려해서 insert를 했던 것처럼 따로 select해서 보여주기로 했다. 역시 한 번에 잘 되지는 않는다.
출장 정보만 표시하는 jsp에서는 출장정보 select가 되는데, 출장 비용까지 표시하는 jsp에서는 출장정보 select는 안되고, 출장비용리스트 select만 된다. 내일 해결책을 찾을 수 있기를 바라야겠다...