본문 바로가기
스프링

스프링으로 게시판 만들기 6 - 데이터 수정

by 근즈리얼 2021. 8. 5.
728x90

이번 포스팅에서는 데이터를 수정하는 방법에 대해서 해볼겁니다!

 

처음에는 멍청하게도 수정된 내용을 다시 저장하면 되지 않나? 라고 생각했는데 그럼 원래 데이터는...?? 수정하면 데이터의 id도 바뀌는건데 그건 너무 불필요한 과정인거 같았습니다. 그래서 이고저곳 찾아본 결과

@Transactional을 사용하여 쉽게 데이터를 수정할 수 있었습니다.

 

현재 글의 내용과 수정하기 버튼을 보실수 있습니다.

@GetMapping("/basic/board/{boardId}/edit")
    public String boardEditForm(@PathVariable Long boardId,Model model) {
        Optional<Board> boards = boardRepository.findById(boardId);
        Board board = boards.orElse(new Board());
        model.addAttribute("board",board);
        return "basic/edit";
    }

    @PostMapping("/basic/board/{boardId}/edit")
    public String boardEdit(@PathVariable Long boardId,BoardDto boardDto, Model model) {
        Board board = boardService.update(boardId, boardDto);
        model.addAttribute("board",board);
        return "redirect:/basic/board/{boardId}";
    }

controller안에 두 메소드를 넣어 위의 url로 왔을 때 method의 차이를 줍니다.

 

get으로 왔을때는 model에 게시물을 넣어서 view로 보내주면 되지만 

 

수정된 내용을 가져오는 post일 때는 조금 더 복잡한 과정을 지나가야 합니다.

 

요번 포스팅에 처음 등장한 BoardService를 활용할 건데요!

BoardService 코드

package hello.myproject.service;

import hello.myproject.controller.BoardDto;
import hello.myproject.domain.Board;
import hello.myproject.repository.BoardRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


@Service
@RequiredArgsConstructor
public class BoardService {

    private final BoardRepository boardRepository;

    @Transactional
    public Board update(Long id, BoardDto boardDto){

        Board board = boardRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다."));

        board.update(boardDto);
        return board;
    }
}

- @Transactional을 이용하여 스프리에게 지금 데이터베이스 명령어가 발생해야해!! 라고 알려줍니다.

- findById를 이용하면 Optional이 나오므로 orElseThrow를 이용하여 오류 처리를 해주고 Board의 update의 메소드로 데이터를 넘겨줘서 처리합니다.

 

조금 변화된 Board의 코드

package hello.myproject.domain;

import hello.myproject.controller.BoardDto;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.*;

@Entity
@Getter
@Setter
@NoArgsConstructor
public class Board extends Timestamped{



    @GeneratedValue//(strategy = GenerationType.AUTO)
    @Id
    private Long id;

    private String text;

    private String writer;


    public Board(String text, String writer){
        this.text = text;
        this.writer = writer;
    }

    public void update(BoardDto boardDto){
        this.text = boardDto.getText();
        this.writer = boardDto.getWriter();
    }
}

- 맨 마지막에 update 메소드가 추가되었습니다!!

 

맨 처음 수정하기 버튼을 눌렀을 때

- 저장 버튼이 생기면서 내용과 글쓴이의 내용을 수정할 수 있게 되었습니다.

 

- id가 2인 값에 잘 저장이 되었네요!!

 

-내용을 수정하고

데이터베이스에 가보면!!

이렇게 id 2번의 내용이 바뀐것을 알수 있습니다!!!

728x90

댓글