728x90
반응형
이번에는 작성한 게시글을 작성하는 페이지를 만들어 볼것이다.
/posting으로 접속하게 되면 로그인한 사용자에 한해서 글을 작성할 수 있도록 글 작성 폼을 로드한다.
1. freeboard.html
/freeboard/posting URL로 POST방식으로 제목, 내용을 postDTO에 담아 보내주고 이전 포스팅에서 말했듯이 작성시간과 수정시간은 자동으로 Auditing을 통해 들어간다!
<body>
<div class="container">
<div class="py-5 text-center">
<h2>게시글 등록</h2>
</div>
<form action="/freeboard/posting" th:object="${postDTO}" method="post">
<div>
<label for="title">제목</label>
<input type="text" id="title" th:field="*{title}" class="form-control" th:errorclass="field-error">
<div class="field-error" th:errors="*{title}" />
</div>
<div class="mb-3">
<label for="content">내용</label>
<textarea class="form-control" rows="5" id="content" name="content" th:value="*{content}"></textarea>
</div>
<hr class="my-4">
<button class="btn btn-primary btn-lg" type="submit">
작성
</button>
<button class="btn btn-secondary btn-lg" th:onclick="|location.href='@{/freeboard}'|" type="button">
취소
</button>
</form>
</div>
</body>
2. PostController.java
만약 아무거도 안쓰고 눌렀을 때를 대비하여 Validated를 활용하여 title이나 content에 값이 없을 때에는 예외를 발생시켜 글 작성이 안되도록 했다. 그리고 현재 로그인 한 아이디, 즉 로그인한 userId에 데이터베이스 연관관계를 매핑해줘야 하기 때문에 지금 현재 로그인 한 유저의 PK인 UserId를 찾아와서 서비스로 DTO와 같이 보낸다.
//글 작성
@GetMapping("/posting")
public String getPostWrite(Model model) {
model.addAttribute("postDTO", new PostDTO());
return "/board/postwrite";
}
@PostMapping("/posting")
public String PostPostWrite(@Validated @ModelAttribute PostDTO postDTO, Principal principal, BindingResult bindingResult) {
if(bindingResult.hasErrors()) {
return "/board/postwrite";
}
//현재 로그인 한 유저의 PK를 가져옴
Long findMemberId = memberServiceImpl.findUsername(principal.getName()).getUserId();
postService.posting(postDTO, findMemberId);
return "redirect:/freeboard";
}
3. PostService.java
여기서는 controller에서 받아온 UserId를 활용해서 지금 로그인 한 사용자의 정보를 Member객체로 받아오고 이걸로 Post객체를 만들어서 데이터베이스에 Insert한다.
@Service
@RequiredArgsConstructor
public class PostService {
private final MemberService memberService;
private final PostRepository postRepository;
public void posting(PostDTO postDTO, Long userId) {
Member member = memberService.findUserId(userId);
Post posting = Post.builder()
.author(member.getNickname())
.title(postDTO.getTitle())
.content(postDTO.getContent())
.member(member)
.build();
postRepository.save(posting);
}
}
4. PostRepository.java
save는 기본 JPA에서 지원되는 문법이므로 선언해 줄 필요 없이 그냥 사용하면 된다.
public interface PostRepository extends JpaRepository<Post, Long>{
Post findByBoardId(Long boardId);
}
내가 작성한 제목과 내용을 포함한 작성일, join한 userId또한 잘 들어간 것을 볼 수 있다.
만들고 싶은 서비스를 스스로 공부하고 만들어 보면서 기록하는 개인 공부 블로그입니다.
내용 중 최적화가 가능한 부분 혹은 궁금한 점은 언제든지 댓글로 남겨주세요🧐
728x90
반응형
'Projects > 식단 짜주는 웹' 카테고리의 다른 글
[Spring/식단 추천 API] 게시판 글 수정 기능 구현 - 6 (0) | 2023.11.18 |
---|---|
[Spring/식단 추천 API] 게시판 글 상세보기 기능 구현 - 5 (0) | 2023.11.16 |
[Spring/식단 추천 API] 게시판 글 목록 페이지 구현 - 3 (0) | 2023.11.16 |
[Spring/식단 추천 API] 로그인 기능 구현 - 2 (1) | 2023.11.11 |
[Spring/식단 추천 API] 회원가입 기능 구현 - 1 (0) | 2023.10.26 |