여행 일정 관리, 여행 상품 예약 및 커뮤니티 기

STEPY는 여행을 할 때 예약을 하는 과정과, 일정을 만들고 관리하는 기능, 그리고 정보를 공유하는 커뮤니티 기능을 하나로 통합하여 이용할 수 있도록 제작한 프로젝트 입니다.
개발 환경 언어 - JAVA / JavaScript / HTML IDE - Eclipse 프레임워크 - Spring Framework 웹 서버 - Apache Tomcat 9.0 주요 라이브러리 - JQuery / JSON / Apache Commons / MyBatis DB 설계 - Oracle SQL Developer 버전 관리 - Github 주요 역할 및 기능 실행 화면 1. 여행 일정 페이지- 여행의 이름, 장소, 기간 등을 선택하여 여행을 생성합니다. - datepicker를 활용해 출발일과 도착일이 각각 범위를 벗어나지 못하도록 처리하였습니다. - 여행을 생성함과 동시에 생성된 여행 번호가 session에 저장되고 일정 관리 페이지로 이동합니다. - 여행을 생성하면 선택한 기간만큼 자동으로 DAY항목을 생성합니다. - 일정 추가 버튼을 통해 데이터 베이스에 등록되어있는 매장 이름을 검색하여 선택이 가능처리하였습니다. - 생성된 일정 내용에 마우스 오버시 수정과 삭제 버튼이 생성되며 각각의 기능을 처리하도록 하였습니다. 일정 페이지 메인
//일정 페이지 이동 public ModelAndView pPlanFrm(long planNum, RedirectAttributes rttr) { log.info("service - pPlanFrm() - planNum : " + planNum); long num = (planNum == 0)? (long)session.getAttribute("curPlan") : planNum; mv = new ModelAndView(); TravelPlanDto plan = tDao.getPlan(num); //권한 검사 if(memberAuthCheck(plan)) { mv.addObject("plan", plan); //시작일과 종료일의 차이 계산 long days = getTime(plan.getT_stdate(), plan.getT_bkdate()); mv.addObject("days", days); //멤버 카운트 int memCnt = 0; if(!(plan.getT_member1().equals(" "))) { memCnt++; } if(!(plan.getT_member2().equals(" "))) { memCnt++; } if(!(plan.getT_member3().equals(" "))) { memCnt++; } if(!(plan.getT_member4().equals(" "))) { memCnt++; } if(!(plan.getT_member5().equals(" "))) { memCnt++; } mv.addObject("memCnt", memCnt); //여행 내용 가져오기 List<AccompanyPlanDto> planContentsList = tDao.getPlanContents(num); mv.addObject("planContentsList", planContentsList); //} //초대 리스트 전체 가져오기 List<InviteDto> iList = tDao.pGetInviteList(); mv.addObject("iList", iList); //새로운 초대 여부 확인 MemberDto member = (MemberDto)session.getAttribute("member"); int iCnt = tDao.pCheckInvite(member.getM_id()); mv.addObject("iCnt", iCnt); //현재 일정에 초대중인 멤버 가져오기 List<InviteDto> waitingList = tDao.pGetWaitingMember(num); mv.addObject("waitingList", waitingList); //세션에 현재 여행 번호 저장 session.setAttribute("curPlan", num); //가게 목록 불러오기 List<StoreDto> sList = tDao.getStoreList(); mv.addObject("sList", sList); mv.setViewName("pPlanFrm"); } else { mv.setViewName("redirect:/"); rttr.addFlashAttribute("msg", "접근 권한이 없습니다"); } return mv; }
//여행 등록 @Transactional public ModelAndView pRegPlan(TravelPlanDto plan, RedirectAttributes rttr) { log.info("service - pRegPlan()"); long planNum = System.currentTimeMillis(); mv = new ModelAndView(); try { plan.setT_plannum(planNum); tDao.pRegPlan(plan); mv.addObject("plan", plan); //시작일과 종료일의 차이 계산 long days = getTime(plan.getT_stdate(), plan.getT_bkdate()); mv.addObject("days", days); AccompanyPlanDto acPlan = new AccompanyPlanDto(); for(int i = 1; i <= days; i++) { acPlan.setAp_plannum(planNum); acPlan.setAp_mid(plan.getT_id()); acPlan.setAp_day(i); } //초기 체크리스트 설정 tDao.pInitChecklist1(planNum); tDao.pInitChecklist2(planNum); //초대 리스트 가져오기 List<InviteDto> iList = tDao.pGetInviteList(); mv.addObject("iList", iList); //새로운 초대 여부 확인 MemberDto member = (MemberDto)session.getAttribute("member"); int iCnt = tDao.pCheckInvite(member.getM_id()); mv.addObject("iCnt", iCnt); session.setAttribute("curPlan", planNum); mv.setViewName("pPlanFrm"); } catch (Exception e) { e.printStackTrace(); mv.setViewName("redirect:pMakePlanFrm"); rttr.addFlashAttribute("msg", "등록에 실패하였습니다"); } return mv; }
//여행 내용 등록 @Transactional public String RegAccompanyPlan(AccompanyPlanDto acPlan, RedirectAttributes rttr) { log.info("service - RegAccompanyPlan()"); try { //여행 내용 등록 tDao.regAccompanyPlan(acPlan); } catch (Exception e) { //e.printStackTrace(); } return "redirect:pPlanFrm?planNum=0"; }
//여행 내용 수정 페이지 이동 public ModelAndView pEditAccompanyPlanFrm(long day, long planCnt) { log.info("service - pEditAccompanyPlanFrm()"); return pStoreSearch(day, planCnt); } //여행 내용 수정 @Transactional public String pEditAccompanyPlan(AccompanyPlanDto acPlan, RedirectAttributes rttr) { log.info("service - pEditAccompanyPlan()"); try { tDao.pEditAccompanyPlan(acPlan); } catch (Exception e) { e.printStackTrace(); } return "redirect:pPlanFrm?planNum=0"; }
//여행 내용 삭제 @Transactional public String delAccompanyPlan(long day, long num, RedirectAttributes rttr) { log.info("service - delAccompanyPlan()"); Map<String, Long> apMap = new HashMap<String, Long>(); apMap.put("planNum", (long)session.getAttribute("curPlan")); apMap.put("day", day); apMap.put("num", num); try { //데이터 삭제 tDao.delAccompanyPlan(apMap); //남은 데이터 카운트 정렬 tDao.reduceNumCnt(apMap); } catch (Exception e) { //e.printStackTrace(); } return "redirect:pPlanFrm?planNum=0"; }
- JSTL을 활용하여 선택한 기간에 해당하는 일 수 만큼 여행 준비 단계를 포함한 가계부 항목이 자동으로 생성됩니다. - 비용 추가 버튼을 통해 가계부 내용 작성 페이지로 이동하며 날짜, 항목, 내용, 금액, 장소를 입력할 수 있습니다. - 자바스크립트를 이용하여 금액 입력란에는 숫자만 입력 가능 및 입력 시 1,000 단위로 콤마 표시가 되도록 처리하였습니다. - 장소 입력 시 글자수 입력을 50자로 제한하였습니다. - 가계부 메인 화면에서 추가된 항목들의 항목, 내용, 비용, 장소를 확인 할 수 있습니다. - 장소 입력란 클릭 시 팝업 창이 뜨며 매장 이름을 검색하여 선택할 수 있도록 처리하였습니다. - 가계부 각 내용을 클릭하여 내용 수정이 가능합니다. - 화면 좌측에 슬라이드 메뉴를 제작하여 여행 예산을 등록 및 변경 가능합니다. - 슬라이드 메뉴에서 추가된 비용의 총 합계를 확인 가능하며 설정된 예산에서 남은 예산을 자동으로 계산하여 보여주도록 하고, 결과가 +일 시 푸른색 바탕, -일 시 붉은색 바탕으로 변하도록 처리하였습니다.
//가계부 페이지 이동 public ModelAndView pHouseholdFrm(long planNum, RedirectAttributes rttr) { log.info("service - pHouseholdFrm() - planNum : " + planNum); long num = (planNum == 0)? (long)session.getAttribute("curPlan") : planNum; mv = new ModelAndView(); TravelPlanDto plan = tDao.getPlan(num); //권한 검사 if(memberAuthCheck(plan)) { mv.addObject("plan", plan); //시작일과 종료일의 차이 계산 long days = getTime(plan.getT_stdate(), plan.getT_bkdate()); mv.addObject("days", days); //멤버 카운트 int memCnt = 0; if(!(plan.getT_member1().equals(" "))) { memCnt++; } if(!(plan.getT_member2().equals(" "))) { memCnt++; } if(!(plan.getT_member3().equals(" "))) { memCnt++; } if(!(plan.getT_member4().equals(" "))) { memCnt++; } if(!(plan.getT_member5().equals(" "))) { memCnt++; } mv.addObject("memCnt", memCnt); //가계부 내용 가져오기 List<HouseholdDto> hList = tDao.getHouseholdList(num); mv.addObject("hList", hList); //초대 리스트 가져오기 List<InviteDto> iList = tDao.pGetInviteList(); mv.addObject("iList", iList); //새로운 초대 여부 확인 MemberDto member = (MemberDto)session.getAttribute("member"); int iCnt = tDao.pCheckInvite(member.getM_id()); mv.addObject("iCnt", iCnt); //현재 일정에 초대중인 멤버 가져오기 List<InviteDto> waitingList = tDao.pGetWaitingMember(num); mv.addObject("waitingList", waitingList); mv.setViewName("pHouseholdFrm"); } else { mv.setViewName("redirect:/"); rttr.addFlashAttribute("msg", "접근 권한이 없습니다"); } return mv; }
//가계부 내용 작성페이지 이동 public ModelAndView pWriteHousehold(long householdCnt, long days, long dayCnt) { log.info("service - pWriteHousehold() - householdCnt : " + householdCnt + ", days : " + days + " , dayCnt : " + dayCnt); long num = (days == 0)? (long)session.getAttribute("curDays") : days; session.setAttribute("cruDays", days); mv = new ModelAndView(); mv.addObject("householdCnt", householdCnt); mv.addObject("days", num); mv.addObject("dayCnt", dayCnt); //가게 목록 불러오기 List<StoreDto> sList = tDao.getStoreList(); mv.addObject("sList", sList); mv.setViewName("pWriteHousehold"); return mv; } //가계부 내용 등록 @Transactional public String regHousehold(HouseholdDto household, RedirectAttributes rttr) { log.info("service - regHousehold()"); String view = null; try { tDao.regHousehold(household); view = "redirect:pHouseholdFrm?planNum=0"; } catch (Exception e) { e.printStackTrace(); String cnt = Long.toString(household.getH_cnt()); view = "redirect:pWriteHousehold?householdCnt=" + cnt + "&days=0"; } return view; }
//가계부 내용 수정 페이지 이동 public ModelAndView pModHouseholdFrm(long days, long dayCnt, long householdCnt) { log.info("service - pModHouseholdFrm()"); mv = new ModelAndView(); Map<String, Long> hList = new HashMap<String, Long>(); hList.put("planNum", (long)session.getAttribute("curPlan")); hList.put("day", dayCnt); hList.put("householdCnt", householdCnt); HouseholdDto household = tDao.getHouseholdContentes(hList); mv.addObject("dayCnt", dayCnt); mv.addObject("days", days); mv.addObject("contents", household); mv.setViewName("pModHouseholdFrm"); //가게 목록 불러오기 List<StoreDto> sList = tDao.getStoreList(); mv.addObject("sList", sList); return mv; } //가계부 내용 수정 @Transactional public String modHousehold(HouseholdDto household, RedirectAttributes rttr) { log.info("service - modHousehold()"); String view = null; Map<String, Long> hMap = new HashMap<String, Long>(); hMap.put("planNum", household.getH_plannum()); hMap.put("curDay", household.getH_curday()); hMap.put("householdCnt", household.getH_cnt()); try { //가계부 내용 수정 tDao.ModHousehold(household); //남은 데이터 카운트 정렬 tDao.reduceHouseholdCnt(hMap); view = "redirect:pHouseholdFrm?planNum=0"; } catch (Exception e) { e.printStackTrace(); view = "redirect:pPlanFrm?planNum=0"; } return view; }
//가계부 내용 삭제 @Transactional public String delHousehold(long day, long householdCnt, RedirectAttributes rttr) { log.info("service - delHousehold()"); String view = null; Map<String, Long> hMap = new HashMap<String, Long>(); hMap.put("planNum", (long)session.getAttribute("curPlan")); hMap.put("curDay", day); hMap.put("householdCnt", householdCnt); try { //데이터 삭제 tDao.delHousehold(hMap); //남은 데이터 카운트 정렬 tDao.reduceHouseholdCnt(hMap); view = "redirect:pHouseholdFrm?planNum=0"; } catch (Exception e) { e.printStackTrace(); view = "redirect:pPlanFrm?planNum=0"; } return view; }
//예산 등록 public Map<String, Long> pRegBudget(long planNum, long budget) { log.info("service - pRegBudget() - planNum : " + planNum + ", budget : " + budget); Map<String, Long> rbMap = new HashMap<String, Long>(); rbMap.put("planNum", planNum); rbMap.put("budget", budget); try { //예산 등록 tDao.pRegBudget(rbMap); //여행 정보 다시불러오기 Long totalCost = tDao.getBalance(planNum); if(totalCost == null) { rbMap.put("totalCost", 0L); rbMap.put("balance", budget); } else { rbMap.put("totalCost", totalCost); rbMap.put("balance", (budget - totalCost)); } } catch (Exception e) { e.printStackTrace(); } return rbMap; }
- 페이지에서 카테고리와 준비물을 각각 추가 가능합니다. - 생성된 카테고리와 준비물은 각 메뉴에 마우스 오버시 수정과 삭제 메뉴가 나타나며 이를 클릭하여 수장과 삭제가 가능하도록 처리하였습니다. - 카테고리와 준비물은 각각 미리 지정된 항목을 선택 가능하며 직접 입력도 가능하도록 처리하였습니다. - 직접 입력 시 글자수 입력은 20자로 제한하였습니다. - 준비물에 체크하면 ajax를 통해 따로 저장 버튼 등을 누르지 않더라도 데이터베이스에 변경사항 저장하도록 처리하였습니다.
//체크리스트 페이지로 이동 public ModelAndView pCheckSupFrm(long planNum, RedirectAttributes rttr) { log.info("service - pCheckSupFrm() - planNum : " + planNum); long num = (planNum == 0)? (long)session.getAttribute("curPlan") : planNum; mv = new ModelAndView(); //여행 정보 가져오기 TravelPlanDto plan = tDao.getPlan(num); //권한 체크 if(memberAuthCheck(plan)) { //체크리스트 내용 가져오기 List<CheckListDto> checklist = tDao.getCheckList(num); //체크리스트 카테고리 개수 가져오기 int categoryNum = tDao.getCategoryNum(num); //레이아웃 생성용 뷰 가져오기 List<ChecklistViewDto> cvList = tDao.getCV(num); mv.addObject("plan", plan); mv.addObject("checklist", checklist); mv.addObject("categoryNum", categoryNum); mv.addObject("cvList", cvList); //멤버 카운트 int memCnt = 0; if(!(plan.getT_member1().equals(" "))) { memCnt++; } if(!(plan.getT_member2().equals(" "))) { memCnt++; } if(!(plan.getT_member3().equals(" "))) { memCnt++; } if(!(plan.getT_member4().equals(" "))) { memCnt++; } if(!(plan.getT_member5().equals(" "))) { memCnt++; } mv.addObject("memCnt", memCnt); //초대 리스트 가져오기 List<InviteDto> iList = tDao.pGetInviteList(); mv.addObject("iList", iList); //새로운 초대 여부 확인 MemberDto member = (MemberDto)session.getAttribute("member"); int iCnt = tDao.pCheckInvite(member.getM_id()); mv.addObject("iCnt", iCnt); //현재 일정에 초대중인 멤버 가져오기 List<InviteDto> waitingList = tDao.pGetWaitingMember(num); mv.addObject("waitingList", waitingList); mv.setViewName("pCheckSupFrm"); } else { mv.setViewName("redirect:/"); rttr.addFlashAttribute("msg", "접근 권한이 없습니다"); } return mv; }
//준비물 추가 페이지 이동 public ModelAndView pAddCheckItemFrm(long category, String categoryName, long itemCnt) { log.info("service - pAddCheckItemFrm() - category : " + category + ", categoryName : " + categoryName + ", itemCnt : " + itemCnt); mv = new ModelAndView(); mv.addObject("planNum", (long)session.getAttribute("curPlan")); mv.addObject("category", category); mv.addObject("categoryName", categoryName); mv.addObject("itemCnt", itemCnt); mv.setViewName("pAddCheckItemFrm"); return mv; } //준비물 추가 @Transactional public String pAddCheckItem(long category, String categoryName, long itemCnt, String itemName, RedirectAttributes rttr) { log.info("service - pAddCheckItem() - planNum : " + ", category : " + category + ", categoryName : " + categoryName + ", itemCnt : " + itemCnt + ", itemName : " + itemName); CheckListDto checklist = new CheckListDto(); checklist.setCl_plannum((long)session.getAttribute("curPlan")); checklist.setCl_category(category); checklist.setCl_categoryname(categoryName); checklist.setCl_cnt(itemCnt); checklist.setCl_item(itemName); mv = new ModelAndView(); try { tDao.pAddCheckItem(checklist); } catch (Exception e) { e.printStackTrace(); } return "redirect:pCheckSupFrm?planNum=0"; }
//카테고리 추가 페이지 이동 public ModelAndView pAddCheckCategoryFrm(long category) { log.info("service - pAddCheckCategoryFrm() - category : " + category); mv = new ModelAndView(); mv.addObject("category", category); mv.setViewName("pAddCheckCategoryFrm"); return mv; } //카테고리 추가 @Transactional public String pAddCheckCategory(CheckListDto checklist, RedirectAttributes rttr) { log.info("service - pAddCheckCategory()"); String view = null; try { tDao.pAddCheckItem(checklist); view = "redirect:pCheckSupFrm?planNum=0"; } catch (Exception e) { e.printStackTrace(); view = "redirect:pAddCheckCategoryFrm?category=" + checklist.getCl_category(); } return view; }
//준비물 수정 @Transactional public String pEditCheckItem(CheckListDto checklist, RedirectAttributes rttr) { log.info("service - pEditCheckItem()"); try { //준비물 수정 tDao.pEditCheckItem(checklist); } catch (Exception e) { e.printStackTrace(); } return "redirect:pCheckSupFrm?planNum=0"; }
//카테고리 수정 @Transactional public String pEditCheckCategory(CheckListDto checklist, RedirectAttributes rttr) { log.info("service - pEditCheckCategory()"); try { //카테고리 수정 tDao.pEditCheckCategory(checklist); } catch (Exception e) { e.printStackTrace(); } return "redirect:pCheckSupFrm?planNum=0"; }
//준비물 삭제 @Transactional public String delCheckItem(long category, long itemCnt, RedirectAttributes rttr) { log.info("service - delCheckItem() - category : " + category + ", itemCnt : " + itemCnt); CheckListDto checklist = new CheckListDto(); checklist.setCl_plannum((long)session.getAttribute("curPlan")); checklist.setCl_category(category); checklist.setCl_cnt(itemCnt); try { //준비물 삭제 tDao.delCheckItem(checklist); //나머지 준비물 카운트 정렬 tDao.reduceCheckItemCnt(checklist); } catch (Exception e) { e.printStackTrace(); } return "redirect:pCheckSupFrm?planNum=0"; }
//카테고리 삭제 @Transactional public String delCheckCategory(long category, RedirectAttributes rttr) { log.info("service - delCheckCategory() - category : " + category); ChecklistViewDto cv = new ChecklistViewDto(); cv.setCl_plannum((long)session.getAttribute("curPlan")); cv.setCl_category(category); try { //카테고리 삭제 tDao.delCheckCategory(cv); //나머지 카테고리 카운트 정렬 tDao.reduceCheckCategoryCnt(cv); } catch (Exception e) { e.printStackTrace(); } return "redirect:pCheckSupFrm?planNum=0"; }
//체크리스트 상태 변경 public CheckListDto pChangeCheck(long planNum, long category, long itemCnt, long check) { log.info("service - pChangeCheck() - planNum : " + planNum + ", category : " + category + ", itemCnt : " + itemCnt + ", check : " + check); String result = null; Map<String, Long> clMap = new HashMap<String, Long>(); clMap.put("planNum", planNum); clMap.put("category", category); clMap.put("itemCnt", itemCnt); clMap.put("check", check); try { tDao.pChangeCheck(clMap); } catch (Exception e) { e.printStackTrace(); } CheckListDto checklist = tDao.getACheck(clMap); return checklist; }
- 생성한 일정페이지에서 아이디로 회원을 검색해 여행에 일행으로 초대가 가능합니다. - 또한 초대 중인 회원을 클릭해 회원을 취소 할 수 있습니다. - 초대를 받은 회원은 일정 페이지 접속 시 우측 하단에 알림창을 띄워 승인과 거절을 선택할 수 있도록 처리하였습니다. - 현재 여행에 참여 중인 회원과 초대 중인 회원 목록을 확인 가능합니다. - 여행을 생성한 회원만 참여 중인 회원을 클릭해 내보내기 가능하도록 처리하였습니다. - 여행 정보 수정은 같은 일정에 참여중인 모든 회원이 접근 할 수 있도록 처리하였습니다. - 여행을 생성한 회원만이 여행 삭제가 가능하고 그 이외의 회원은 여행에서 나가기 기능이 활성화 되도록 처리하였습니다. 일행 초대
//일행 초대 페이지 이동 @Transactional public ModelAndView pInviteMemberFrm(String id, String planName) { log.info("service - pInviteMemberFrm() - id : " + id + ", planName : " + planName); InviteDto invite = new InviteDto(); invite.setI_mid(id); invite.setI_planname(planName); //회원 리스트 가져오기 List<MemberDto> mList = tDao.pGetMemberList(); mv = new ModelAndView(); mv.addObject("invite", invite); mv.addObject("mList", mList); mv.setViewName("pInviteMemberFrm"); return mv; } //일행 초대 public String pInviteMember(InviteDto invite, RedirectAttributes rttr) { log.info("service - pInviteMember()"); String msg = null; //초대 코드 생성 while(true) { long code = (long)(Math.random()*10000000000000L); System.out.println("invite code : " + code); //생성된 중복 검사 int codeCnt = tDao.checkInviteCode(code); if(codeCnt == 0) { //중복되는 코드가 없으면 코드 사용 invite.setI_code(code); break; } } //초대 회원 중복 검사 int inviteDupCheck = tDao.pCheckInviteId(invite); TravelPlanDto plan = tDao.getPlan(invite.getI_plannum()); if(inviteDupCheck == 1) { msg = "이 일정에 이미 초대중인 회원입니다"; } else if(plan.getT_member1().equals(invite.getI_inviteid()) || plan.getT_member2().equals(invite.getI_inviteid()) || plan.getT_member3().equals(invite.getI_inviteid()) || plan.getT_member4().equals(invite.getI_inviteid()) || plan.getT_member5().equals(invite.getI_inviteid())) { msg = "이 일정에 이미 참여중인 회원입니다"; } else if(inviteDupCheck == 0) { try { tDao.pInviteMember(invite); msg = invite.getI_inviteid() + "님을 일정에 초대하였습니다"; } catch (Exception e) { e.printStackTrace(); msg = "초대에 실패하였습니다. 관리자에 문의해주세요"; } } rttr.addFlashAttribute("msg", msg); return "redirect:pPlanFrm?planNum=0"; }
//초대 취소 @Transactional public String pCancelInvite(long planNum, String id, RedirectAttributes rttr) { log.info("service - pCancelInvite() - planNum : " + planNum + ", id : " + id); InviteDto invite = new InviteDto(); invite.setI_plannum(planNum); invite.setI_inviteid(id); try { tDao.pCancelInvite(invite); } catch (Exception e) { e.printStackTrace(); } return "redirect:pPlanFrm?planNum=0"; }
//초대 승인 @Transactional public String pJoinPlan(long code, long planNum, String id, RedirectAttributes rttr) { log.info("service - pJoinPlan() - code : " + code + ", planNum : " + planNum + ", id : " + id); String msg = null; InviteDto invite = new InviteDto(); invite.setI_code(code); invite.setI_plannum(planNum); invite.setI_inviteid(id); //초대코드 유효성 검사 int valid = tDao.pCheckCodeValid(invite); if(valid == 1) { //여행에 빈 멤버 자리 검사 TravelPlanDto plan = tDao.getPlan(planNum); msg = plan.getT_planname() + " 에 참여하였습니다."; try { if(plan.getT_member1().equals(" ")) { //일정에 추가 tDao.pJoinPlan1(invite); //초대코드 삭제 tDao.pDelInvite(invite); } else if(plan.getT_member2().equals(" ")) { tDao.pJoinPlan2(invite); tDao.pDelInvite(invite); } else if(plan.getT_member3().equals(" ")) { tDao.pJoinPlan3(invite); tDao.pDelInvite(invite); } else if(plan.getT_member4().equals(" ")) { tDao.pJoinPlan4(invite); tDao.pDelInvite(invite); } else if(plan.getT_member5().equals(" ")) { tDao.pJoinPlan5(invite); tDao.pDelInvite(invite); } else {//일행이 5명 다 차있을 시 msg = "더 이상 참여할 수 없습니다!"; rttr.addFlashAttribute("msg", msg); return "redirect:pPlanList?id=" + id; } } catch (Exception e) { e.printStackTrace(); msg = "오류가 발생했습니다"; } } rttr.addFlashAttribute("msg", msg); return "redirect:pPlanFrm?planNum=" + planNum; } //초대 거절 @Transactional public Map<String, List<InviteDto>> pRejectPlan(long code) { log.info("service - pRejectPlan() - code : " + code); Map<String, List<InviteDto>> iMap = null; try { //초대 삭제 InviteDto invite = new InviteDto(); invite.setI_code(code); tDao.pDelInvite(invite); //초대 리스트 다시 가져오기 List<InviteDto> iList = tDao.pGetInviteList(); iMap = new HashMap<String, List<InviteDto>>(); iMap.put("iList", iList); } catch (Exception e) { e.printStackTrace(); } return iMap; }
//여행 정보 수정 페이지 이동 public ModelAndView pEditPlanFrm() { log.info("service - pEditPlanFrm()"); mv = new ModelAndView(); TravelPlanDto plan = tDao.getPlan((long)session.getAttribute("curPlan")); mv.addObject("plan", plan); mv.setViewName("pEditPlanFrm"); return mv; } //여행 정보 수정 @Transactional public String pEditPlan(TravelPlanDto plan, RedirectAttributes rttr) { log.info("service - pEditPlan()"); String msg = null; plan.setT_plannum((long)session.getAttribute("curPlan")); try { //정보 수정 tDao.pEditPlan(plan); //새로운 날짜 차이 long newDays = getTime(plan.getT_stdate(), plan.getT_bkdate()); System.out.println(newDays); //기간을 초과하는 일정 정보 삭제 tDao.pDelOverDate(newDays); //기간을 초과하는 가계부 정보 삭제 tDao.pDelOverHousehold(newDays); msg = "정보가 수정되었습니다"; } catch (Exception e) { e.printStackTrace(); msg = "수정에 실패하였습니다"; } rttr.addFlashAttribute("msg", msg); return "redirect:pPlanFrm?planNum=0"; }
//회원 내보내기 @Transactional public String pDepMember(long planNum, String member, RedirectAttributes rttr) { log.info("service - pDepMember() - planNum : " + planNum + ", member : " + member); String msg = null; try { //일행 삭제 switch (member) { case "member1": tDao.pDepmember1(planNum); break; case "member2": tDao.pDepmember2(planNum); break; case "member3": tDao.pDepmember3(planNum); break; case "member4": tDao.pDepmember4(planNum); break; case "member5": tDao.pDepmember5(planNum); break; } } catch (Exception e) { e.printStackTrace(); msg = "오류가 발생했습니다"; } rttr.addFlashAttribute("msg", msg); return "redirect:pPlanFrm?planNum=0"; }
//여행에서 나가기 @Transactional public String pExitPlan(RedirectAttributes rttr) { log.info("service - pExitPlan()"); String msg = null; TravelPlanDto plan = tDao.getPlan((long)session.getAttribute("curPlan")); MemberDto member = (MemberDto)session.getAttribute("member"); String id = member.getM_id(); try { if(plan.getT_member1().equals(id)) { tDao.pDepmember1(plan.getT_plannum()); } else if(plan.getT_member2().equals(id)) { tDao.pDepmember2(plan.getT_plannum()); } else if(plan.getT_member3().equals(id)) { tDao.pDepmember3(plan.getT_plannum()); } else if(plan.getT_member4().equals(id)) { tDao.pDepmember4(plan.getT_plannum()); } else if(plan.getT_member5().equals(id)) { tDao.pDepmember5(plan.getT_plannum()); } msg = "여행에서 탈퇴하였습니다"; } catch (Exception e) { e.printStackTrace(); msg = "오류가 발생했습니다"; } rttr.addFlashAttribute("msg", msg); return "redirect:pPlanList?id=" + id; }
//여행 삭제
@Transactional
public String pDelPlan(RedirectAttributes rttr) {
log.info("service - pDelPlan");
String msg = null;
long planNum = (long)session.getAttribute("curPlan");
try {
//일정 삭제
tDao.pDelSchedule(planNum);
//가계부 삭제
tDao.pDelHousehold(planNum);
//체크리스트 삭제
tDao.pDelChecklist(planNum);
//여행 삭제
tDao.pDelPlan(planNum);
msg = "여행을 삭제하였습니다";
} catch (Exception e) {
e.printStackTrace();
msg = "삭제에 실패하였습니다";
}
MemberDto member = (MemberDto)session.getAttribute("member");
String id = member.getM_id();
rttr.addFlashAttribute("msg", msg);
return "redirect:pPlanList?id=" + id;
}
Controller 구성
package com.bob.stepy;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.bob.stepy.dto.AccompanyPlanDto;
import com.bob.stepy.dto.CheckListDto;
import com.bob.stepy.dto.HouseholdDto;
import com.bob.stepy.dto.InviteDto;
import com.bob.stepy.dto.TravelPlanDto;
import com.bob.stepy.service.TravelPlanService;
import lombok.extern.java.Log;
@Controller
@Log
public class TravelPlanController {
@Autowired
TravelPlanService tServ;
ModelAndView mv;
//여행 만들기 페이지 이동
@GetMapping("pMakePlanFrm")
public String pMakePlanFrm() {
log.info("controller - pMakePlanFrm()");
return "pMakePlanFrm";
}
//여행 등록
@PostMapping("pRegPlan")
public ModelAndView pRegPlan(TravelPlanDto plan, RedirectAttributes rttr) {
log.info("controller - pRegPlan()");
return tServ.pRegPlan(plan, rttr);
}
//여행 목록 페이지 이동
@GetMapping("pPlanList")
public ModelAndView pPlanList(String id) {
log.info("controller - pPlanList()");
//여행 정보 가져오기
mv = tServ.pPlanList(id);
return mv;
}
//일정 페이지 이동
@GetMapping("pPlanFrm")
public ModelAndView pPlanFrm(long planNum, RedirectAttributes rttr) {
log.info("controller - pPlanFrm()");
return tServ.pPlanFrm(planNum, rttr);
}
//장소 검색 페이지 이동
@GetMapping("pStoreSearch")
public ModelAndView pStoreSearch(long day, long planCnt) {
log.info("controller - pStoreSearch()");
return tServ.pStoreSearch(day, planCnt);
}
//여행 내용 등록
@GetMapping("RegAccompanyPlan")
public String RegAccompanyPlan(AccompanyPlanDto acPlan, RedirectAttributes rttr) {
log.info("controller - RegAccompanyPlan()");
return tServ.RegAccompanyPlan(acPlan, rttr);
}
//여행 내용 삭제
@GetMapping("delAccompanyPlan")
public String delAccompanyPlan(long day, long num, RedirectAttributes rttr) {
log.info("controller - delAccompanyPlan() - day : " + day + ", num : " + num);
return tServ.delAccompanyPlan(day, num, rttr);
}
//여행 내용 수정 페이지 이동
@GetMapping("pEditAccompanyPlanFrm")
public ModelAndView pEditAccompanyPlanFrm(long day, long planCnt) {
log.info("controller - editAccompanyPlanFrm() - day : " + day + ", planCnt : " + planCnt);
return tServ.pEditAccompanyPlanFrm(day, planCnt);
}
//여행 내용 수정
@GetMapping("pEditAccompanyPlan")
public String pEditAccompanyPlan(AccompanyPlanDto acPlan, RedirectAttributes rttr) {
log.info("controller - pEditAccompanyPlan()");
return tServ.pEditAccompanyPlan(acPlan, rttr);
}
//가계부 페이지 이동
@GetMapping("pHouseholdFrm")
public ModelAndView pHouseholdFrm(long planNum, RedirectAttributes rttr) {
log.info("controller - pHouseholdFrm()");
return tServ.pHouseholdFrm(planNum, rttr);
}
//가계부 내용 작성 페이지 이동
@GetMapping("pWriteHousehold")
public ModelAndView pWriteHousehold(long householdCnt, long days, long dayCnt) {
log.info("controller - pWriteHousehold() - householdCnt : " + householdCnt + ", days : " + days + " , dayCnt : " + dayCnt);
return tServ.pWriteHousehold(householdCnt, days, dayCnt);
}
//가계부 내용 등록
@GetMapping("regHousehold")
public String regHousehold(HouseholdDto household, RedirectAttributes rttr) {
log.info("controller - regHousehold()");
return tServ.regHousehold(household, rttr);
}
//가계부 수정 페이지 이동
@GetMapping("pModHouseholdFrm")
public ModelAndView pModHouseholdFrm(long days, long dayCnt, long householdCnt) {
log.info("controller - pModHouseholdFrm()");
return tServ.pModHouseholdFrm(days, dayCnt, householdCnt);
}
//가계부 내용 수정
@GetMapping("modHousehold")
public String ModHousehold(HouseholdDto household, RedirectAttributes rttr) {
log.info("controller - modHousehold()");
return tServ.modHousehold(household, rttr);
}
//가계부 내용 삭제
@GetMapping("delHousehold")
public String delHousehold(long day, long householdCnt, RedirectAttributes rttr) {
log.info("contorller - delHousehold()");
return tServ.delHousehold(day, householdCnt, rttr);
}
//예산 입력
@PostMapping(value = "pRegBudget", produces = "application/json; charset=utf-8")
@ResponseBody
public Map<String, Long> pRegBudget(long planNum, long budget){
log.info("controller - tServ.pRegBudget() - planNum : " + planNum + ", budget : " + budget);
return tServ.pRegBudget(planNum, budget);
}
//체크리스트 페이지 이동
@GetMapping("pCheckSupFrm")
public ModelAndView pCheckSupFrm(long planNum, RedirectAttributes rttr) {
log.info("controller - pCheckSupFrm()");
return tServ.pCheckSupFrm(planNum, rttr);
}
//체크리스트 상태 변경
@PostMapping(value = "pChangeCheck", produces = "application/json; charset=utf-8")
@ResponseBody
public CheckListDto pChangeCheck(long planNum, long category, long itemCnt, long check) {
log.info("controller - pChangeCheck() - planNum : " + planNum + ", category : " + category + ", itemCnt : " + itemCnt + ", check : " + check);
return tServ.pChangeCheck(planNum, category, itemCnt, check);
}
//준비물 추가 페이지 이동
@GetMapping("pAddCheckItemFrm")
public ModelAndView pAddCheckItemFrm(long category, String categoryName, long itemCnt) {
log.info("controller - pAddCheckItemFrm() - category : " + category + ", categoryName : " + categoryName + ", itemCnt : " + itemCnt);
return tServ.pAddCheckItemFrm(category, categoryName, itemCnt);
}
//준비물 추가
@GetMapping("pAddCheckItem")
public String pAddCheckItem(long category, String categoryName, long itemCnt, String itemName, RedirectAttributes rttr) {
log.info("controller - pAddCheckItem() - category : " + category + ", categoryName : " + categoryName + ", itemCnt : " + itemCnt + ", itemName : " + itemName);
return tServ.pAddCheckItem(category, categoryName, itemCnt, itemName, rttr);
}
//카테고리 추가 페이지 이동
@GetMapping("pAddCheckCategoryFrm")
public ModelAndView pAddCheckCategoryFrm(long category) {
log.info("controller - pAddCheckCategoryFrm() - category : " + category);
return tServ.pAddCheckCategoryFrm(category);
}
//카테고리 추가
@GetMapping("pAddCheckCategory")
public String pAddCheckCategory(CheckListDto checklist, RedirectAttributes rttr) {
log.info("controller - pAddCheckCategory()");
return tServ.pAddCheckCategory(checklist, rttr);
}
//준비물 삭제
@GetMapping("delCheckItem")
public String delCheckItem(long category, long itemCnt, RedirectAttributes rttr) {
log.info("controller - delCheckItem() - category : " + category + ", itemCnt : " + itemCnt);
return tServ.delCheckItem(category, itemCnt, rttr);
}
//카테고리 삭제
@GetMapping("delCheckCategory")
public String delCheckCategory(long category, RedirectAttributes rttr) {
log.info("controller - delCheckCategory() - category : " + category);
return tServ.delCheckCategory(category, rttr);
}
//준비물 수정
@GetMapping("pEditCheckItem")
public String pEditCheckItem(CheckListDto checklist, RedirectAttributes rttr) {
log.info("controller - pEditCheckItem()");
return tServ.pEditCheckItem(checklist, rttr);
}
//카테고리 수정
@GetMapping("pEditCheckCategory")
public String pEditCheckCategory(CheckListDto checklist, RedirectAttributes rttr) {
log.info("controller - pEditCheckCategory()");
return tServ.pEditCheckCategory(checklist, rttr);
}
//일행 초대 페이지 이동
@GetMapping("pInviteMemberFrm")
public ModelAndView pInviteMemberFrm(String id, String planName) {
log.info("controller - pInviteMemberFrm() - id : " + id + ", planName : " + planName);
return tServ.pInviteMemberFrm(id, planName);
}
//일행 초대
@PostMapping("pInviteMember")
public String pInviteMember(InviteDto invite, RedirectAttributes rttr) {
log.info("contorller - pInviteMember()");
return tServ.pInviteMember(invite, rttr);
}
//초대 승인
@GetMapping("pJoinPlan")
public String pJoinPlan(long code, long planNum, String id, RedirectAttributes rttr) {
log.info("controller - pJoinPlan() - code : " + code + ", planNum : " + planNum + ", id : " + id);
return tServ.pJoinPlan(code, planNum, id, rttr);
}
//초대 거절
@PostMapping(value = "pRejectPlan", produces = "application/json; charset=utf-8")
@ResponseBody
public Map<String, List<InviteDto>> pRejectPlan(long code) {
log.info("controller - pRejectPlan() - code : " + code);
return tServ.pRejectPlan(code);
}
//여행 삭제
@GetMapping("pDelPlan")
public String pDelPlan(RedirectAttributes rttr) {
log.info("controller - pDelPlan()");
return tServ.pDelPlan(rttr);
}
//여행 정보 수정페이지 이동
@GetMapping("pEditPlanFrm")
public ModelAndView pEditPlanFrm() {
log.info("controller - pEditPlanFrm()");
return tServ.pEditPlanFrm();
}
//여행 정보 수정
@PostMapping("pEditPlan")
public String pEditPlan(TravelPlanDto plan, RedirectAttributes rttr) {
log.info("controller - pEditPlan()");
return tServ.pEditPlan(plan, rttr);
}
//초대 취소
@GetMapping("pCancelInvite")
public String pCancelInvite(long planNum, String id, RedirectAttributes rttr) {
log.info("controller - pCancelInvite() - planNum : " + planNum + ", id : " + id);
return tServ.pCancelInvite(planNum, id, rttr);
}
//회원 내보내기
@GetMapping("pDepMember")
public String pDepMember(long planNum, String member, RedirectAttributes rttr) {
log.info("controller - pDepMember1() - planNum : " + planNum + ", member : " + member);
return tServ.pDepMember(planNum, member, rttr);
}
//여행에서 나가기
@GetMapping("pExitPlan")
public String pExitPlan(RedirectAttributes rttr) {
log.info("controller - pExitPlan()");
return tServ.pExitPlan(rttr);
}
}
DAO 구성
MyBatis를 사용하여 mappingInterface와 실제 쿼리문이 작성된 mapper.xml로 나누어져 있습니다.
DAO.javapackage com.bob.stepy.dao; import java.util.List; import java.util.Map; import com.bob.stepy.dto.AccompanyPlanDto; import com.bob.stepy.dto.CheckListDto; import com.bob.stepy.dto.ChecklistViewDto; import com.bob.stepy.dto.HouseholdDto; import com.bob.stepy.dto.InviteDto; import com.bob.stepy.dto.MemberDto; import com.bob.stepy.dto.StoreDto; import com.bob.stepy.dto.TravelPlanDto; public interface TravelPlanDao { //여행 일정 등록 public void pRegPlan(TravelPlanDto plan); //여행 일정 리스트 가져오기 public List<TravelPlanDto> getPlanList(String id); //여행 일정 정보 가져오기 public TravelPlanDto getPlan(long planNum); //여행 일정 설정하기 public void regPlanContents(AccompanyPlanDto acPlan); //여행 전체 일수 가져오기 public int getTravelDays(long planNum); //여행 일정 내용 가져오기 public List<AccompanyPlanDto> getPlanContents(long planNum); //가게 정보 가져오기 public List<StoreDto> getStoreList(); //여행 내용 등록 public void regAccompanyPlan(AccompanyPlanDto acPlan); //여행 내용 삭제 public void delAccompanyPlan(Map<String, Long> apMap); //여행 내용 수정 public void pEditAccompanyPlan(AccompanyPlanDto acPlan); //여행 번호 카운트 정렬 public void reduceNumCnt(Map<String, Long> apMap); //가계부 내용 등록 public void regHousehold(HouseholdDto household); //가계부 목록 가져오기 public List<HouseholdDto> getHouseholdList(long planNum); //가계부 내용 가져오기 public HouseholdDto getHouseholdContentes(Map<String, Long> hList); //가계부 수정 public void ModHousehold(HouseholdDto household); //가계부 내용 카운트 정렬 public void reduceHouseholdCnt(Map<String, Long> hMap); //가계부 내용 삭제 public void delHousehold(Map<String, Long> hMap); //예산 등록 public void pRegBudget(Map<String, Long> rbMap); //예산 전체 조회 public Long getBalance(Long planNum); //체크리스트 내용 가져오기 public List<CheckListDto> getCheckList(long planNum); //체크리스트 카테고리 개수 가져오기 public int getCategoryNum(long planNum); //체크리스트 레이아웃 생성용 뷰 가져오기 public List<ChecklistViewDto> getCV(long planNum); //체크리스트 상태 변경 public void pChangeCheck(Map<String, Long> clMap); //체크리스트 특정 항목 가져오기 public CheckListDto getACheck(Map<String, Long> clMap); //가입시 준비물 초기 등록 public void pInitChecklist1(long planNum); public void pInitChecklist2(long planNum); //준비물 추가하기 public void pAddCheckItem(CheckListDto checklist); //준비물 삭제하기 public void delCheckItem(CheckListDto checklist); //준비물 카운트 정렬하기 public void reduceCheckItemCnt(CheckListDto checklist); //체크리스트 카테고리 삭제하기 public void delCheckCategory(ChecklistViewDto cv); //체크리스트 카테고리 정렬하기 public void reduceCheckCategoryCnt(ChecklistViewDto cv); //준비물 수정하기 public void pEditCheckItem(CheckListDto checklist); //카테고리 수정하기 public void pEditCheckCategory(CheckListDto checklist); //초대코드 중복검사 public int checkInviteCode(long code); //일행 초대 등록 public void pInviteMember(InviteDto invite); //회원 리스트 가져오기 public List<MemberDto> pGetMemberList(); //초대 리스트 가져오기 public List<InviteDto> pGetInviteList(); //초대 여부 확인 카운트 public int pCheckInvite(String id); //초대 유효성 검사 public int pCheckCodeValid(InviteDto invite); //일행 추가 public void pJoinPlan1(InviteDto invite); public void pJoinPlan2(InviteDto invite); public void pJoinPlan3(InviteDto invite); public void pJoinPlan4(InviteDto invite); public void pJoinPlan5(InviteDto invite); //초대 삭제 public void pDelInvite(InviteDto invite); //초대 회원 중복 검사 public int pCheckInviteId(InviteDto invite); //여행 삭제 public void pDelPlan(long planNum); //여행 삭제시 일정 삭제 public void pDelSchedule(long planNum); //여행 삭제시 가계부 삭제 public void pDelHousehold(long planNum); //여행 삭제시 체크리스트 삭제 public void pDelChecklist(long planNum); //여행 정보 수정 public void pEditPlan(TravelPlanDto plan); //기간 초과 일정 정보 삭제 public void pDelOverDate(long newDays); //기간 초과 가계부 정보 삭제 public void pDelOverHousehold(long newDays); //현재 일정에 초대중인 멤버 가져오기 public List<InviteDto> pGetWaitingMember(long planNum); //초대 취소 public void pCancelInvite(InviteDto invite); //회원 내보내기 public void pDepmember1(long planNum); public void pDepmember2(long planNum); public void pDepmember3(long planNum); public void pDepmember4(long planNum); public void pDepmember5(long planNum); } DAO.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bob.stepy.dao.TravelPlanDao">
<!-- 여행 일정 등록 -->
<insert id="pRegPlan" parameterType="com.bob.stepy.dto.TravelPlanDto">
INSERT INTO T
VALUES (#{t_plannum},#{t_planname},#{t_id},#{t_spot},#{t_stdate},#{t_bkdate},DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT)
</insert>
<!-- 여행 일정 리스트 가져오기 -->
<select id="getPlanList" parameterType="String" resultType="com.bob.stepy.dto.TravelPlanDto">
SELECT * FROM T
WHERE T_ID=#{id} OR T_MEMBER1=#{id} OR T_MEMBER2=#{id} OR T_MEMBER3=#{id} OR T_MEMBER4=#{id} OR T_MEMBER5=#{id}
</select>
<!-- 여행 일정 정보 가져오기 -->
<select id="getPlan" parameterType="long" resultType="com.bob.stepy.dto.TravelPlanDto">
SELECT * FROM T
WHERE T_PLANNUM=#{planNum}
</select>
<!-- 여행 일정 설정하기 -->
<insert id="regPlanContents" parameterType="com.bob.stepy.dto.AccompanyPlanDto">
INSERT INTO AP (AP_PLANNUM, AP_MID, AP_DAY)
VALUES (#{ap_plannum},#{ap_mid},#{ap_day})
</insert>
<!-- 여행 전체 일수 가져오기 -->
<select id="getTravelDays" parameterType="long" resultType="int">
SELECT DISTINCT COUNT(AP_DAY) FROM AP
WHERE AP_PLANNUM=#{planNum}
</select>
<!-- 여행 일정 내용 가져오기 -->
<select id="getPlanContents" parameterType="long" resultType="com.bob.stepy.dto.AccompanyPlanDto">
SELECT * FROM AP
WHERE AP_PLANNUM=#{planNum} ORDER BY AP_PLANCNT
</select>
<!-- 가게 정보 가져오기 -->
<select id="getStoreList" resultType="com.bob.stepy.dto.StoreDto">
SELECT S_NUM, S_NAME FROM S
</select>
<!-- 여행 내용 등록 -->
<insert id="regAccompanyPlan" parameterType="com.bob.stepy.dto.AccompanyPlanDto">
INSERT INTO AP
VALUES (#{ap_plannum},#{ap_mid},#{ap_day},#{ap_plancnt}, #{ap_contents})
</insert>
<!-- 여행 내용 삭제 -->
<delete id="delAccompanyPlan" parameterType="HashMap">
DELETE FROM AP
WHERE AP_PLANNUM=#{planNum} AND AP_DAY=#{day} AND AP_PLANCNT=#{num}
</delete>
<!-- 여행 내용 수정 -->
<update id="pEditAccompanyPlan" parameterType="com.bob.stepy.dto.AccompanyPlanDto">
UPDATE AP
SET AP_CONTENTS=#{ap_contents}
WHERE AP_PLANNUM=#{ap_plannum} AND AP_DAY=#{ap_day} AND AP_PLANCNT=#{ap_plancnt}
</update>
<!-- 여행 번호 카운트 정렬 -->
<update id="reduceNumCnt" parameterType="HashMap">
UPDATE AP
SET AP_PLANCNT=AP_PLANCNT-1
WHERE AP_PLANNUM=#{planNum} AND AP_DAY=#{day} AND AP_PLANCNT>#{num}
</update>
<!-- 가계부 내용 등록 -->
<insert id="regHousehold" parameterType="com.bob.stepy.dto.HouseholdDto" useGeneratedKeys="true" keyProperty="h_changecnt">
<selectKey keyProperty="h_changecnt" resultType="long" order="BEFORE">
SELECT COUNT(*)+1 FROM H
WHERE H_PLANNUM=#{h_plannum} AND H_DAY=#{h_day}
</selectKey>
INSERT INTO H
VALUES (#{h_plannum},#{h_day},#{h_changecnt},#{h_mid},#{h_cost},#{h_category},#{h_contents},#{h_sname},DEFAULT,DEFAULT)
</insert>
<!-- 가계부 목록 가져오기 -->
<select id="getHouseholdList" resultType="com.bob.stepy.dto.HouseholdDto">
SELECT * FROM H
WHERE H_PLANNUM=#{planNum} ORDER BY H_CNT
</select>
<!-- 가계부 내용 가져오기 -->
<select id="getHouseholdContentes" parameterType="HashMap" resultType="com.bob.stepy.dto.HouseholdDto">
SELECT * FROM H
WHERE H_PLANNUM=#{planNum} AND H_DAY=#{day} AND H_CNT=#{householdCnt}
</select>
<!-- 가계부 내용 수정 -->
<update id="ModHousehold" parameterType="com.bob.stepy.dto.HouseholdDto" useGeneratedKeys="true" keyProperty="h_changecnt">
<selectKey keyProperty="h_changecnt" resultType="long" order="BEFORE">
SELECT COUNT(*)+1 FROM H
WHERE H_PLANNUM=#{h_plannum} AND H_DAY=#{h_day}
</selectKey>
UPDATE H
SET H_PLANNUM=#{h_plannum},H_DAY=#{h_day},H_CNT=#{h_changecnt},H_MID=#{h_mid},H_COST=#{h_cost},H_CATEGORY=#{h_category},H_CONTENTS=#{h_contents},H_SNAME=#{h_sname},H_CURDAY=DEFAULT,H_CHANGECNT=DEFAULT
WHERE H_PLANNUM=#{h_plannum} AND H_DAY=#{h_curday} AND H_CNT=#{h_cnt}
</update>
<!-- 가계부 내용 카운트 정렬 -->
<update id="reduceHouseholdCnt" parameterType="HashMap">
UPDATE H
SET H_CNT=H_CNT-1
WHERE H_PLANNUM=#{planNum} AND H_DAY=#{curDay} AND H_CNT>#{householdCnt}
</update>
<!-- 가계부 내용 삭제 -->
<delete id="delHousehold" parameterType="HashMap">
DELETE H
WHERE H_PLANNUM=#{planNum} AND H_DAY=#{curDay} AND H_CNT=#{householdCnt}
</delete>
<!-- 예산 등록 -->
<update id="pRegBudget" parameterType="HashMap">
UPDATE T
SET T_BUDGET=#{budget}
WHERE T_PLANNUM=#{planNum}
</update>
<!-- 예산 조회 -->
<select id="getBalance" parameterType="Long" resultType="Long">
SELECT H_TOTALCOST
FROM B
WHERE H_PLANNUM=#{planNum}
</select>
<!-- 체크리스트 내용 가져오기 -->
<select id="getCheckList" parameterType="long" resultType="com.bob.stepy.dto.CheckListDto">
SELECT * FROM CL
WHERE CL_PLANNUM=#{planNum} ORDER BY CL_CATEGORY,CL_CNT
</select>
<!-- 체크리스트 카테고리 개수 가져오기 -->
<select id="getCategoryNum" parameterType="long" resultType="int">
SELECT COUNT(CL_CATEGORY)
FROM CV
WHERE CL_PLANNUM=#{planNum}
</select>
<!-- 체크리스트용 뷰 가져오기 -->
<select id="getCV" parameterType="long" resultType="com.bob.stepy.dto.ChecklistViewDto">
SELECT * FROM CV
WHERE CL_PLANNUM=#{planNum} ORDER BY CL_CATEGORY
</select>
<!-- 체크리스트 상태 변경 -->
<update id="pChangeCheck" parameterType="HashMap">
UPDATE CL
SET CL_CHECK=#{check}
WHERE CL_PLANNUM=#{planNum} AND CL_CATEGORY=#{category} AND CL_CNT=#{itemCnt}
</update>
<!-- 체크리스트 특정 항목 가져오기 -->
<select id="getACheck" parameterType="HashMap" resultType="com.bob.stepy.dto.CheckListDto">
SELECT * FROM CL
WHERE CL_PLANNUM=#{planNum} AND CL_CATEGORY=#{category} AND CL_CNT=#{itemCnt}
</select>
<!-- 가입시 준비물 초기 등록 -->
<insert id="pInitChecklist1">
INSERT INTO CL
VALUES (#{planNum}, 0, '필수 준비물', 1, '의류', DEFAULT)
</insert>
<insert id="pInitChecklist2">
INSERT INTO CL
VALUES (#{planNum}, 0, '필수 준비물', 2, '세면용품', DEFAULT)
</insert>
<!-- 준비물 추가하기 -->
<insert id="pAddCheckItem" parameterType="com.bob.stepy.dto.CheckListDto">
INSERT INTO CL
VALUES (#{cl_plannum},#{cl_category},#{cl_categoryname},#{cl_cnt},#{cl_item},DEFAULT)
</insert>
<!-- 준비물 삭제하기 -->
<delete id="delCheckItem" parameterType="com.bob.stepy.dto.CheckListDto">
DELETE CL
WHERE CL_PLANNUM=#{cl_plannum} AND CL_CATEGORY=#{cl_category} AND CL_CNT=#{cl_cnt}
</delete>
<!-- 준비물 카운트 정렬하기 -->
<update id="reduceCheckItemCnt" parameterType="com.bob.stepy.dto.CheckListDto">
UPDATE CL
SET CL_CNT=CL_CNT-1
WHERE CL_PLANNUM=#{cl_plannum} AND CL_CATEGORY=#{cl_category} AND CL_CNT>#{cl_cnt}
</update>
<!-- 체크리스트 카테고리 삭제하기 -->
<delete id="delCheckCategory" parameterType="com.bob.stepy.dto.ChecklistViewDto">
DELETE CL
WHERE CL_PLANNUM=#{cl_plannum} AND CL_CATEGORY=#{cl_category}
</delete>
<!-- 체크리스트 카테고리 정렬하기 -->
<update id="reduceCheckCategoryCnt" parameterType="com.bob.stepy.dto.ChecklistViewDto">
UPDATE CL
SET CL_CATEGORY=CL_CATEGORY-1
WHERE CL_PLANNUM=#{cl_plannum} AND CL_CATEGORY>#{cl_category}
</update>
<!-- 준비물 수정하기 -->
<update id="pEditCheckItem" parameterType="com.bob.stepy.dto.CheckListDto">
UPDATE CL
SET CL_ITEM=#{cl_item}
WHERE CL_PLANNUM=#{cl_plannum} AND CL_CATEGORY=#{cl_category} AND CL_CNT=#{cl_cnt}
</update>
<!-- 카테고리 수정하기 -->
<update id="pEditCheckCategory" parameterType="com.bob.stepy.dto.CheckListDto">
UPDATE CL
SET CL_CATEGORYNAME=#{cl_categoryname}
WHERE CL_PLANNUM=#{cl_plannum} AND CL_CATEGORY=#{cl_category}
</update>
<!-- 초대코드 중복검사 -->
<select id="checkInviteCode" parameterType="long" resultType="int">
SELECT COUNT(*) FROM I
WHERE I_CODE=#{code}
</select>
<!-- 일행 초대 등록 -->
<insert id="pInviteMember" parameterType="com.bob.stepy.dto.InviteDto">
INSERT INTO I
VALUES (#{i_code},#{i_plannum},#{i_mid},#{i_planname},#{i_inviteid})
</insert>
<!-- 회원 리스트 가져오기 -->
<select id="pGetMemberList" resultType="com.bob.stepy.dto.MemberDto">
SELECT * FROM M
</select>
<!-- 초대 리스트 가져오기 -->
<select id="pGetInviteList" resultType="com.bob.stepy.dto.InviteDto">
SELECT * FROM I
</select>
<!-- 초대 여부 확인 카운트 -->
<select id="pCheckInvite" resultType="int">
SELECT COUNT(*) FROM I
WHERE I_INVITEID=#{id}
</select>
<!-- 초대 유효성 검사 -->
<select id="pCheckCodeValid" parameterType="com.bob.stepy.dto.InviteDto" resultType="int">
SELECT COUNT(*) FROM I
WHERE I_CODE=#{i_code} AND I_INVITEID=#{i_inviteid}
</select>
<!-- 일행 추가 -->
<update id="pJoinPlan1" parameterType="com.bob.stepy.dto.InviteDto">
UPDATE T
SET T_MEMBER1=#{i_inviteid}
WHERE T_PLANNUM=#{i_plannum}
</update>
<update id="pJoinPlan2" parameterType="com.bob.stepy.dto.InviteDto">
UPDATE T
SET T_MEMBER2=#{i_inviteid}
WHERE T_PLANNUM=#{i_plannum}
</update>
<update id="pJoinPlan3" parameterType="com.bob.stepy.dto.InviteDto">
UPDATE T
SET T_MEMBER3=#{i_inviteid}
WHERE T_PLANNUM=#{i_plannum}
</update>
<update id="pJoinPlan4" parameterType="com.bob.stepy.dto.InviteDto">
UPDATE T
SET T_MEMBER4=#{i_inviteid}
WHERE T_PLANNUM=#{i_plannum}
</update>
<update id="pJoinPlan5" parameterType="com.bob.stepy.dto.InviteDto">
UPDATE T
SET T_MEMBER5=#{i_inviteid}
WHERE T_PLANNUM=#{i_plannum}
</update>
<!-- 초대 삭제 -->
<delete id="pDelInvite" parameterType="com.bob.stepy.dto.InviteDto">
DELETE I
WHERE I_CODE=#{i_code}
</delete>
<!-- 초대 회원 중복 검사 -->
<select id="pCheckInviteId" parameterType="com.bob.stepy.dto.InviteDto" resultType="int">
SELECT COUNT(*) FROM I
WHERE I_PLANNUM=#{i_plannum} AND I_INVITEID=#{i_inviteid}
</select>
<!-- 여행 삭제 -->
<delete id="pDelPlan">
DELETE T
WHERE T_PLANNUM=#{planNum}
</delete>
<!-- 여행 삭제시 일정 삭제 -->
<delete id="pDelSchedule">
DELETE AP
WHERE AP_PLANNUM=#{planNum}
</delete>
<!-- 여행 삭제시 가계부 삭제 -->
<delete id="pDelHousehold">
DELETE H
WHERE H_PLANNUM=#{planNum}
</delete>
<!-- 여행 삭제시 체크리스트 삭제 -->
<delete id="pDelChecklist">
DELETE CL
WHERE CL_PLANNUM=#{planNum}
</delete>
<!-- 여행 정보 수정 -->
<update id="pEditPlan" parameterType="com.bob.stepy.dto.TravelPlanDto">
UPDATE T
SET T_PLANNAME=#{t_planname}, T_SPOT=#{t_spot}, T_STDATE=#{t_stdate}, T_BKDATE=#{t_bkdate}
WHERE T_PLANNUM=#{t_plannum}
</update>
<!-- 기간 초과 일정 정보 삭제 -->
<delete id="pDelOverDate" parameterType="long">
DELETE AP
WHERE AP_DAY>#{newDays+1}
</delete>
<!-- 기간 초과 가계부 정보 삭제 -->
<delete id="pDelOverHousehold" parameterType="long">
DELETE H
WHERE H_DAY>#{newDays+1}
</delete>
<!-- 현재 일정 초대중인 멤버 가져오기 -->
<select id="pGetWaitingMember" parameterType="long" resultType="com.bob.stepy.dto.InviteDto">
SELECT * FROM I
WHERE I_PLANNUM=#{planNum}
</select>
<!-- 초대 취소 -->
<delete id="pCancelInvite" parameterType="com.bob.stepy.dto.InviteDto">
DELETE I
WHERE I_PLANNUM=#{i_plannum} AND I_INVITEID=#{i_inviteid}
</delete>
<!-- 회원 내보내기 -->
<update id="pDepmember1" parameterType="long">
UPDATE T
SET T_MEMBER1=' '
WHERE T_PLANNUM=#{t_plannum}
</update>
<update id="pDepmember2" parameterType="long">
UPDATE T
SET T_MEMBER2=' '
WHERE T_PLANNUM=#{t_plannum}
</update>
<update id="pDepmember3" parameterType="long">
UPDATE T
SET T_MEMBER3=' '
WHERE T_PLANNUM=#{t_plannum}
</update>
<update id="pDepmember4" parameterType="long">
UPDATE T
SET T_MEMBER4=' '
WHERE T_PLANNUM=#{t_plannum}
</update>
<update id="pDepmember5" parameterType="long">
UPDATE T
SET T_MEMBER5=' '
WHERE T_PLANNUM=#{t_plannum}
</update>
</mapper>
DataBase 구성
여행 정보 처리를 위한 TRAVELPLAN 테이블
版权声明:
1、该文章(资料)来源于互联网公开信息,我方只是对该内容做点评,所分享的下载地址为原作者公开地址。2、网站不提供资料下载,如需下载请到原作者页面进行下载。