Spring legacy

Spring 게시판 구현 - Presentation Layer

voider 2020. 9. 12. 13:50

Presentation Layer

컨트롤러와 화면처리를 담당할 jsp가 프레젠테이션 계층이다.

컨트롤러를 완성하고 화면처리를 할 것이다.

URL분기는 참고

달라진 점은 수정 페이지를 따로 만들지 않고 자바스크립트를 이용해서 처리할 것이므로 따로 분기하지 않았다.

컨트롤러

@Controller
@RequiredArgsConstructor
@RequestMapping("/board")
@Log4j
public class BoardController {

    private final BoardService boardService;

    @GetMapping("/list")
    public void getAllPost(Model model) {

        log.info("/board/list");

        model.addAttribute("list", boardService.getAllPost());
    }

    @GetMapping("/write")
    public void write() {
        log.info("/board/write");
    }

    @PostMapping("/register")
    public String register(BoardVO boardVO, RedirectAttributes redirect) {
        log.info("/board/register");
        log.info("boardVO : "  + boardVO);

        redirect.addAttribute("no", boardService.register(boardVO));

        return "redirect:/board/post";
    }

    @GetMapping("/post")
    public void getPost(Long no, Model model) {
        log.info("/board/post");

        model.addAttribute("post", boardService.getPost(no));
    }


    @PostMapping("/modify")
    public String modify(BoardVO boardVO, RedirectAttributes redirect) {
        log.info("/board/modify");
        log.info("BoardVO : " + boardVO);

        int result = boardService.modify(boardVO);

        log.info("MODIFY RESULT : " + result);

        redirect.addAttribute("no",boardVO.getBno());

        return "redirect:/board/post";
    }

    @PostMapping("/remove")
    public String remove(Long bno) {
        log.info("/board/remove");
        log.info("bno : " + bno);

        int result = boardService.remove(bno);
        log.info("result : " + result);

        return "redirect:/board/list";
    }
}

MockMvc Test

컨트롤러는 화면과 연결하기 때문에 결과를 바로 화면에서 확인할 수 있다.
그러나
스프링은 서버를 구동하는 데 약간의 시간이 걸리므로, MockMvc객체로 가상 MVC환경을 구성해서 테스트 해보는 것이 좋다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {RootConfig.class, ServletConfig.class})
@Log4j
//ServletContext의 WebApplicationContext를 이용하기 위해서 선언
@WebAppConfiguration
public class BoardControllerTest {

    @Autowired
    private WebApplicationContext webContext;

    private MockMvc mockMvc;

    //테스트를 실행하기 전에 매번 실행한다.
    @Before
    public void setup() {    //MockMvc객체를 초기화 하는 메서드
        this.mockMvc = MockMvcBuilders
                .webAppContextSetup(webContext)
                .build();
    }


    @Test
    public void getAllPostTest() {
        ModelMap result;

        try {
             result = mockMvc.perform(MockMvcRequestBuilders.get("/board/list"))
                .andReturn()
                .getModelAndView()
                .getModelMap();

            assertNotNull(result);
            log.info(result);

        } catch (Exception e) {
            fail(e.getMessage());
        }
    }

    @Test
    public void registerTest() {
        try {
            String resultPage = mockMvc.perform(MockMvcRequestBuilders.post("/board/register")
                    .param("title", "mockMvcTest")
                    .param("content", "volvoKO")
                    .param("writer", "Elec")
                    ).andReturn().getModelAndView().getViewName();

            assertTrue(resultPage.length()!=0||!resultPage.equals("")||resultPage!=null);
            log.info("resultPage : " + resultPage);

        } catch (Exception e) {
            fail(e.getMessage());
            log.info(e.getMessage());
        }
    }

    @Test
    public void getPostTest() {
        try {
            ModelMap result = mockMvc.perform(MockMvcRequestBuilders
                    .get("/board/post")
                    .param("no", "1"))
            .andReturn()
            .getModelAndView()
            .getModelMap();

            assertNotNull(result);
            log.info(result);

        } catch (Exception e) {
            fail(e.getMessage());
        }
    }

    @Test
    public void testModify() {
        try {
            String resultPage = mockMvc.perform(MockMvcRequestBuilders.post("/board/modify")
                    .param("bno", "1")
                    .param("title", "MockMVC MODIFYING")
                    .param("content", "HELLO, MOCK MVC?"))
            .andReturn()
            .getModelAndView()
            .getViewName();

            assertTrue(resultPage != null 
                        || !resultPage.equals("")
                        || resultPage.length() != 0);

        } catch (Exception e) {
            fail(e.getMessage());
        }
    }

    @Test
    public void testRemove() {
        try {
            String resultPage = mockMvc.perform(MockMvcRequestBuilders.post("/board/remove")
                    .param("bno", "253"))
            .andReturn()
            .getModelAndView()
            .getViewName();

            assertNotNull(resultPage);

            log.info("resultPage : " + resultPage);

        } catch (Exception e) {
            fail(e.getMessage());
        }
    }
}

여기까지가 컨트롤러 부분의 끝이다. 물론 이것은 버전1이다.
이만큼만 완성하고 화면과 붙여서 제대로 작동하는지 확인한다.
그 다음 페이징, 검색, 파일 업로드 같은 기능을 추가하는 식으로 개발한다.