PostController
@PreAuthorize("hasRole('USER')") // 페이지 접근 이전에 인증(권한, 로그인) 여부를 확인
@GetMapping("/create")
public void create() {
log.info("create:GET");
// 리턴값이 없는 경우 view의 이름은 요청 주소와 같음
}
@PreAuthorize("hasRole('USER')")
@PostMapping("/create")
public String create(PostCreateDto dto) {
log.info("create(dto={}) POST", dto);
postService.create(dto);
// DB 테이블에 insert 후 포스트 목록 페이지로 redirect 이동.
return "redirect:/post";
}
PostService
public Post create(PostCreateDto dto) {
log.info("create(dto={})", dto);
// dto를 entity로 변환
Post entity = dto.toEntity();
log.info("entity={}", entity);
postRepository.save(entity);
log.info("entity={}", entity);
return entity;
}
PostCreateDto
@Data
public class PostCreateDto {
private String title;
private String content;
private String author;
// dto를 entity 객체로 변환해서 리턴하는 메서드:
public Post toEntity() {
return Post.builder()
.title(title)
.content(content)
.author(author)
.build();
}
}
create.html
thymeleaf security 사용하여 로그인 한 아이디 값 전달
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleat/layout"
layout:decorate="~{layout/base_layout}">
<main layout:fragment="main">
<div class="my-2 card" style="padding: 0 30px 0 30px;">
<div class="my-5 text-center">
<h1>새 포스트</h1>
</div>
<div class="card-body">
<form method="post"> <!-- 요청 주소 따로 없으면 현재 주소로 보냄(/post/create) -->
<div class="my-2">
<label class="form-label" for="title">제목</label>
<input class="form-control" id="title" name="title" type="text" required autofocus />
</div>
<div class="my-2">
<label class="form-label" for="content">내용</label>
<textarea class="form-control" id="content" name="content" required rows="10"></textarea>
</div>
<div class="my-2 d-none">
<label class="form-label" for="author">작성자</label>
<input class="form-control" type="text" id="author" name="author" th:value="${#authentication.name}" />
</div>
<div class="mt-5 d-grid gap-2 d-md-flex justify-content-md-center">
<input class="btn btn-outline-info" type="submit" value="작성 완료" />
</div>
</form>
</div>
</div>
</main>
</html>