1216 개발일지

Yesol Lee·2021년 12월 16일
0

개발일지 - 2021

목록 보기
9/20

오늘 한 일

2개 테이블 정보 동시 생성

오늘은 기존 출장 정보 생성 페이지에 출장 비용 정보를 포함한 페이지에서 두 가지 정보를 같이 생성하는 기능을 구현했다. 1개의 출장정보가 생성될 때 4개의 출장비용정보가 같이 생성되어야 하는 상황이었다.

1. 출장정보 VO에 출장비용VO list 변수 선언

블로그 참고: vo안에 다른 vo리스트 만들어서 사용하기

현재 jsp파일에도 form이 출장정보VO로 되어있는 점을 고려해 그냥 출장정보VO에 출장비용VO의 리스트를 담을 변수를 만들었다.

2. 출장정보 VO 생성 시 출장비용 VO list도 만들어 넣어주기

원래 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;
	}

3. 출장 insert 후 출장비용 따로 insert 해주기

나는 이미 출장정보 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";
	}

출장비용 insert만 안 되는 문제

  • 출장비용 정보 중 int로 저장하는 paymentMethod라는 속성이 있었는데, select option의 value는 무조건 string으로 반환한다고 해서 이 부분이 문제인가 했었는데 아마도 int로 묵시적 형변환이 되는 것 같다. DB에서 sql 쿼리를 입력할 때도 "1" 이런 식으로 따옴표로 감싸서 넣어도 문제없이 잘 들어간다.
  • 알고보니 sql.xml의 쿼리에 괄호가 하나 더 들어가 있던 것 때문이었다.... 오전부터 오후까지 하루의 반을 고민한 문제가 오타 하나였다니 허탈하면서도 찾아서 다행이라고 생각했다.

비용 자동 합계 jquery

// 금액 합계 기능
$(".price").on("change keyup paste", function() {
  var total = 0;
  $(".price").each(function() {
    total += Number($(this).val());
  });
  // 합계 출력
  $("#priceTotal").html(total);
});

2개 테이블 상세조회(진행 중)

상세조회 페이지에서 하나의 출장정보와 거기에 해당되는 4개의 출장비용정보들을 가져와서 보여주어야 한다. sql쿼리에서는 한 문장으로 가져오는게 가능하겠지만 가져오는 출장정보의 중복을 고려해서 insert를 했던 것처럼 따로 select해서 보여주기로 했다. 역시 한 번에 잘 되지는 않는다.

현 상황

  1. 출장 + 출장비용 전부 표시하는 jsp에서는 정보 생성은 가능. 상세조회 시도 시 출장비용 리스트 정보는 조회할 수 있는데 출장 정보(dao, sql수준)를 조회하지 못하고 있다. 비용 리스트 정보를 register페이지로 넘겼을 때 form에 뿌려지는지는 테스트하지 못했다.
  2. 기존에 만든 출장 정보만 표시하는 jsp에서는 CRUD가 전부 된다. 1번과 같은 sql문을 사용하고 있다.

출장 정보만 표시하는 jsp에서는 출장정보 select가 되는데, 출장 비용까지 표시하는 jsp에서는 출장정보 select는 안되고, 출장비용리스트 select만 된다. 내일 해결책을 찾을 수 있기를 바라야겠다...

profile
문서화를 좋아하는 개발자

0개의 댓글