Spring #16 - 삭제 / 수정

김형우·2022년 3월 8일
0

Spring

목록 보기
17/19

삭제

  1. try_catch 사용 이유
    : boardRepository.deleteById(no);
    이 코드를 사용할때 no부분이 long 타입으로 잡혀있는데 Repositroy에서 설정해서 그렇다.

    오류를 컨트롤러에서 잡으라고 던졌기때문에 컨트롤러에서 try_catch로 오류를 처리해야한다.
  2. deleteById는 void 속성을가지기 때문에 리턴값이 없다.

수정

  1. 수정 클릭시 화면 전환

  2. session으로 radio를 통해 넘어온 value값인 no를 넘김
    : httpSession.setAttribute("NO", no);

  3. @GetMapping으로 넘어간 페이지 표시
    : POST에서 GET으로 데이터 전송 방법 세가지
    3-1. GET) boardRepository.findById(no) 사용
    : session에서 no를 꺼내서 사용
    : POST) httpSession.setAttribute("no", no);
    3-2. GET) @RequestParam(name = "no1") long no1 사용
    : 파라미터로 받은 no1 사용
    : POST) redirectAttributes.addAttribute("no1", no);
    3-3. GET) HttpServletRequest httpServletRequest 사용
    : Map으로 꺼냄, Map 자체도 일회성
    : session에 숨겨서 보낸 no2 사용. 일회성, 휘발성
    : POST) redirectAttributes.addFlashAttribute("no2", no);

  4. Optional => null에 대한 처리
    : Board list = boardRepository.findById(no).orElse(null);
    : null이 아니면 Boarf 타입으로 꺼냄

  5. 수정 수행
    : 추가 => 기본키를 다르게해서 저장
    : 수정 => 기본키에 해당하는 글번호를 동일하게 해서 새로 저장
    5-1. try_catch로 묶음
    : 보통 리턴값을 주기보다 try_catch로 묶어서 사용하면 오류 처리가 더 쉽다
    5-2. 기존 내용을 읽음 (board1)
    : Board board1 = boardRepository.findById(board.getNo()).orElse(null);
    : Optional 처리 => null에 대한 처리를 위해 orElse(null)를 사용
    5-3. 변경할 항목만 다시 저장
    : board1.setTitle(board.getTitle());
    : board1.setContent(board.getContent());
    : board1.setWriter(board.getWriter());
    5-4. 기존내용 + 변경항목 부분 = board1을 save함
    : Board response = boardRepository.save(board1);

POST - 실제 수정 수행

// 수정 수행
@PostMapping(value = "/update")
public String updatePOST(
        Model model,
        @ModelAttribute Board board) {
    try {
        // 1. 기존내용을 읽음
        Board board1 = boardRepository.findById(board.getNo()).orElse(null);

        // 2. 변경할 항목만 다시 저장
        board1.setTitle(board.getTitle());
        board1.setContent(board.getContent());
        board1.setWriter(board.getWriter());

        // 3. 기존내용 + 변경항목 부분을 save함
        Board response = boardRepository.save(board1);
        System.out.println("response ===> " + response);
        model.addAttribute("msg", board.getNo() + "번 글 수정되었습니다.");
        model.addAttribute("url", "/board/selectlist");
        return "alert";
    } catch (Exception e) {
        e.printStackTrace();
        return "redirect:/home";
    }
}

POST - /action

else if (btn.equals("1개수정")) {
	// 세션사용
    httpSession.setAttribute("no", no);

	// GET방식) 1회성 전송, url에 parameter로 붙임 => url에 붙이기 때문에 노출됨
    redirectAttributes.addAttribute("no1", no);

	// POST방식) 세션에 숨겨서 보내기 => 1회성, 휘발성 => 새로고침시 데이터는 소멸
    redirectAttributes.addFlashAttribute("no2", no);

	System.out.println("1개수정");
    return "redirect:/board/update";
}

GET

// 수정 화면
@GetMapping(value = "/update")
public String updateGET(
        Model model,
        @RequestParam(name = "no1") long no1,
        HttpServletRequest httpServletRequest) {
    // 1. POST에서 세션으로 받은 no => httpSession.getAttribute로 받음
    long no = (long) httpSession.getAttribute("no");
    System.out.println("no ===> " + no);

    // 2. POST에서 파라미터로 받은 no1 => requestpram으로 받음
    System.out.println("no1 ===> " + no1);

    Map<String, ?> map = RequestContextUtils.getInputFlashMap(httpServletRequest);
    if (map != null) {
        long no2 = (long) map.get("no2");
        // 3. POST에서 세션에 숨겨서 받은 no2 => Map으로 받음
        System.out.println("no2 ===> " + no2);
    }
    // Optional => null에 대한 처리
    // Optional<Board> response = boardRepository.findById(no);
    // Board list = response.get();
    // 한줄로 줄여짐
    Board list = boardRepository.findById(no).orElse(null);

    model.addAttribute("list", list);
    // System.out.println("model ===> " + model);
    return "board/update";
}

전체 코드

// 수정/삭제
@PostMapping(value = "/action")
public String actionPOST(
        Model model,
        RedirectAttributes redirectAttributes, // Post에서 Get으로 데이터 전송
        @RequestParam(name = "btn") String btn,
        @RequestParam(name = "radio") long no) {
    try {
        // System.out.println("btn ===> " + btn);
        // System.out.println("no ===> " + no);
        if (btn.equals("1개삭제")) {
            boardRepository.deleteById(no);
            // System.out.println(no + "번 삭제 성공");
            model.addAttribute("msg", no + "번 글 삭제되었습니다.");
            model.addAttribute("url", "/board/selectlist");
            return "alert";
        } else if (btn.equals("1개수정")) {
            // 이동

            // 세션사용
            httpSession.setAttribute("no", no);

            // GET방식) 1회성 전송, url에 parameter로 붙임 => url에 붙이기 때문에 노출됨
            redirectAttributes.addAttribute("no1", no);

            // POST방식) 세션에 숨겨서 보내기 => 1회성, 휘발성 => 새로고침시 데이터는 소멸
            redirectAttributes.addFlashAttribute("no2", no);

            System.out.println("1개수정");
            return "redirect:/board/update";
        }
        return "redirect:/board/selectlist";

    } catch (Exception e) {
        e.printStackTrace();
        return "redirect:/home";
    }
}
profile
The best

0개의 댓글