#16-削除/変更


削除
  • try catch使用理由
    : boardRepository.deleteById(no);このコードを使用すると、no部分がlongタイプになります.これがRepository設定の理由です.

    コントローラがエラーを投げ出すため、コントローラはtry catchを使用してエラーを処理する必要があります.
  • deleteByIdは、void属性を持つため、戻り値がありません.
  • 変更

  • [修正]をクリックして画面を切り替えます

  • radioによるsessionへの値noの伝達
    : httpSession.setAttribute("NO", no);
  • @GetMappingに移動したページを表示
    :POSTからGETにデータを転送する方法
    3-1. GET)boardRepository.findById(no)使用
    :セッションからnoを取り出して使用
    : POST) httpSession.setAttribute("no", no);3-2. GET)@RequestParam(name = "no1") long no1使用
    :パラメータを使用して受信したno 1
    : POST) redirectAttributes.addAttribute("no1", no);3-3. GET)HttpServletRequest httpServletRequest使用
    :Mapでポップアップし、Map自体も使い捨て
    :セッションで送信されないno 2を使用します.使い捨て
    : POST) redirectAttributes.addFlashAttribute("no2", no);

  • Optional=>nullの処理
    : Board list = boardRepository.findById(no).orElse(null);:nullまたはBoarf以外のタイプ

  • 変更の実行
    :追加=>異なるプライマリ・キーの保存
    :変更=>プライマリ・キーと同じ新しい文書番号を保存
    5-1. try catchで縛る
    :try catchを使用すると、通常の戻り値を使用するよりもエラーが発生しやすい
    5-2. 既存コンテンツの読み込み(ボード1)
    : Board board1 = boardRepository.findById(board.getNo()).orElse(null);:使用orElse(null)処理Optional処理=>null
    5-3. 変更内容のみ保存
    : board1.setTitle(board.getTitle());: board1.setContent(board.getContent());: board1.setWriter(board.getWriter());5-4. 既存コンテンツの保存+変更部分=ボード1
    : 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";
        }
    }