CRUD를 수행하기 위해 기능별로 URL를 살펴보면 '/'이후 기능별로 URI가 다른 걸 확인할 수 있다. 메서드도 다른데 크게 GET과 POST로 메서드를 사용한다. 'GET'은 정보를 불러오는 데에 메서드로 쓰이고 'POST'는 정보를 입력하는데에 메서드가 쓰인다. 여기서 주목해야 할 점은 쓰기와 수정에서 GET,POST가 모두 쓰인다는 점이다.
쓰기와 수정은 공통적으로 데이터를 '입력하기 전'에는 게시물을 읽어와야하고 게시물을 '입력한 후'에는 수정된 게시물을 저장해야한다. 그래서 게시물을 읽어올 때는 'GET'을 사용하고 게시물을 저장할 때는 'POST'를 사용한다.
1.읽기(Read)
①게시판의 게시물(bno=533)을 누르게 되면 '/board/read?bno=533'을 'GET'요청하게 된다. GET요청을 받은 Controller는 read(Integer bno)메서드를 실행하고 ②'boardService.read(bno)'가 호출된다. boardService메서드로 인해 DB에서 bno=533에 해당하는 데이터를 읽어오고 Controller는 이것을 boardDto에 담아 board.jsp로 보낸다.
bno=533에 해당하는 게시판을 읽고 다시 게시판으로 돌아가기 위해 목록 버튼을 누른다. ①목록 버튼을 누르면 BoardController로 /board/lsit 'GET'요청이 간다.Controller에서는 list()가 호출되고 list()는 페이지의 정보인 boardService.getPage(map)을 호출한다. 그러면 DB를 통해 해당 페이지의 데이터를 boardDto에 담아 Controller로 반환한다. 데이터는 list<BoardDto>에 담기고 처음 게시판의 위치로 화면이 이동한다.
그런데 목록을 누르면 bno=533이 눌렸던 게시물의 page와 pageSize를 보여줘야 한다. 애초에 bno=533을 눌렀을 때 page와 pageSize의 값이 함께 전달 됐어야한다. 이를위해 model에 page와 pageSize의 정보를 Controller의 list()와 read()에 담는다.
2.삭제(Delete)
①삭제를 누르면 /board/remove 'POST'요청을 한다. Contoller에서는 remove()가 호출되고 remove메서드는 ② boardService.remove(bno,writer)를 호출한다. 여기서 주목해야 할 점은 'writer'를 함께 호출했다는 점이다. 삭제와 수정은 오직 글쓴이만 삭제하고 수정할 수있다. 그래서 DB에서 writer의 정보도 함께 가져온다. 이 정보를 통해 삭제를 요청한 writer와 DB의 writer가 맞으면 해당 게시물의 remove메서드가 실행되고 ③Redirect를 통해 Controller는 list메서드를 호출한다. list()는 다시 DB로부터 페이지의 정보를 받고 이를 boardDto에 담아 처음 게시물의 page로 화면을 이동한다.
3.쓰기(Writer)
글쓰기를 누르면 Controller에 /board/write 'GET' 요청이 간다. GET요청을 받은 Contoroller는 write()를 호출하고 board.jsp를 보여준다. 여기서 주목해야 할 점이 있다. board.jsp를 보여줄 때 게시글을 보여주는 '게시판 읽기'와 게시판의 글을 쓰는 '게시판 글쓰기' 두 가지의 경우의 수가 나온다. '게시글 읽기'는 말 그대로 읽기만 가능하기 때문에 'readonly'로 설정해준다. 이 두 경우의 수를 구분해야하는데 이를 위해 글쓰기일 때는 'mode=new'로 표시하여 구분한다. Controller의 write()는 모델의 mode값을 new로 담아 board.jsp로 보낸다. 그러면 board.jsp는 mode에 담긴 값이 new이면 글쓰기 모드로 보여주고, mode의 값이 new가 아니면 읽기 전용 페이지인 readonly가 표시된 화면을 보여준다.
게시판에 쓴 글을 등록 버튼을 눌러 Controller에 write()를 호출한다.하지만 여기에서 호출하는 write는() 앞에서 본 write()는 달리 'GET'매핑이 아니라 'POST' 매핑으로 되어있다. write()가 호출되면 글쓰기 쓰여진 값을 DB에 저장한다. DB에 저장된 값을 wirte()는 boardService.write(boardDto)를 통해 받고 Redirect를 통해 list()에게 전달한다. list()는 boardService.getPage(map)을 호출하여 DB에서 페이지의 값을 넘겨받고 페이지 값에 맞는 게시판 목록 화면을 보여준다.
4.수정(Modify)
흐름은 Write과 동일하다. 등록 버튼을 누르면 POST요청을 하고 Controller에서 modify()를 호출한다. 그러면 boardService.modify를 통해 변경된 값이 DB에 저장된다. modify()는 Redirect로 list()를 호출하고 boardService.getPage()를 통해 DB에서 페이지 정보를 받아온다. 그리고 게시판의 첫 번째 화면을 보여준다.
출처: 남궁성 스프링의 정석(패스트 캠퍼스 강의)