본문 바로가기

웹 개발/Spring

[Web_Spring] 11

실습(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