실습(Controller)
- [Web_Spring] 10 이어서
1. src/main/java/com.example.board/controller/BoardController.java
package com.example.board.controller;
import com.example.board.domain.vo.BoardVO;
import com.example.board.service.BoardService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
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 org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springframework.web.servlet.view.RedirectView;
import javax.servlet.http.HttpServletRequest;
/*
* TASK URL METHOD PARAMETER FORM URL이동
*
* 전체목록 /board/list GET 없음 없음
* 등록 /board/register POST 모든 항목 필요 /board/list
* 조회 /board/read GET boardNumber 없음
* 삭제 /board/remove GET boardNumber 없음 /board/list
* 수정 /board/modify POST 모든 항목 필요 /board/read
*
* */
@Controller
@Slf4j
@RequiredArgsConstructor
@RequestMapping("/board/*")
public class BoardController {
private final BoardService boardService;
@GetMapping("register")
public void register(){}
@GetMapping("list")
public String getList(Model model){
log.info("----------------------------");
log.info("list.............");
log.info("----------------------------");
model.addAttribute("boardList", boardService.getList());
return "/board/list";
}
@PostMapping("register")
// 매개변수에 선언된 객체는 자동으로 화면에 전달되므로,
// 이를 막기 위해서는 redirect 방식의 전송이 필요하다.
public RedirectView register(BoardVO boardVO, RedirectAttributes rttr){
log.info("----------------------------");
log.info("register............. : " + boardVO);
log.info("----------------------------");
boardService.register(boardVO);
// 1. Flash 사용
// 세션에 파라미터를 저장하고, request 객체가 초기화된 후 다시 request에 담아준다.
rttr.addFlashAttribute("boardNumber", boardVO.getBoardNumber());
// 2. 쿼리 스트링
// rttr.addAttribute("boardNumber", boardVO.getBoardNumber());
return new RedirectView("/board/list");
}
// 게시글 상세보기
@GetMapping({"read", "modify"})
public void read(Long boardNumber, HttpServletRequest req, Model model){
log.info("----------------------------");
log.info(req.getRequestURI() + "............. : " + boardNumber);
log.info("----------------------------");
model.addAttribute("board", boardService.get(boardNumber));
}
// 수정
@PostMapping("modify")
public RedirectView modify(BoardVO boardVO, RedirectAttributes rttr){
log.info("----------------------------");
log.info("modify............. : " + boardVO);
log.info("----------------------------");
boardService.modify(boardVO);
// 컨트롤러에서 다른 컨트롤러의 매개변수로 파라미터를 전달할 때에는
// addAttribute(), 쿼리스트링 방식으로 전달해야 받을 수 있다.
// Flash방식은 최종 응답 화면에서 사용될 파라미터를 전달할 때에만 사용하도록 한다.
rttr.addAttribute("boardNumber", boardVO.getBoardNumber());
return new RedirectView("/board/read");
}
// 삭제
@GetMapping("remove")
public String remove(Long boardNumber, Model model){
log.info("----------------------------");
log.info("remove............. : " + boardNumber);
log.info("----------------------------");
boardService.remove(boardNumber);
return getList(model);
}
}
2. src/test/java/com.example.board/controller/BoardControllerTests.java
package com.example.board.controller;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
@SpringBootTest
@Slf4j
public class BoardControllerTests {
// 마치 브라우저에서 URL을 요청한 것처럼 환경을 만들어준다.
private MockMvc mockMvc;
@Autowired
// 요청을 처리해주는 WebApplicationContext를 불러온다.
private WebApplicationContext webApplicationContext;
@BeforeEach
public void setUp(){
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
// @Test
// public void getListTest() throws Exception {
// log.info(mockMvc.perform(MockMvcRequestBuilders.get("/board/list")).andReturn().getModelAndView().getModelMap().toString());
// }
// @Test
// public void registerTest() throws Exception {
// log.info(mockMvc.perform(MockMvcRequestBuilders.post("/board/register")
// .param("boardTitle", "테스트 새 글 제목")
// .param("boardContent", "테스트 새 글 내용")
// .param("boardWriter", "hds1234")).andReturn().getFlashMap().toString());
// }
// @Test
// public void readTest() throws Exception{
// log.info(mockMvc.perform(MockMvcRequestBuilders.get("/board/read").param("boardNumber", "2601")).andReturn().getModelAndView().getModelMap().toString());
// }
// @Test
// public void modifyTest() throws Exception {
// log.info(mockMvc.perform(MockMvcRequestBuilders.post("/board/modify")
// .param("boardNumber", "2601")
// .param("boardTitle", "수정된 게시글 제목")
// .param("boardContent", "수정된 게시글 내용")).andReturn().getModelAndView().getModelMap().toString());
// }
@Test
public void removeTest() throws Exception {
log.info(mockMvc.perform(MockMvcRequestBuilders.get("/board/remove").param("boardNumber", "2601")).andReturn().getModelAndView().getViewName());
}
}
'웹 개발 > Spring' 카테고리의 다른 글
[Web_Spring] 13 (0) | 2022.06.25 |
---|---|
[Web_Spring] 12 (0) | 2022.06.24 |
[Web_Spring] 10 (0) | 2022.06.22 |
[Web_Spring] 09 (0) | 2022.06.21 |
[Web_Spring] 08 (0) | 2022.06.20 |