[Spring Boot] 게시판 구현(4) - 새 글 작성

우수빈·2023년 7월 3일
0

Spring Boot

목록 보기
7/10

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>

0개의 댓글