2022_03_02 - oneso123456789/2022 GitHub Wiki

other

RedirectAttributes의 addAttribute와 addFlashAttribute의 차이점

  • rttr.addAttribute: 전달한 값은 url뒤에 붙으며, 리프레시해도 데이터가 유지됨
  • rttr.addFlashAttribute: 전달한 값은 url뒤에 붙지 않음, 또한 2개 이상 쓸 경우,
    데이터가 소멸함 따라서 맵을 이용하여 한번에 값을 전달해야함

10.2.4 수정 처리와 테스트

수정 작업은 등록과 유사함
변경된 내용을 수집해서 BoardVO 파라미터로 처리하고, BoardService를 호출함
수정 작업을 시작하는 화면의 경우에는 GET 방식으로 접근하지만 실제 작업은 POST 방식으로 동작하므로 @PostMappring을 이용해서 처리함

BoardController 클래스의 일부

    @PostMapping("/modify")
    public String modify(BoardVO board, RedirectAttributes rttr) {
        
        log.info("BoardController modify:" + board);
        
        if(service.modify(board)) {
            rttr.addFlashAttribute("result", "success");
        }
        return "redirect:/board/list";
    }

service.modify()는 수정 여부를 boolean으로 처리하므로 이를 이용해서 성공한 경우에만 RedirectAttributes에 추가함.

테스트 코드는 아래와 같음

com.crow.controller.BoardControllerTests의 일부

    @Test
    public void testModify() throws Exception{
        
        String resultPage = mockMvc.perform(MockMvcRequestBuilders.post("/board/modify")
                .param("bno", "4")
                .param("title", "제목 BoardControllerTests중 수정됨")
                .param("content", "내용 BoardControllerTests중 수정됨")
                .param("writer", "작성자 BoardControllerTests중 수정됨"))
                .andReturn().getModelAndView().getViewName();
        
        log.info("BoardControllerTests " + resultPage);
    }

테스트 로그는 특별한것 없이 업데이트 하고 리다이렉트로 문자열 /board/list을 해줌

10.2.5 삭제 처리와 테스트

삭제 처리도 조회와 유사하게 BoardController와 테스트 코드를 작성함
삭제는 반드시 post 방식으로만 처리함

com.crow.controller.BoardController 클래스의 일부

    @PostMapping("/remove")
    public String remove(@RequestParam("bno") Long bno, RedirectAttributes rttr ) {
        
        log.info("BoardController: remove..." + bno);
        
        if(service.remove(bno)) {
            rttr.addFlashAttribute("reult","success");
        }
        return "/redirect:/board/list";
    }

BoardController의 remove()는 삭제 후 페이지의 이동이 필요하므로 RedirectAttributes를 파라미터로 사용하고 'redirect'를 이용해서 삭제 처리 후에 다시 목록 페이지로 이동함

테스트 코드는 기존의 등록과 유사하게 처리함

com.crow.controller.BoardControllertests class의 일부

    @Test
    public void testRemove() throws Exception {
        // 삭제전 데이터 베이스 게시물 번호 확인
        String resultPage = mockMvc.perform(MockMvcRequestBuilders.post("/board/remove")
                .param("bno", "5"))
                .andReturn().getModelAndView().getViewName();
        
        log.info("BoardControllerTests: " + resultPage);
        
    }

MockMvc를 이용해서 파라미터를 전달할 때에는 문자열로만 처리해야 함
테스트 전에 게시물의 번호가 존재하는지 확인하고 테스트를 실행함
로그의 일부는 SQL이 실행되는것을 확인할 수 있음

경우에 따라서는 Controller에 대한 테스트 코드를 작성하는 것에 대해서 거부감을 가지는 경우도 많음
대부분은 일정에 여유가 없다는 이유로 테스트를 작성하지 않는경우가 많은데
프로젝트를 진행하는 멤버들의 경험치가 낮을수록 테스트를 먼저 진행하는 습관을 가지는 것이 좋음
반복적으로 입력 수정 , WAS의 재시작 시간을 고려하면 Controller에 대한 테스트를 진행하는 선택이 더 빠른 개발의 결과를 낳는 경우도 있음