본문 바로가기
개발/Spring

Springboot + Mysql + JPA 로 간단한 프로젝트 3

by ujin2021 2021. 7. 16.

* 첫 스프링부트 프로젝트라서 일단은 실행되게끔 만들고 있기때문에 좋은 로직이 아닐 수 있습니당!

* 차차 공부하면서 발전시켜나갈 예정입니다

* 예외처리, 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;
}
  • 전체 게시글을 보낼 때 사용합니다

 

게시글 등록

  • 로직
    1. localhost:8080/post/register 로 title, contents, userId 를 json형식으로 전송합니다
    2. [PostController - register] register method가 실행됩니다
    3. post를 저장할 때 post entity (Post.java)를 보면 Fk인 userId는 User 객체로 들어가는데 그것때문에 받은 userId를 가지고 user객체를 가져옵니다(userService.getUserFromUserId)
    4. [PostService] postRepository에 save합니다
    5. 잘 저장되면 Controller가 "Success"를 받고 201을 return합니다

게시글 목록 보기

  • 로직
    1. localhost:8080/post 로 get 요청을 합니다
    2. [PostController - postList] postService의 getAllPosts를 반환합니다
    3. [PostService - getAllPosts] postRepository에서 findAll 하고, 필요한 seq, title, contents, userName만 뽑아 PostListResponse 객체에 저장합니다
    4. PostListResponse list를 반환합니다 

게시글 업데이트

  • 로직
    1. localhost:8080/{postId} 로 patch 요청을 합니다. json에 수정한 title과 contents를 보내줍니다
    2. [PostController - postUpdate] url에 있는 {postId} 변수는 @PathVariable Long postId로 받을 수 있습니다
    3. [PostService - postUpdate] postId로 post 객체를 가져옵니다
    4. updateEntity를 불러 새로운 title과 contents로 업데이트합니다
    5. 업데이트한 객체를 postRepository에 저장합니다
    6. PostService에서 "Success"를 반환하면 PostController가 200을 반환합니다

게시글 삭제

  • 로직
    1. localhost:8080/{postId} 로 delete 요청을 합니다
    2. [PostController - postDelete] 삭제할 postId를 받고 service에게 넘겨줍니다
    3. [PostService - postDelete] postId로 삭제할 post 객체를 가지고옵니다
    4. postRepository.delete로 삭제해줍니다
    5. postService에서 "Success"를 반환하면 PostController가 200을 반환합니다