본문 바로가기
스프링

스프링으로 게시판 만들기 3 - controller만들기

by 근즈리얼 2021. 8. 2.
728x90

프로젝트 생성과 데이터베이스 연동 그리고 jpa를 이용하여 테이블까지 만들었으니

이번에는 controller를 이용해 url을 어떻게 처리할지

그리고 테이블에 값을 넣어보는거까지 오늘 포스팅에 담아보겠습니다!!

 

우선 text와 writer를 form형태로 받아올 생각입니다.

form형태를 받는것은 데이터를 param형태로 받아오는 것이기 때문에

@RequestParam 혹은 @ModelAttribute로 받아올 수 있습니다.

쉽게 생각했을 때

@RequestParam -> text와 writer를 각각 받는 것이고

@ModelAttribute -> text와 write를 객체로 한번에 받아온다고 생각하면 쉽습니다.

 

controller 코드

package hello.myproject.controller;

import hello.myproject.domain.Board;
import hello.myproject.repository.BoardRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import java.util.List;

@Controller
@RequiredArgsConstructor
public class BoardController {

    private final BoardRepository boardRepository;

    @GetMapping("/basic/boards")
    public String boardsForm(Model model){
        List<Board> boards = boardRepository.findAll();
        model.addAttribute("boards",boards);
        return "basic/boards";
    }

    @GetMapping("/basic/board")
    public String boardForm(){
        return "basic/board";
    }

    @PostMapping("/basic/board")
    public String boardAdd(BoardDto boardDto){
        Board board = new Board(boardDto.getText(), boardDto.getWriter());
        boardRepository.save(board);
        return "redirect:/";
    }

}

 

boardsForm : get매핑으로 게시물들을 보여주는 템플릿으로 연결합니다.

boardForm : get매핑으로 게시물을 작성하는 템플릿으로 연결합니다.

boardAdd : post매핑으로 게시물을 작성하고 버튼을 눌렀을때 이 메소드에 연결됩니다.

 

요번 포스팅에 중요한 개념이 정말 많은데!!

 

우선 위에서 요청 데이터가 넘어왔을 때 저는 param형태로 오는 데이터를 처리하기 위해 @ModelAttribute를 사용했습니다.

어디서 사용했냐고 생각하실수 있습니다!! 

바로 postMapping을 하는 부분에서 BoardDto를 받을 때 사용했습니다.

@ModelAttribute는 생략이 가능하더라고요!

또 하나 중요한 점은 지금 매핑에서는 model값을 template에 보내지 않았기 때문에 관련없지만

@ModelAttribute("boardDto")를 사용할 경우 template에 boardDto로 값을 보낼 수 있습니다.

근데 생략이 가능하다고 했는데 생략을 한다면 어떻게 될까요??

바로 BoardDto클래스로 매개변수를 받아왔다면 맨 앞의 대문자를 소문자로 바꿔서 자동을 model에 저장하고

template에 보내게 됩니다.

 

포스트맨을 이용해 받아온 값이 데이터베이스에 잘 저장되었는지 확인해 보겠습니다.

param에 key와 value값을 넣고 send버튼을 누릅니다.

 

 

데이터베이스에 생성이 되었습니다!!

 

이렇게 요청데이터를 @ModelAttribute를 이용하여 잘 처리했습니다.

그렇다면 파라미터가 아닌 json이나 보통 text문을 처리할 때는 어떻게 해야할까요??

물론 나중에 프로젝트를 진행하면서 포스팅하겠지만

간단하게 @RequestBody를 이용하면 되겠습니다.

여기서 주의해야 할 점은 @RequestBody는 생략이 불가능하다는 것입니다...

그 이유는 @RequestParam과 @ModelAttribute는 생략이 가능하기 때문에 서버가 헷갈리수 있거든요!!

 

프로젝트를 진행하면서 예상하지 못했던 에러를 만났습니다.

 

바로 400에러!!

PostMapping을 할 때 자꾸 발생했는데 서버오류는 아니라고 하고 잘못된 접근이라고만 하니 뭐가 잘못된것인지 감을 잡을 수 없었습니다.

 

구글링을 통해 파라미터를 객체로 받을 때 채워지지 못한 값이 있다면 그게 문제가 될 수 있다고 해서

처음에는 @RequestParam을 활용하여 문제를 해결했었습니다. 

 

하지만 객체를 활용하는 방법이 훨씬 좋았던 저는 다른 해결방법을 생각해봤었습니다.

아무래도 오류의 원인은 데이터베이스에 저장할 때 자동으로 1이 증가하는 int id가 문제였던 것 같고 id를 제외한 데이터 저장소인 BoardDto를 만들어 해결하게 되었습니다.

 

만약 @ModelAttribute를 사용할 때 알수 없는 400에러가 발생한다면 매개변수로 받는 객체를 다시 한번 살펴봐야 할 것 같습니다.

 

** redirect 주의

PostMapping에서 return을 redirect를 사용했는데 그 이유는 redirect를 하지않고 새로고침을 하면 똑같은 값이 데이터베이스에 재생성됩니다. 그 이유는 서버에 마지막 요청이 postMapping을 통한 게시글 작성이고 새로고침을 하는 것은 마지막 요청을 재요청 하는 것이기 때문입니다. ㅇ

728x90

댓글