본문 바로가기
Spring Boot Project/Plming

[Plming] 게시글 등록 기능에 REST API 적용하기

by slchoi 2022. 3. 28.
728x90
SMALL

이전에 구현한 게시글 등록 기능에 REST API를 적용할 것이다.

프론트엔드에서 게시글을 등록하면, 등록할 때 입력된 정보를 JSON 타입으로 반환해주기로 해서 JSON 타입의 데이터를 받아와 DB에 저장하고, 등록한 게시글 상세 페이지로 redirect 해주도록 코드를 수정할 것이다.

기존에는 잘 실행되는지 확인하기 위해 "system.out.println"을 사용해 consol에 출력했다면, 이제부터는 로그로 출력할 것이다.

스프링 부트 라이브러리를 사용하면 spring-boot-starter-logging 가 함께 포함된다. 스프링 부트 로깅 라이브러리는 기본으로 SLF4J, Logback 라이브러리를 사용한다. 로그를 출력하기 위한 로깅 라이브러리와 관련된 코드도 추가할 것이다. 이제 코드를 수정해보자. 

기존에 생성한 PostController.java 파일을 더보기 버튼과 같이 수정한다.

  • 클래스 레벨에 @Slf4j 애노테이션이 추가됨
  • 메서드 이름 변경: postWrite -> writePost
  • registerPost 메서드 수정
더보기
package plming.board.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import plming.board.domain.PostDTO;
import plming.board.service.PostService;

@Slf4j
@Controller
public class PostController {

    @Autowired
    private PostService postService;

    @GetMapping("/posts/write")
    public String writePost(@RequestParam(value = "id", required = false) Long id, Model model) {
        if (id == null) {
            model.addAttribute("post", new PostDTO());
        } else {
            PostDTO post = postService.getPostDetail(id);
            if (post == null) {
                return "redirect: /posts/list";
            }
            model.addAttribute("post", post);
        }

        return "posts/write";
    }

    @ResponseBody
    @PostMapping("/posts/register")
    public String registerPost(@RequestBody PostDTO post, RedirectAttributes redirectAttributes) {
        log.info("title: {}, writer = {}", post.getTitle(), post.getUser());
        try {
            boolean isRegistered = postService.registerPost(post);
            redirectAttributes.addAttribute("postId", post.getId());

            if (isRegistered == false) {
                // 게시글 등록에 실패했다는 메시지 전달
            }
        } catch (DataAccessException e) {
            // 데이터베이스 처리 과정에 문제가 발생했다는 메시지 전달
        } catch (Exception e) {
            // 시스템에 문제가 생겼다는 메시지 전달
        }
        return "redirect: /posts/{postId}";
    }
}

코드를 살펴보면

애노테이션 및 메서드 설명
@Slf4j 로그 라이브러리에는 수 많은 라이브러리가 있는데, 이것을 통합해서 인터페이스로 제공하는 것이 SLF4J 라이브러리다. SLF4J는 인터페이스이고, 그 구현체로 Logback 같은 로그 라이브러리가 존해한다. 일반적으로 스프링 부트가 기본으로 제공하는 Logback을 사용한다.

@Slf4j 롬북을 사용하면 따로 로그를 선언해주지 않아도 되므로 클래스 레벨에 이 롬북을 선언한다.
@ResponseBody view를 조회하지 않고 메시지 바디 정보를 직접 반환한다.
@RequestBody 메시지 바디 정보를 직접 조회한다.
log.info() 로그 사용을 위한 메서드
registerPost RequestBody를 통해 post 정보를 파라미터 값으로 받아온다. 로그에 간단하게 게시글 제목과 작성자를 출력한다. 나머지 로직은 이전과 일치하고, redirect되는 주소를 게시글 리스트가 아닌 등록한 게시글의 상세 페이지로 지정한다.
 RedirectAttributes URL 인코딩을 해주고, pathVariable, 쿼리 파리미터까지 처리해준다.

"redirect: /posts/{postId}": {postId}를 pathVariable 바인딩해준다.

 

잘 실행되는지 Postman을 통해 테스트해보자.

postman을 실행하고 주소 부분을 사진과 같이 입력하고 HTTP 메서드를 POST로 지정한 후 Body 부분을 raw-JSON 타입으로 선택하고, 데이터를 입력한다.

PostMan 테스트

Send을 클릭하고 결과를 확인해보면, 아직 redirect 페이지가 없어 상태 코드가 200 OK로 뜨지만 MySQL Workbench에서 post 테이블을 조회해보면 데이터가 잘 들어가 있는 것을 확인할 수 있다.

Postman 테스트 결과
Workbench 테스트 결과

 

728x90
LIST

댓글