summernote + mustache
์น์๋ํฐ์ธ summernote ๊ธ์ ์์ฑํ๊ณ , ์คํ๋ง ์ปจํธ๋กค๋ฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ mustache์์ ์์ฑํ ๊ธ์ ํ์ธํด๋ณธ๋ค.
summernote ์ฐ๊ฒฐ ๋ฐ ์์ฑ
import
<!-- include libraries(jQuery, bootstrap) -->
<link href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<!-- include summernote css/js -->
<link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.js"></script>
summernote ์ฌ์ฉ ์์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ฐ์ ์ํฌํธ ํด ์ค๋ค.
summer note ํด๋์ค ์ง์
<div class="form-group">
<label for="content">ToDo</label>
<textarea class="form-control summernote" id="content"></textarea>
</div>
์์ ๊ฐ์ด ๋ถํธ์คํธ๋ฉ์์ summernote๋ก ์ฌ์ฉ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ , ํด๋์ค์ summernote
๋ฅผ ์ถ๊ฐํ๋ค.
<script>
$('.summernote').summernote({
height:250
});
</script>
์คํฌ๋ฆฝํธ ํ๊ทธ์ ์๋จธ ๋
ธํธ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ์ถ๊ฐํด ์ค๋ค.height
์์ฑ์ผ๋ก ํฌ๊ธฐ๋ฅผ ํ์ํ ๋งํผ ์ง์ ํด ์ค๋ค.
summernote ํ๋ฉด
์์ ๊ฐ์ด ํ๋ก ํธ์์ ์๋จธ ๋
ธํธ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
ajax๋ก ์ฐ๊ฒฐ
์์ ์ด๋ฏธ์ง์ฒ๋ผ ๋ฒํผ์ ํ๋ ๋ง๋ค๊ณ , ajax๋ก ์คํ๋ง ์ปจํธ๋กค๋ฌ์ ์ฐ๊ฒฐํด ์ค๋ค.
save: function (){
let data = {
title: $("#title").val(),
content: $("#content").val(),
};
if(data.title==""){
alert("title์ ์์ฑํด์ฃผ์ธ์.");
return;
}
$.ajax({
type:"POST",
url:"/api/writeProc",
data: JSON.stringify(data),
contentType:"application/json;utf-8",
})
.done(function (response){
if(response.status===500){
alert("์์ฑ์ ์คํจํ์์ต๋๋ค.");
}
else{
alert("์์ฑ์ ์ฑ๊ณตํ์์ต๋๋ค.");
}
location.href="/todolist/proceeding?page=0";
})
.fail(function (error){
JSON.stringify(error);
})
}
์ด์ "/api/writeProc"
์ ์ฃผ์๋ก ์คํ๋ง ์ปจํธ๋กค๋ฌ์ ์ฐ๊ฒฐํด ์ฃผ์.
api controller & service
api controller
@PostMapping("api/writeProc")
public int write(@RequestBody TaskWriteDto taskWriteDto, @AuthenticationPrincipal PrincipalDetails principalDetails){
taskService.write(taskWriteDto, principalDetails);
return HttpStatus.OK.value();
}
api service
@Transactional
public void write(TaskWriteDto taskWriteDto, PrincipalDetails principalDetails){
taskRepository.save(taskWriteDto.toEntity());
}
๊ฒ์๊ธ ์์ฑ์ ํ์ํ dto๋ฅผ ๋ฐ๋ก ์์ฑํด ์คฌ๊ณ , ์ปจํธ๋กค๋ฌ์ ์๋น์ค๋ฅผ ์ฌ์ฉํด ๊ธ์ db์ ์ ์ฅํ๋ค.
์ด๋ ์๋น์ค์๋ ํธ๋์ญ์
์ ๋ณด์ฅํ๊ธฐ ์ํด @Transactional ์ด๋
ธํ
์ด์
์ ๋ถ์ฌ์ค๋ค.
JSON ํํ๋ก ๊ฒฐ๊ณผ ํ์ธ
mustache๋ก ์ถ๋ ฅํ๊ธฐ ์ , ์ฐ์ ๋ฐ์ดํฐ๊ฐ ์ ์ ๋ฌ๋๋์ง JSON ํํ๋ก ํ์ธํด๋ณด์.
์์ ๊ฐ์ test ๊ธ์ ์์ฑํด๋ณด์.
@GetMapping("/task/detail/{id}")
@ResponseBody
public Task taskDetail(@PathVariable long id){
Task requestTask = taskService.findTask(id);
return requestTask;
}
์์ ๊ฐ์ด @ResponseBody๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ค์๋ค.
๋ฐ์ดํฐ๊ฐ ์ ์ ๋ฌ๋จ์ ํ์ธํ ์ ์๋ค.
mustache๋ก ์ถ๋ ฅ
<br/>
<div class="container">
<h1>{{task.title}}</h1>
<hr/>
<div>{{{task.content}}}</div>
</div>
model ๊ฐ์ฒด๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํด ์ฃผ๊ณ mustache์ body ๋ถ๋ถ๋ง ๋ณด๋ฉด ๋ค์ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์, summernote์ content ๋ถ๋ถ์ ์ค๊ดํธ๊ฐ ์ธ ์์ผ๋ก ๋ค์ด๊ฐ์ผ ํ๋ค!!
๋ ์์ผ๋ก ๋ค์ด๊ฐ๋ฉด mustache๊ฐ html ์์ค๋ก ํด์ํ์ง ์๊ณ ๋ค์ ์ปดํ์ผํ์ฌ html์ ๋ด์ฉ์ text๋ก ์ถ๋ ฅํด ์ค๋ค.
๋ ๊ฐ์ ์ค๊ดํธ ์ผ ๋
์ธ ๊ฐ์ ์ค๊ดํธ ์ผ ๋
์ธ ๊ฐ์ ์ค๊ดํธ๋ก ์ ์์ ์ผ๋ก summernote์ content๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ ์ ์ ์๋ค.
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ์๊ฐ์ DTO ๋ง๋ค๊ธฐ (0) | 2022.03.14 |
---|---|
Spring GlobalExceptionHandler ์์ฑ (0) | 2022.03.13 |
Post ์์ฒญ ํ ์คํธ ์ฝ๋ ์์ฑ (0) | 2022.03.12 |
์น ์๋ฒ์ ํฐ์ผ์ ์ฐจ์ด (0) | 2022.03.11 |
Spring์ Security-UserDetails ๊ตฌํ (0) | 2022.03.11 |