728x90
출처:
https://www.youtube.com/watch?v=s5ZXZliTQq8&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&index=60
자바스크립트 반영이 느릴땐
웹에서 F12 개발자 도구 활성화 시킨 후 새로고침 아이콘 우클릭
[캐시 비우기 및 강력 새로고침]
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ include file="../layout/header.jsp"%>
<div class="container">
<button class="btn btn-secondary" onclick="history.back()">돌아가기</button>
<c:if test="${board.user.id == principal.user.id }">
<a href="/board/${board.id}/updateForm" class="btn btn-warning">수정</a>
<button id="btn-delete" class="btn btn-danger">삭제</button>
</c:if>
<br> <br>
<div>
글 번호 : <span id="id"><i>${board.id} </i></span>
작성자 : <span><i>${board.user.username} </i></span>
</div>
<br>
<div>
<h3>${board.title}</h3>
</div>
<hr />
<div>
<div>${board.content}</div>
</div>
<hr />
<button id="btn-save" class="btn btn-primary">글 저장</button>
</div>
<script src="/js/board.js"></script>
<%@ include file="../layout/footer.jsp"%>
package com.cosblog.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import com.cosblog.service.BoardService;
import org.springframework.data.domain.Sort;
@Controller
public class BoardController {
@Autowired
private BoardService boardService;
//public String index(@AuthenticationPrincipal PrincipalDetail principal)
@GetMapping({"","/"})
public String index(Model model,@PageableDefault(size=3, sort="id", direction = Sort.Direction.DESC)Pageable pageable) {
model.addAttribute("boards", boardService.글목록(pageable));
return "index"; // viewResolver 작동!
}
@GetMapping("/board/{id}/updateForm")
public String updateForm(@PathVariable int id, Model model) {
model.addAttribute("board",boardService.글상세보기(id));
return "board/updateForm";
}
@GetMapping("board/{id}")
public String findById(@PathVariable int id, Model model) {
model.addAttribute("board", boardService.글상세보기(id));
return "board/detail";
}
//USER 권한이 필요
@GetMapping("/board/saveForm")
public String saveForm() {
return "board/saveForm";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ include file="../layout/header.jsp"%>
<div class="container">
<form>
<input type="hidden" id="id" value="${board.id}"/>
<div class="form-group">
<input value="${board.title}" type="text" class="form-control" placeholder="Enter title" id="title">
</div>
<div class="form-group">
<textarea class="form-control summernote" rows="5" id="content">${board.content}</textarea>
</div>
</form>
<button id="btn-update" class="btn btn-primary">글 수정완료</button>
</div>
<!-- summer note -->
<script>
$('.summernote').summernote({
tabsize : 2,
height : 300
});
</script>
<script src="/js/board.js"></script>
<%@ include file="../layout/footer.jsp"%>
package com.cosblog.controller.api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.cosblog.config.auth.PrincipalDetail;
import com.cosblog.dto.ResponseDto;
import com.cosblog.model.Board;
import com.cosblog.service.BoardService;
@RestController
public class BoardApiController {
@Autowired
private BoardService boardService;
@PostMapping("/api/board")
public ResponseDto<Integer> save(@RequestBody Board board,@AuthenticationPrincipal PrincipalDetail principal) {
boardService.글쓰기(board, principal.getUser());
return new ResponseDto<Integer>(HttpStatus.OK.value(), 1);
}
@DeleteMapping("/api/board/{id}")
public ResponseDto<Integer> deleteById(@PathVariable int id){
boardService.글삭제하기(id);
return new ResponseDto<Integer>(HttpStatus.OK.value(), 1);
}
@PutMapping("/api/board/{id}")
public ResponseDto<Integer> update(@PathVariable int id, @RequestBody Board board){
boardService.글수정하기(id, board);
return new ResponseDto<Integer>(HttpStatus.OK.value(),1);
}
}
package com.cosblog.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.cosblog.model.Board;
import com.cosblog.model.User;
import com.cosblog.repository.BoardRepository;
//스프링이 컴포넌트 스캔을 통해서 bean에 등록을 해줌
@Service
public class BoardService {
@Autowired
private BoardRepository boardRepository;
@Transactional
public void 글쓰기(Board board, User user) {
board.setCount(0);
board.setUser(user);
boardRepository.save(board);
}
@Transactional(readOnly=true)
public Page<Board> 글목록(Pageable pageable) {
return boardRepository.findAll(pageable);
}
@Transactional(readOnly=true)
public Board 글상세보기(int id) {
return boardRepository.findById(id).orElseThrow(() -> {
return new IllegalArgumentException("글 상세보기 실패:아이디를 찾을 수 없습니다.");
});
}
@Transactional
public void 글삭제하기(int id) {
boardRepository.deleteById(id);
}
@Transactional
public void 글수정하기(int id, Board requestBoard) {
Board board = boardRepository.findById(id)
.orElseThrow(()->{
return new IllegalArgumentException("글 찾기 실패:아이디를 찾을 수 없습니다.");
});//영속화 완료
board.setTitle(requestBoard.getTitle());
board.setTitle(requestBoard.getContent());
//해당 함수로 종료시(Service가 종료될 때)트랜잭션이 종료됩니다. 이때 더티체킹 - 자동 업데이트가 됨.db flush
}
}
/*
* 이 로그인도 사용 안 할거라 삭제
*
* @Transactional(readOnly = true)//Select할 때 트랜잭션 시작, 서비스 종료시에 트랜잭션 종료(정합성)
* public User 로그인(User user) { return
* userRepository.findByUsernameAndPassword(user.getUsername(),
* user.getPassword()); }
*/
let index = {
init: function () {
$("#btn-save").on("click", () => {
this.save();
});
$("#btn-delete").on("click", () => {
this.deleteById();
});
$("#btn-update").on("click", () => {
this.update();
});
},
save: function () {
let data = {
title: $("#title").val(),
content: $("#content").val(),
};
$.ajax({
type: "POST",
url: "/api/board",
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: "json",
})
.done(function (resp) {
alert("글쓰기가 완료되었습니다.");
location.href = "/";
})
.fail(function (error) {
alert(JSON.stringify(error));
});
},
deleteById: function () {
let id = $("#id").text();
$.ajax({
type: "DELETE",
url: "/api/board/" + id,
dataType: "json",
})
.done(function (resp) {
alert("삭제가 완료되었습니다.");
location.href = "/";
})
.fail(function (error) {
alert(JSON.stringify(error));
});
},
update: function () {
let id = $("#id").val();
let data = {
title: $("#title").val(),
content: $("#content").val(),
};
$.ajax({
type: "PUT",
url: "/api/board/" + id,
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: "json",
})
.done(function (resp) {
alert("글수정이 완료되었습니다.");
location.href = "/";
})
.fail(function (error) {
alert(JSON.stringify(error));
});
},
};
index.init();
728x90
'Spring > Spring boot' 카테고리의 다른 글
스프링부트 강좌 60강(블로그 프로젝트) - 회원수정 1 (0) | 2022.01.25 |
---|---|
스프링부트 강좌 59강(블로그 프로젝트) - 스프링작동원리 복습 (0) | 2022.01.25 |
스프링부트 강좌 57강(블로그 프로젝트) - 글 삭제하기 (0) | 2022.01.25 |
스프링부트 강좌 56강(블로그 프로젝트) - 글 상세보기 (0) | 2022.01.25 |
스프링부트 강좌 55강(블로그 프로젝트) - 글목록 페이징하기 (0) | 2022.01.25 |
댓글