JDBC는 쿼리문, DAO, DTO, CONTROLLER, JAVA파일을 모두 다 일일히 만들어야한다.
그래서 프로젝트때 너무나 같은작업을 계속반복해서 하다보니 몇 번 빡이 돌기도 했다.
하지만 Spring은 JDBC에 비해 론나 간단하다.
Controller -> mapper.java -> mapper.xml이 세 개만 만들어주면 된다.
하지만 그 전에 설정을 잘 해주는게 중요하다.
====================================================================

일단 제목을 클릭 할 수 있게 해주는데 쿼리스트링으로 원하는 글의 번호를 db로 넘긴다.
<td><a href="/myapp/boardContent.do?idx=<%=vo.getIdx()%>"><%=vo.getTitle() %></a></td>
======================================================================================
Controller
@GetMapping("/boardContent.do")
public String boardContent(int idx, Model model) { // 2
Board vo = mapper.boardContent(idx);
model.addAttribute("vo", vo); // 객체바인딩
return "boardContent"; // /WEB-INF/views/boardContent.jsp
}
메서드 안에 파라미터로 받아올 idx(글번호)와 받아온 내용 담아줄 Model객체를
매개변수로 지정해주고

BoardMapper(인터페이스)에 xml에서 실행할 메서드를 만들어준다.

mapper.xml에서 실행할 쿼리를 만들어주는데 값을 넘겨줘야하니 파라미터타입과
받아온 값을 담아줄 resultType를 둘 다 지정해준다.
Select쿼리는 resultType과 parameterType을 둘 다 적는게 가능하고받아오는 값이 하나일때는 파라미터 타입을 생략가능하다.

글 제목을 클릭했을때 이렇게 나옴.
그리고 boardContent.jsp에서 확인 할 몇가지 내용이 있다.
<div class="container">
<h2>Spring WEB MVC01</h2>
<div class="panel panel-default">
<div class="panel-heading">BOARD</div>
<div class="panel-body">
<table class="table table-bordered">
<tr>
<td>번호 </td>
<td><%=vo.getIdx() %></td>
</tr>
<tr>
<td>제목 </td>
<td><%=vo.getTitle()%></td>
</tr>
<tr>
<td>내용 </td>
<td><%=vo.getContent().replaceAll("\n", "<br>") %></td>
</tr>
<tr>
<td>작성자 </td>
<td><%=vo.getWriter() %></td>
</tr>
<tr>
<td>작성일 </td>
<td><%=vo.getIndate().split(" ")[0] %></td>
</tr>
<tr>
<td colspan="2" align="center">
<button class= "btn btn-info btn-sm" onclick="updateFn(<%=vo.getIdx() %>)">수정</button>
<button class= "btn btn-warning btn-sm" onclick="delFn(<%=vo.getIdx() %>)">삭제</button>
<button class= "btn btn-success btn-sm" onclick="location.href='/myapp/boardList.do'">리스트</button>
</td>
</tr>
</table>
</div>
내용에 replaceAll함수를 쓴 이유는 내용에 엔터를 쳐서 줄 넘김을 했을 때 db에서 불러오는 값은 \n으로 오기때문에 br태그로 바꿔줘서 줄이 바꾸게 해줌.

작성일은 일자만 나오게 하기위해 split함수를 사용해 빈칸을 기준으로 0번째 인덱스만 가져온다
<script type="text/javascript">
function delFn(idx) {
location.href="/myapp/boardDelete.do/"+idx;
}
function updateFn(idx) {
location.href="/myapp/boardUpdate.do/"+idx;
}
</script>
함수에 컨트롤러로 갈 수 있게 주소를 준 후 매개변수로 글번호를 받아온다.
그리고 수정 버튼을 누르면

이렇게 그 글의 내용을 수정할 수 있는 update.jsp에서 불러준다.
<form class="form-horizontal" action="/myapp/boardUpdate.do" method="post">
<input type="hidden" name="idx" value="<%=vo.getIdx()%>">
<div class="form-group">
<label class="control-label col-sm-2" for="title">제목:</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="title" id="title" value="<%=vo.getTitle()%>">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="content">내용:</label>
<div class="col-sm-10">
<textarea rows="10" class="form-control" name="content"><%=vo.getContent()%> </textarea>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="writer">작성자:</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="writer" id="writer" value="<%=vo.getWriter()%>" readonly="readonly">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10" align="center">
<button type="submit" class="btn btn-success btn-sm">수정</button>
<button type="reset" class="btn btn-warning btn-sm">취소</button>
<button type="button" class="btn btn-info btn-sm" onclick="location.href='/myapp/boardList.do'">리스트</button>
</div>
</div>
</form>
보여줄 값은 value로 보여주고 작성자는 바뀔수 없으니 readonly로 고정을 시켜줌.
근데 여기서 중요한 점은 Content.jsp 와 update.jsp는 둘 다 boardUpdate.do이다.

위 처럼 컨트롤러에서 두개를 각각 다르게 인식하게 하기 위해서 @RequestMapping으로 get post둘 다 가능하게 한뒤에 뒤에 각각 method = get 혹은 post로 지정을 해준다.

참고로 .do뒤에 / {파라미터} 를 해주고 매개변수에 @PathVariable을 해주는게 더 좋은 쿼리스트링 방법이다.
그리고 똑같이 인터페이스에 메서드 -> mapper.xml에 쿼리문 작성을 해주면된다.

내용을 바꿔준 후 수정버튼을 누르면

이렇게 내용이 바뀐걸 볼 수 있다.