-
231227_스프링부트 Ex14_SimpleBBS카테고리 없음 2023. 12. 27. 15:53
-- 데이터베이스 생성 CREATE DATABASE gurodb; CREATE TABLE myuser ( id VARCHAR(10), name VARCHAR(10) CHARACTER SET utf8mb4 ); -- 테이블 생성 CREATE TABLE simple_bbs ( id INT AUTO_INCREMENT PRIMARY KEY, writer VARCHAR(100), title VARCHAR(100), content VARCHAR(100) ); -- 한글로 입력하고 싶다면 아래처럼 테이블을 만든다. CREATE TABLE simple_bbs( id INT(4) not null AUTO_INCREMENT PRIMARY KEY, writer VARCHAR(100) CHARACTER SET utf8mb4, title VARCHAR(100) CHARACTER SET utf8mb4, content VARCHAR(100) CHARACTER SET utf8mb4 );
DTO 클래스 정의 (SimpleBbsDto.java)
package com.study.springboot.dto; import lombok.Data; @Data public class SimpleBbsDto { private int id; private String writer; private String title; private String content; }
인터페이스 정의 (ISimpleBbsDao.java)
package com.study.springboot.dao; import java.util.List; import com.study.springboot.dto.SimpleBbsDto; public interface ISimpleBbsDao { public List<SimpleBbsDto> listDao(); public SimpleBbsDto viewDao(String id); public int writeDao(String writer, String title, String content); public int deleteDao(String id); int updateDao(String id, String writer, String title, String content); }
JDBC를 사용하여 데이터베이스와 상호 작용하는 DAO(Data Access Object) 클래스를 정의 (SimpleBbsDao.jsp)
@Override public int updateDao(final String id, final String writer, final String title, final String content) { System.out.println("updateDao()"); //DAO 클래스에서 DTO 사용 String query = "update simple_bbs set writer = ?, title = ?, content = ? where id = ?"; return template.update(query, writer, title, content, Integer.parseInt(id)); }
수정 페이지 (correctionForm.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>글 수정</title> </head> <body> <h2>글 수정 폼</h2> <form action="update" method="post"> <table width="500" cellpadding="0" cellspacing="0" border="1"> <tr> <td>번호</td> <td>${dto.id}</td> </tr> <tr> <td> 작성자 </td> <td> <input type="text" name="writer" size="100" value="${dto.writer}"> </td> </tr> <tr> <td> 제목 </td> <td> <input type="text" name="title" size="100" value="${dto.title}"> </td> </tr> <tr> <td> 내용 </td> <td> <textarea name="content" rows="10" cols="100">${dto.content}</textarea> </td> </tr> <tr> <td colspan="2"> <input type="submit" value="수정완료"> <a href="list">목록보기</a> </td> </tr> </table> </form> </body> </html>
Controller에서 DAO 호출 및 DTO 사용 (MyController.java)
@RequestMapping("/correctionForm") public String correctionForm(HttpServletRequest request, Model model) { String sId = request.getParameter("id"); model.addAttribute("dto", dao.viewDao(sId)); return "correctionForm"; } @RequestMapping("/update") public String update(Model model, HttpServletRequest request) { String id = request.getParameter("id"); String writer = request.getParameter("writer"); String title = request.getParameter("title"); String content = request.getParameter("content"); // updateDao 메서드를 사용하여 데이터베이스 업데이트 dao.updateDao(id, writer, title, content); // 수정이 완료되면 리스트 페이지로 리다이렉트 return "redirect:list"; }
correctionForm 메서드
1. @RequestMapping("/correctionForm")을 사용해서 "/correctionForm" 엔드포인트와 매핑되며, 특정 항목의 수정 양식을 표시하는 GET 요청을 처리한다.
2. request.getParameter("id")를 사용하여 요청에서 "id" 매개변수를 가져온다.
3. 그다음 DAO(Data Access Object)에서 viewDao 메서드를 호출하여 지정된 ID의 항목 세부 정보를 검색한다.
4. 검색된 데이터는 model.addAttribute("dto", dao.viewDao(sId))를 사용하여 모델에 추가된다.
5. 마지막으로 "correctionForm"이라는 뷰 이름을 반환하며, 이는 수정 양식을 표시하는 JSP(JavaServer Pages) 또는 HTML 파일의 이름이 된다.
update 메서드
1. @RequestMapping("/update")을 사용하여 이 메서드는 "/update" 엔드포인트와 매핑된다.
2. 데이터베이스에서 항목을 업데이트하는 POST 요청을 처리한다.
3. request.getParameter를 사용하여 요청에서 "id", "writer", "title", "content"의 값을 가져온다.
4. 그 다음 DAO에서 updateDao 메서드를 호출하여 새 값으로 데이터베이스에서 해당 항목을 업데이트 한다.
5. 업데이트가 완료되면 "redirect:list"를 사용하여 사용자를 "list" 페이지로 리디렉션합니다. 일반적으로 업데이트 작업 후 항목 목록을 표시하는 데 사용된다.BeanPropertyRowMapper는 데이터베이스에서 검색한 결과를 DTO에 매핑하는 역할을 한다. 여기서 dtos는 SimpleBbsDto 객체들의 리스트를 나타내고, 각각의 dto는 리스트에 포함된 하나의 SimpleBbsDto 객체를 가리킨다.
구체적으로 말하면 template.query 메서드는 SQL 쿼리의 실행 결과를 BeanPropertyRowMapper를 사용하여 SimpleBbsDto 객체에 매핑하고, 이렇게 매핑된 객체들을 리스트에 저장하여 반환한다. 따라서 listDao 메서드에서는 데이터베이스에서 가져온 게시글 목록을 SimpleBbsDto 객체의 리스트로 반환하는 것이다
예를 들어, List<SimpleBbsDto> dtos = template.query(...)가 실행되면, dtos에는 데이터베이스에서 가져온 여러 개의 행(row)이 각각 SimpleBbsDto 객체로 매핑되어 저장된다. 그리고 각 dto는 이 리스트에 있는 하나의 SimpleBbsDto 객체를 가리키게 된다.
게시판에 날짜를 띄우기 위해 테이블을 추가했다. 날짜는 시간을 포함해서 자동으로 입력될거고, 이미 입력된 데이터들에 날짜와 시간 데이터를 넣어주기 위해 업데이트 했다.
ALTER TABLE simple_bbs ADD COLUMN create_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP; UPDATE simple_bbs SET create_date = CURRENT_TIMESTAMP WHERE create_date IS NULL;
SimpleBbsDto.java
package com.study.springboot.dto; import lombok.Data; import java.time.LocalDateTime; //LocalDateTime 을 사용하기 위해 import 함. @Data public class SimpleBbsDto { private int id; private String writer; private String title; private String content; private LocalDateTime createDate; }
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <table width="500" cellpadding="0" cellspacing="0" border="1"> <tr> <td>번호</td> <td>작성자</td> <td>제목</td> <td>삭제</td> <td>수정</td> <td>작성일</tr> <tr> <c:forEach items="${list}" var="dto"> <tr> <td>${dto.id}</td> <td>${dto.writer}</td> <td><a href="view?id=${dto.id}">${dto.title}</a></td> <td><a href="delete?id=${dto.id}">X</a></td> <td><a href="correctionForm?id=${dto.id}">O</a></td> <td><a href="view?date=${dto.createDate}">${dto.createDate}</a></td> </tr> </c:forEach> </table> <p><a href="writeForm">글작성</a></p> </body> </html>
view.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 내용보기 <br> <hr> 작성자 : ${dto.writer} <br> 제목 : ${dto.title} <br> 내용 : ${dto.content} <br> 작성일 : <input type="hidden" name="id" value= "${dto.createDate}">${dto.createDate} <hr> <br><p> <a href="list">목록보기</a></td> </body> </html>
기존의 jsp 파일을 스프링부트로 전환한 코드. 두 파일의 차이를 비교하고 이해 할 필요가 있다.