* 첫 스프링부트 프로젝트라서 일단은 실행되게끔 만들고 있기때문에 좋은 로직이 아닐 수 있습니당!
* 차차 공부하면서 발전시켜나갈 예정입니다
* 예외처리, security 적용 x
환경설정, 엔티티 정의, 로그인, 회원가입은 이전 게시물을 확인해주세요!
전체 코드
1. PostRepository
// PostRepository.java
package com.youjin.domain.post;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
}
- UserRepository interface와 마찬가지로 JpaRepository를 extends 해줍니다
- 회원때와 달리 지금은 JpaRepository에 있는 기능만 필요하기 때문에 따로 추가할건 없습니다!
2. PostRequest
// PostRequest.java
package com.youjin.payload.request;
import com.youjin.domain.post.Post;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Getter
public final class PostRequest {
private String postTitle;
private String postContents;
private String userId;
public void updateEntity(Post post) {
post.setPostTitle(this.postTitle);
post.setPostContents(this.postContents);
}
}
- Post.java에서 seq는 건드릴 필요가 없고 등록, 업데이트 할 때 사용해줄 PostRequest class를 만들어 줍니다
3. PostController
// PostController.java
package com.youjin.controller;
import com.youjin.domain.user.User;
import com.youjin.payload.request.PostRequest;
import com.youjin.service.PostService;
import com.youjin.service.UserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
@Slf4j
@RestController
@RequestMapping("post")
@RequiredArgsConstructor
public class PostController {
private final PostService postService;
private final UserService userService;
@PostMapping("/register")
public ResponseEntity register(@RequestBody PostRequest request) {
log.info("title = {}, contents = {}, userId = {}", request.getPostTitle(), request.getPostContents(), request.getUserId());
Optional<User> user = userService.getUserFromUserId(request.getUserId());
if(postService.register(request, user.get()).equals("Success")) {
return new ResponseEntity(HttpStatus.CREATED);
}
return new ResponseEntity(HttpStatus.BAD_REQUEST);
}
@GetMapping
public ResponseEntity postList() {
return ResponseEntity.ok().body(postService.getAllPosts());
}
@PatchMapping("/{postId}")
public ResponseEntity postUpdate(@PathVariable Long postId, @RequestBody PostRequest request) {
log.info("postId = {}", postId);
log.info("update title = {}, update contents = {}", request.getPostTitle(), request.getPostContents());
if(postService.postUpdate(postId, request).equals("Success")) {
return new ResponseEntity(HttpStatus.OK);
}
return new ResponseEntity(HttpStatus.BAD_REQUEST);
}
@DeleteMapping("/{postId}")
public ResponseEntity postDelete(@PathVariable Long postId) {
log.info("postId = {}", postId);
if(postService.postDelete(postId).equals("Success")) {
return new ResponseEntity(HttpStatus.OK);
}
return new ResponseEntity(HttpStatus.BAD_REQUEST);
}
}
4. PostService
// PostService.java
package com.youjin.service;
import com.youjin.domain.post.Post;
import com.youjin.domain.post.PostRepository;
import com.youjin.domain.user.User;
import com.youjin.payload.request.PostRequest;
import com.youjin.payload.response.PostListResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@Service
@RequiredArgsConstructor
@Slf4j
public class PostService{
private final PostRepository postRepository;
public String register(PostRequest request, User user) {
postRepository.save(Post.builder()
.postTitle(request.getPostTitle())
.postContents(request.getPostContents())
.user(user)
.build());
return "Success";
}
public List<PostListResponse> getAllPosts() {
List<Post> posts = postRepository.findAll();
List<PostListResponse> postList = new ArrayList<>();
for (Post p : posts) {
PostListResponse post = new PostListResponse();
post.setPostId(p.getSeq());
post.setPostTitle(p.getPostTitle());
post.setPostContents(p.getPostContents());
post.setUserName(p.getUser().getUserName());
postList.add(post);
}
return postList;
}
public String postUpdate(Long postId, PostRequest request) {
Optional<Post> post = postRepository.findById(postId);
request.updateEntity(post.get());
postRepository.save(post.get());
return "Success";
}
public String postDelete(Long postId) {
Optional<Post> post = postRepository.findById(postId);
postRepository.delete(post.get());
return "Success";
}
}
5. PostListResponse
// PostListResponse.java
package com.youjin.payload.response;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class PostListResponse {
private Long postId;
private String postTitle;
private String postContents;
private String userName;
}
- 전체 게시글을 보낼 때 사용합니다
게시글 등록
- 로직
- localhost:8080/post/register 로 title, contents, userId 를 json형식으로 전송합니다
- [PostController - register] register method가 실행됩니다
- post를 저장할 때 post entity (Post.java)를 보면 Fk인 userId는 User 객체로 들어가는데 그것때문에 받은 userId를 가지고 user객체를 가져옵니다(userService.getUserFromUserId)
- [PostService] postRepository에 save합니다
- 잘 저장되면 Controller가 "Success"를 받고 201을 return합니다
게시글 목록 보기
- 로직
- localhost:8080/post 로 get 요청을 합니다
- [PostController - postList] postService의 getAllPosts를 반환합니다
- [PostService - getAllPosts] postRepository에서 findAll 하고, 필요한 seq, title, contents, userName만 뽑아 PostListResponse 객체에 저장합니다
- PostListResponse list를 반환합니다
게시글 업데이트
- 로직
- localhost:8080/{postId} 로 patch 요청을 합니다. json에 수정한 title과 contents를 보내줍니다
- [PostController - postUpdate] url에 있는 {postId} 변수는 @PathVariable Long postId로 받을 수 있습니다
- [PostService - postUpdate] postId로 post 객체를 가져옵니다
- updateEntity를 불러 새로운 title과 contents로 업데이트합니다
- 업데이트한 객체를 postRepository에 저장합니다
- PostService에서 "Success"를 반환하면 PostController가 200을 반환합니다
게시글 삭제
- 로직
- localhost:8080/{postId} 로 delete 요청을 합니다
- [PostController - postDelete] 삭제할 postId를 받고 service에게 넘겨줍니다
- [PostService - postDelete] postId로 삭제할 post 객체를 가지고옵니다
- postRepository.delete로 삭제해줍니다
- postService에서 "Success"를 반환하면 PostController가 200을 반환합니다
'개발 > Spring' 카테고리의 다른 글
Google 소셜로그인을 위한 설정(1) (0) | 2022.02.16 |
---|---|
JSON Serialization Error (0) | 2021.11.08 |
Springboot + Mysql + JPA 로 간단한 프로젝트 2 (2) | 2021.07.16 |
Springboot + Mysql + JPA 로 간단한 프로젝트 1 (0) | 2021.07.15 |
스프링부트 console에 color 적용하기, 로그 찍기 (0) | 2021.07.14 |