수업/정리

220429 Spring-7 MVC구현2 목록, 상세, 수정, 삭제

jumphare 2022. 4. 29. 21:56

** 스프링 실습 - 직접 MVC Pattern 구현 2

* 글 목록
페이징 처리 시 startRow와 endRow를 둘 다 mybatis로 보낼 수 없는 문제 -> page값만 전달해 계산시키는 방식으로.. 해결    ---> limit 값도 받아오고 싶으면 어떻게 해야할지 고민해보자

-board.xml
---> xml에선 원래 부등호를 인식하지 못 하므로, 인식하게 하려면 <![CDATA[ 내용 ]]>를 사용해야함
<![CDATA[
    select * from (select rownum rnum, board.* from
   (select * from myboard order by no desc)board)
    where rnum>=((#{page}-1)*10+1) and rnum<=(#{page}*10)
  ]]>

+) sqldeveloper에서 데이터 입력 후 commit;까지 완료해줘야 DB에 반영됨!!!!!!1

-BoardController.java : 컨트롤러 클래스에서 목록과 페이징 처리를 수행한 후 그 값을 model객체를 이용해 view로 전달해야 함
 기본적으로 model2의 서비스 클래스에서 하던걸 그대로 가져온 것과 같고 service class로 넘기는 것만 조심하면 됨
view로 내보내는 것들
model.addAttribute("page", page);
model.addAttribute("listcount", listcount);
model.addAttribute("list", list);
model.addAttribute("pageCount", pageCount);
model.addAttribute("startPage", startPage);
model.addAttribute("endPage", endPage);
return "board/boardlist";


* 글 내용 : 조회수 증가+내용 출력
@RequestMapping("/boardcontent.do")
public String boardcontent(HttpServletRequest request, Model model) {
   int no=Integer.parseInt(request.getParameter("no"));
   int page=Integer.parseInt(request.getParameter("page"));
   service.upcount(no);    //조회수 증가
   Board board=service.getcontent(no);   //내용 가져오기
   System.out.println("board= "+board);
   model.addAttribute("board", board);
   model.addAttribute("page", page);
   return "board/boardcontent";
}
---> 조회수 증가 클래스는 int로 돌려받을 필요가 없으므로 void형으로 생성할 것.
※ 오류 났던 부분... post로 no와 page를 받았으면 controller에 받는걸 request로 놔야 하나봄. 난 이걸 int no, int page로 해서 오류가 났었음!
!!! request 객체를 만들어두고 getParameter로 공유한 값을 받을 것!

service
public void upcount(int no) {
   dao.upcount(no);
}
dao
public void upcount(int no) {
   session.update("boardns.upcount", no);
}
이 때, void형은 값을 리턴할 필요가 없으므로 return 없이 넘어갈 경로만 설정해주면 된다!

---> 글내용 구해오는 클래스는 select로 검색한 값 dto 하나만 받으면 되므로 dao클래스에서 mapper로 넘어갈 때 selectOne를 사용할 것.
public Board getcontent(int no) {
return session.selectOne("boardns.getcontent", no);
}


※ 글목록에서는 page를 request.getParameter로 받고, 글내용이나 수정 등에서는 그냥 int page로 받는 이유.. 차이?
글목록은 기본적으로 page=1로 초기화되어있고 추가로 post로 넘어온 page값이 존재할 경우! 그 값으로 바꿔주기 때문에, 메소드 내에 디폴트로 존재하는 page 변수와 view에서 넘어오는 page 변수 사이에 차이를 둬야 함
따라서 기존 page변수는 그대로 두고, 받아오는 page 변수는 request.getParameter로 받아옴으로써 둘 사이에 차이를 둘 수 있음
반면 글 내용을 가져오거나 수정할 때는 미리 만들어둔 page변수가 없으므로 굳이 getParameter로 page나 no값을 받아 차이를 둘 필요가 없으므로 -> 그냥 메소드의 매개변수로 지정해 가져와도 문제가 없음!


* 글 수정폼으로 @RequestMapping("/boardupdateform.do")
: 글내용에서 사용한 service.getcontent(no)를 재사용해서 값을 공유한 뒤 폼으로 넘김


* 글 수정
: 폼에서 값을 넘길 때, input type=hidden 으로 no, page값을 함께 넘길 수 있도록 해야 함★
---> no는 dto로 들어가겠지만 page는 안 들어가겠지... controller의 매개변수에 int page를 추가하자

-boardcontroller.java
@RequestMapping("/boardupdate.do")
public String boardupdate(Board board, int page, Model model) {
   Board old=service.getcontent(board.getNo());   //기존 비밀번호 가져와야함
   int result=0;   //result 초기화
   if(old.getPasswd().equals(board.getPasswd())) {  //비밀번호 비교
      result=service.update(board);   //일치할 경우 update 진행
   } else {   //일치하지 않는 경우
      result=-1;
   } 
   model.addAttribute("result", result);   //result값 view로 공유
   model.addAttribute("board", board);   //수정 후 상세페이지로 이동시킬거니까 얘도 공유
   model.addAttribute("page", page);
   return "board/updateresult";
}

-updateresult.jsp
result=1이면 수정 성공 -> location.href="boardcontent.do?no=${board.no}&page=${page}";
result=0이면 수정 실패 -> history.go(-1);
result=-1이면 비밀번호 불일치 -> history.go(-1);


* 글 삭제폼으로 @RequestMapping("/boarddeleteform.do")
폼으로 넘어갈 때 no, page 값 공유해서 같이 넘겨줘야 함
---> 컨트롤러가 단순히 다른 form으로 경로를 바꿔주는 역할만 한다면 굳이 매개변수로 값을 받아 view로 넘길 필요 없고, 이동한 form에서 getParameter를 이용해 값을 받을 수 있음
+수정폼에서처럼 view로 공유해줘야 할 값이 없기 때문에 그냥 매개변수를 넣을 필요가 없다★

@RequestMapping("/boarddeleteform.do")
public String boarddeleteform() {
   return "board/boarddeleteform";
}

-deleteform.jsp
<input type=hidden name=no value="${param.no }">    //getParameter를 EL로 표현하면 이렇게 됨
<input type=hidden name=page value="${param.page }">

* 글 삭제
: getParameter로 받은 no, passwd는 dto에 들어가고 page 따로 매개변수로 추가하기
: 기존 passwd와 입력받은 passwd 비교해 삭제 여부 결정 ---> update와 기본적으로 크게 다르지 않음