보라코딩
스프링부트 게시판 CRUD (타임리프 사용) 본문
READ
BoardController
@Autowired
private BoardService service;
@GetMapping("/list")
public void getList(Model model){
List<BoardVO> boardList = service.board_getList();
model.addAttribute("boardList", boardList);
}
@GetMapping({"/get", "/update"})
public void get(Model model, int bno){
log.info("bno"+bno);
BoardVO boardVO = service.board_get(bno);
model.addAttribute("boardVO", boardVO);
}
BoardService
@Autowired
private BoardMapper mapper;
public List<BoardVO> board_getList() {
List<BoardVO> boardList = mapper.board_getList();
return boardList;
}
public BoardVO board_get(int bno) {
BoardVO boardVO = mapper.board_get(bno);
return boardVO;
}
BoardMapper
List<BoardVO> board_getList();
BoardVO board_get(int bno);
BoardMapper
<select id="board_getList" resultType="com.example.domain.BoardVO">
select * from tbl_board
</select>
<select id="board_get" resultType="com.example.domain.BoardVO">
select * from tbl_board
where bno = #{bno}
</select>
list.html
타임리프로 변수 보내는 것에 주의하자!
th:href="@{/board/get(bno=${board.bno})}"
<a th:each="board : ${boardList}" th:href="@{/board/get(bno=${board.bno})}" class="list-group-item list-group-item-action">
<a th:href="@{/board/register}" class="btn btn-primary">새글 등록하기</a>
<div class="container">
<h1 class="mt-4 text-center">BORA 게시판</h1>
<div><a th:href="@{/board/register}" class="btn btn-primary">새글 등록하기</a></div>
<div class="list-group mt-4">
<a th:each="board : ${boardList}" th:href="@{/board/get(bno=${board.bno})}" class="list-group-item list-group-item-action">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1" th:text="${board.bno + '. ' + board.title}">게시글 제목</h5>
<small th:text="${board.regdate}">작성일자</small>
</div>
<p class="mb-1" th:text="${board.content}">게시글 내용</p>
<small th:text="${board.writer}">작성자</small>
</a>
</div>
</div>
get.html
<div class="container">
<h1>게시판 상세 페이지</h1>
<hr>
<div class="row">
<div class="col-md-6">
<h4>게시물 정보</h4>
<table class="table">
<tbody>
<tr>
<th>번호</th>
<td th:text="${boardVO.bno}"></td>
</tr>
<tr>
<th>제목</th>
<td th:text="${boardVO.title}"></td>
</tr>
<tr>
<th>이름</th>
<td th:text="${boardVO.writer}"></td>
</tr>
<tr>
<th>내용</th>
<td th:text="${boardVO.content}"></td>
</tr>
<tr>
<th>날짜</th>
<td th:text="${boardVO.regdate}"></td>
</tr>
</tbody>
</table>
<a href="/board/update" class="btn btn-primary">수정하기</a>
<a href="/board/list" class="btn btn-warning">목록으로</a>
</div>
</div>
</div>
CREATE
BoardController
@GetMapping("/register")
public void register(){
}
@PostMapping("/register")
public String registerBoardVO(BoardVO boardVO){
log.info("boardVO : " + boardVO);
int result = service.board_register(boardVO);
log.info("등록완료 : " + result);
return "redirect:/board/list";
}
BoardService
public int board_register(BoardVO boardVO) {
int result = mapper.board_register(boardVO);
return result;
}
BoardMapper
int board_register(BoardVO boardVO);
BoardMapper.xml
<insert id="board_register" parameterType="com.example.domain.BoardVO">
insert into tbl_board(bno, title, content, writer)
values (seq_board.nextval, #{title}, #{content}, #{writer})
</insert>
register.html
<form class="mb-4" action="/board/register" method="post">
<div class="form-group">
<label for="title">제목</label>
<input type="text" class="form-control" id="title" name="title" placeholder="제목을 입력하세요">
</div>
<div class="form-group">
<label for="title">작성자</label>
<input type="text" class="form-control" id="writer" name="writer" placeholder="작성자 입력하세요">
</div>
<div class="form-group">
<label for="content">내용</label>
<textarea class="form-control" id="content" rows="3" name="content" placeholder="내용을 입력하세요"></textarea>
</div>
<button type="submit" class="btn btn-primary">등록하기</button>
<a href="/board/list" class="btn btn-warning">목록으로</a>
</form>
update
BoardController
@GetMapping({"/get", "/update"})
public void get(Model model, int bno){
log.info("bno"+bno);
BoardVO boardVO = service.board_get(bno);
model.addAttribute("boardVO", boardVO);
}
@PostMapping("/update")
public String updateBoardVO(BoardVO boardVO, Model model){
log.info("update : " + boardVO);
int result = service.board_update(boardVO);
log.info("update result : " + result);
//model.addAttribute(boardVO1);
return "redirect:/board/list"; //나중에 수정한화면으로 돌아가게 바꾸기
}
BoardService
public int board_update(BoardVO boardVO) {
int result = mapper.board_update(boardVO);
return result;
}
BoardMapper
int board_update(BoardVO boardVO);
BoardMapper.xml
<update id="board_update" parameterType="com.example.domain.BoardVO">
update tbl_board
set title = #{title}, content = #{content}, writer = #{writer}, updatedate = sysdate
where bno = #{bno}
</update>
update.html
<div class="container">
<h1>게시판 수정</h1>
<form action="/board/update" method="post">
<div class="form-group">
<label for="title">제목</label>
<input type="text" class="form-control" id="title" name="title" th:value="${boardVO.title}">
</div>
<div class="form-group">
<label for="writer">작성자</label>
<input type="text" class="form-control" id="writer" name="writer" th:value="${boardVO.writer}">
</div>
<div class="form-group">
<label for="content">내용</label>
<textarea class="form-control" id="content" name="content" rows="5" th:text="${boardVO.content}"></textarea>
</div>
<input type="hidden" name="bno" th:value="${boardVO.bno}" />
<button type="submit" class="btn btn-primary">수정하기</button>
<button type="reset" class="btn btn-dark">새로쓰기</button>
<a href="/board/list" class="btn btn-warning">목록으로</a>
</form>
</div>
delete
BoardController
@GetMapping("/delete") //delete는 Postmapping 필요 없음
public String delete(int bno){
log.info("bno"+bno);
int result = service.board_delete(bno);
log.info("delete result : " + result);
return "redirect:/board/list";
}
get.html (delete.html 필요없음!!)
<a th:href="@{/board/delete(bno=${boardVO.bno})}" class="btn btn-dark">삭제하기</a>
BoardService
public int board_delete(int bno) {
int result = mapper.board_delete(bno);
return result;
}
BoardMapper
int board_delete(int bno);
BoardMapper.xml
<delete id="board_delete">
delete from tbl_board
where bno = #{bno}
</delete>
'코딩 > Spring' 카테고리의 다른 글
타임리프 자바스크립트 내 변수 사용하기 (0) | 2023.05.22 |
---|---|
Day101_230522_3차 프로젝트 구현중 (맛집) (0) | 2023.05.22 |
스프링부트 spring mvc 기본 구조 (MyBatis, Oracle DB 연동) (1) | 2023.05.19 |
Day100_230519_3차 프로젝트 설계 (0) | 2023.05.19 |
스프링 로그 자동으로 찍는 기능 (0) | 2023.05.19 |