# ๐Ÿ› ๏ธ Spring MVC์—์„œ `@PostMapping` ํ›„ redirect๊ฐ€ ํ•„์š”ํ•œ ์ด์œ  โ€” ๊ฒŒ์‹œํŒ ์˜ˆ์ œ๋กœ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ

Yeeunยท2025๋…„ 4์›” 29์ผ
0

SpringBoot

๋ชฉ๋ก ๋ณด๊ธฐ
28/46


๋ณด๋“œ ์„œ๋น„์Šค ์ž„ํ”Œ์—์„œ ์‹œํ€€์Šค๋ฅผ ๋ฐ›๋Š” ์ด์œ ๋Š” , jsp์—์„œ a ํ•˜์ดํผ๋งํฌ์— ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์ด seq? ๋กœ ๋˜์–ด์žˆ๊ธฐ๋•Œ๋ฌธ.

์—…๋ฐ์ดํŠธ ์˜ค๋ฅ˜ : ํฌ์›Œ๋“œ์˜ ๊ฒฝ์šฐ์—” ๊ธฐ์กด์— ๋ณธ์ธ์ด ๊ฐ€์ง„ ๋งคํ•‘๋ฐฉ์‹์„ ๊ฐ€์ง€๊ณ  ํฌ์›Œ๋“œํ•˜๋Š”๊ฑฐ๋ผ , ์—…๋ฐ์ดํŠธ ๋ฉ”์†Œ๋“œ๊ฐ€ ํฌ์ŠคํŠธ๋งคํ•‘๋˜์–ด์žˆ๊ณ  ๋ฆฌํ„ด์ด ํฌ์›Œ๋“œ๋กœ ๋˜์–ด์žˆ๋Š”๋ฐ ์ œ์ผ ์œ„ ๊ฒŸ ๋ณด๋“œ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋ฆฌํ€˜์ŠคํŠธ๋งคํ•‘์ด ์•„๋‹ˆ๋ผ ๊ฒŸ๋งคํ•‘์ด๋ฉด ํฌ์ŠคํŠธ๋ฅผ ์ฐพ๋Š”๋ฐ ๊ฒŸ๋งŒ ์žˆ์–ด์„œ ์ฐพ์„ ์ˆ˜๊ฐ€ ์—†์Œ /
ํ•ด๊ฒฐ๋ฒ• : ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋กœ ํ˜ธ์ถœํ•˜์—ฌ ๊ฒŸ๋งคํ•‘์„ ์ฐพ๊ฒŒ ํ•˜๊ธฐ
ํ˜น์€ ๊ฒŸ๋ณด๋“œ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฆฌํ€˜์ŠคํŠธ๋งคํ•‘์œผ๋กœ ์–ด๋…ธํ…Œ์ด์…˜ํ•˜๊ณ , ๋ฆฌํ€˜์ŠคํŠธ๋ฉ”์†Œ๋“œ ์ผ“, ํฌ์ŠคํŠธ ๋‘˜๋‹ค ์„ค์ •ํ•ด๋‘๋Š”๊ฑธ๋กœ ํ•˜๊ธฐ ( ์ด๋•Œ๋Š” ์—…๋ฐ์ดํŠธ ๋ฉ”์†Œ๋“œ๋ฅผ ํฌ์›Œ๋“œ๋ฆฌํ„ด์œผ๋กœ ๋‚ด๋ฒ„๋ ค๋‘ฌ๋„ ๋จ)

๐Ÿ› ๏ธ Spring MVC์—์„œ @PostMapping ํ›„ redirect๊ฐ€ ํ•„์š”ํ•œ ์ด์œ  โ€” ๊ฒŒ์‹œํŒ ์˜ˆ์ œ๋กœ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ

๐Ÿ‘€ ๋ฌธ์ œ ์ƒํ™ฉ: ์™œ @PostMapping ํ›„์— redirect๋ฅผ ํ•ด์•ผ ํ• ๊นŒ?

Spring MVC์—์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.

๐Ÿ”ป BoardController.java ์ค‘ ์ผ๋ถ€

@PostMapping("/updateBoard")
public String updateBoard(Board board) {
    boardService.updateBoard(board);
    return "getBoardList"; // โ›” ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ!
}

์ด ์ฝ”๋“œ์—์„œ ๊ฒŒ์‹œ๊ธ€์„ ์ˆ˜์ •ํ•œ ๋’ค getBoardList.jsp๋กœ ํฌ์›Œ๋“œ(forward)ํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ, 405 Method Not Allowed ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”.

๊ทธ ์ด์œ ๋Š” ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค:

  • ์šฐ๋ฆฌ๋Š” POST ๋ฐฉ์‹์œผ๋กœ /updateBoard๋ฅผ ํ˜ธ์ถœํ–ˆ๋Š”๋ฐ,
  • ๋ฆฌํ„ด๋œ ๋ทฐ ์ด๋ฆ„ "getBoardList"๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค์‹œ POST ๋ฐฉ์‹์œผ๋กœ /getBoardList๋ฅผ ์š”์ฒญํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ /getBoardList๋Š” ์˜ค์ง GET ๋ฐฉ์‹๋งŒ ํ—ˆ์šฉํ•ด์š”:
@GetMapping("/getBoardList")
public String getBoardList(Model model) {
    ...
}

๊ฒฐ๊ตญ ์š”์ฒญ ๋ฐฉ์‹ ๋ถˆ์ผ์น˜๋กœ ์—๋Ÿฌ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.


๐Ÿงฏ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 1: redirect: ์‚ฌ์šฉํ•˜๊ธฐ (๊ถŒ์žฅ)

๊ฐ€์žฅ ํ”ํ•˜๊ณ  ๊ถŒ์žฅ๋˜๋Š” ํ•ด๊ฒฐ๋ฒ•์€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@PostMapping("/updateBoard")
public String updateBoard(Board board) {
    boardService.updateBoard(board);
    return "redirect:getBoardList"; // โœ… GET ๋ฐฉ์‹์œผ๋กœ ์žฌ์š”์ฒญ๋จ
}

Spring์—์„œ๋Š” "redirect:" ์ ‘๋‘์–ด๋ฅผ ๋ถ™์ด๋ฉด ํด๋ผ์ด์–ธํŠธ์— 302 ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‘๋‹ต์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ธŒ๋ผ์šฐ์ €๋Š” /getBoardList๋ฅผ GET ๋ฐฉ์‹์œผ๋กœ ๋‹ค์‹œ ์š”์ฒญํ•˜๊ฒŒ ๋˜์–ด ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 2: @RequestMapping์œผ๋กœ GET/POST ๋ชจ๋‘ ํ—ˆ์šฉํ•˜๊ธฐ

@RequestMapping(value = "/getBoardList", method = {RequestMethod.GET, RequestMethod.POST})
public String getBoardList(Model model) {
    ...
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด GET/POST ๋ชจ๋‘ ํ—ˆ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์—, POST ๋ฐฉ์‹์œผ๋กœ๋„ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ ๋ช…์‹œ์„ฑ์ด ๋–จ์–ด์ง€๊ณ , ์ค‘๋ณต ํผ ์ œ์ถœ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


๐Ÿ“ฆ ์ „์ฒด ์ฝ”๋“œ ์ •๋ฆฌ

1. Board.java

package ruby.paper.domain;

import java.util.Date;

import lombok.*;

@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Getter
@Setter
public class Board {
    private Long seq;
    private String title;
    private String content;

    @Builder.Default
    private Date createDate = new Date();

    @Builder.Default
    private Long cnt = 0L;
    private String writer;
}

2. BoardService.java (์ธํ„ฐํŽ˜์ด์Šค)

package ruby.paper.service;

import java.util.List;
import ruby.paper.domain.Board;

public interface BoardService {
    List<Board> getBoardList();
    Board getBoard(Board board);
    void insertBoard(Board board);
    void updateBoard(Board board);
    void deleteBoard(Board board);
}

3. BoardServiceImpl.java

package ruby.paper.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import ruby.paper.domain.Board;
import ruby.paper.persistence.BoardRepository;

@Service
public class BoardServiceImpl implements BoardService {

    @Autowired
    private BoardRepository boardRepo;

    @Override
    public List<Board> getBoardList() {
        return boardRepo.findAll();
    }

    @Override
    public Board getBoard(Board board) {
        return boardRepo.findById(board.getSeq()).orElse(null);
    }

    @Override
    public void insertBoard(Board board) {
        boardRepo.save(board);
    }

    @Override
    public void updateBoard(Board board) {
        boardRepo.save(board);
    }

    @Override
    public void deleteBoard(Board board) {
        boardRepo.deleteById(board.getSeq());
    }
}

4. BoardController.java

package ruby.paper.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import ruby.paper.domain.Board;
import ruby.paper.service.BoardService;

@Controller
public class BoardController {

    @Autowired
    private BoardService boardService;

    @GetMapping("/getBoardList")
    public String getBoardList(Model model) {
        List<Board> boardList = boardService.getBoardList();
        model.addAttribute("boardList", boardList);
        return "getBoardList";
    }

    @GetMapping("/insertBoard")
    public String insertBoardView() {
        return "insertBoard";
    }

    @PostMapping("/insertBoard")
    public String insertBoard(Board board) {
        boardService.insertBoard(board);
        return "redirect:getBoardList"; // โœ… ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
    }

    @GetMapping("/getBoard")
    public String getBoard(Board board, Model model) {
        model.addAttribute("board", boardService.getBoard(board));
        return "getBoard";
    }

    @PostMapping("/updateBoard")
    public String updateBoard(Board board) {
        boardService.updateBoard(board);
        return "redirect:getBoardList"; // โœ… ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
    }
}

โœ… ์ •๋ฆฌ

ํฌ์ธํŠธ์„ค๋ช…
redirect:GET ๋ฐฉ์‹์œผ๋กœ ๋‹ค์‹œ ์š”์ฒญ์„ ์œ ๋„ํ•˜์—ฌ ์—๋Ÿฌ ์—†์ด ์—ฐ๊ฒฐ๋จ
@PostMapping โ†’ "getBoardList" (๋‹จ์ˆœ ๋ฌธ์ž์—ด)์š”์ฒญ ๋ฐฉ์‹ ์ถฉ๋Œ๋กœ ์—๋Ÿฌ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
@RequestMapping(method = {GET, POST})ํฌ์›Œ๋“œ ๋ฐฉ์‹๋„ ๊ฐ€๋Šฅํ•˜๋‚˜ ๋ช…์‹œ์„ฑ ๋–จ์–ด์ง
PRG ํŒจํ„ดPost โ†’ Redirect โ†’ Get์œผ๋กœ ํผ ์ค‘๋ณต ์ œ์ถœ ๋ฐฉ์ง€

0๊ฐœ์˜ ๋Œ“๊ธ€