개발자 jin K

[Spring] Spring boot + JPA + MySQL 게시판 만들기 -2 게시글 조회, 수정, 삭제 본문

java/spring

[Spring] Spring boot + JPA + MySQL 게시판 만들기 -2 게시글 조회, 수정, 삭제

jin K 2021. 6. 11. 11:23
  • 게시글 조회

 

DB에 저장되어있는 글을 게시글로 뿌려주도록 조회기능을 추가한다.

 

list.html에서 boardList라는 정보를 가져오고 출력한다. 따라서 Controller 단에서 DB에서 정보를 가져와 boardList안에 데이터를 담아 토스해주면 된다.

 

  • Controller

 

Model 통해 View에 객체를 전달, 즉 토스해주는 역할이다.

BoardDto 이용해 DB에 저장된 데이터를 List 로 가져온다. 해당 기능의 실제 비즈니스 로직은 역시 이번에도 Service단에서 구현해준다. 만들어진 List를 boardList라는 이름으로 토스해주는 역할만 맡은 것이 사실상 컨트롤러의 전부다.

 

@GetMapping("/")
    public String list(Model model) {
        List<BoardDto> boardDtoList = boardService.getBoardList();
        model.addAttribute("boardList", boardDtoList);
        return "board/list.html";

    }

 

 

  • Service

 

실제 비즈니스 로직을 작성한다.

getBoardList()의 실행 구문을 작성하는 곳이다. DB에 있는 전체 데이터를 가져와서 (findAll) 반복하여 해당 데이터를 파싱하여 BoardDto에 집어넣고 그걸 List화 한다. 그리고 완성된 BoardDto 타입의 List를 돌려준다.

 

@Transactional
    public List<BoardDto> getBoardList() {
        List<Board> boards = boardRepository.findAll();
        List<BoardDto> boardDtoList = new ArrayList<>();

        for (Board board : boards) {
            BoardDto boardDto = BoardDto.builder()
                    .id(board.getId())
                    .title(board.getTitle())
                    .content(board.getContent())
                    .writer(board.getWriter())
                    .createdDate(board.getCreatedDate())
                    .build();
            boardDtoList.add(boardDto);
        }
        return boardDtoList;
    }

 

 

스프링 부트를 재기동 하면 이제 메인 화면에 (/) 글 목록이 뿌려진다

 

 


 

  • 게시글 보기 화면 (detail 페이지)

 

list.html의 소스에 보면

 

<a th:href="@{'/post/' + ${board.id}}">

 

부분에서 알 수 있듯이 각 게시글의 id를 받아서 해당 게시글의 상세 페이지로 이동하게 한다.

 

즉 각 게시물 클릭시 'post/{id}' 값으로 GET 요청을 해준다.

 

 

//컨트롤러 단

@GetMapping("/post/{id}")
public String detail(@PathVariable("id") Long id, Model model) {
  BoardDto boardDto = boardService.getPost(id);

  model.addAttribute("boardDto", boardDto);
  return "board/detail.html";
}

 

 

//서비스 단

@Transactional
    public BoardDto getPost(Long id) {
        Optional<Board> boardWrapper = boardRepository.findById(id);
        Board board = boardWrapper.get();
       
        BoardDto boardDto = BoardDto.builder()
                .id(board.getId())
                .title(board.getTitle())
                .content(board.getContent())
                .writer(board.getWriter())
                .createdDate(board.getCreatedDate())
                .build();
       
        return boardDto;
    }

 

 

이까지 쓰고 실행했는데 타임리프 오류가 난다.. ^^

 

2021-06-08 14:27:02.066 ERROR 74619 --- [nio-8080-exec-2] org.thymeleaf.TemplateEngine            : [THYMELEAF][http-nio-8080-exec-2] Exception processing template "board/detail.html": Could not parse as expression: "${boardDto.title" (template: "board/detail.html" - line 8, col 9)


org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression: "${boardDto.title" (template: "board/detail.html" - line 8, col 9)
at ...

 

 

딱봐도 오타다 저부분 고쳐주고 재컴파일 한다.

 

 

자잘한 오타들을 고쳐주고 (이래서 html 파일은 직접 치는게 아니라 복붙 해야하거늘,,,)

그래도 안되길래 잠깐 디버거만 찍어줘서 모델 뭐 들어오는지 봤더니 값 다 들어오길래 캐시 리셋하고 다시 클릭했더니 위와 같은 화면이 잘 나온다..

 

ㅜㅜ

 

왜 하나를 하는데 이렇게 힘든 것인가 원래 이런 것인가 잠깐 현자타임을 가지고...

 

 

  • 게시글 수정

 

게시글 수정은 detail.html에서 수정 버튼을 누르면 'post/edit/{id}'로 요청을 보내며 디테일 페이지와 마찬가지로 id 값을 받아서 처리한다.

 

수정창 처음 화면은 수정할 글자 내용이 있어야 하므로 detail 페이지 만들때 썼던 getPost 메소드를 재 사용한다.

 

@GetMapping("/post/edit/{id}")
public String edit(@PathVariable("id") Long id, Model model) {
    BoardDto boardDto = boardService.getPost(id);

    model.addAttribute("boardDto", boardDto);
    return "board/update.html";

}

 

 

이번엔 textarea로 이렇게 값을 수정할 수 있는 화면으로 이동이 된다.

 

이제 수정 버튼 누르면 DB에 바꾼 값으로 업데이트 시켜 줘야 한다.

 

//컨트롤러 단

 

@PostMapping("/post/edit/{id}")
    public String update(BoardDto boardDto) {
        boardService.savePost(boardDto);
        return "redirect:/";
    }

 

 

수정 잘 된다.

 

  • 게시글 삭제

 

detail.html에서 삭제 누를시 '/post/{id}' 값으로 삭제 요청을 한다.

deletePost 사용해 게시글 id에 맞는 DB 값을 삭제한다.

 

//컨트롤러단

@PostMapping("/post/{id}")
    public String delete(@PathVariable("id") Long id) {
        boardService.deletePost(id);

        return "redirect:/";
    }

 

//서비스단

@Transactional
    public void deletePost(Long id) {
        boardRepository.deleteById(id);
    }

 

확실히 JPA를 써서 마이바티스와는 달리 DB에 접속하고 쿼리 날리는 것이 매우매우매우매우 간편하다는 것을 알 수 있다.

 

삭제도 잘 된다.

 

삭제가 되었습니다 라는 페이지 하나라도 띄워줄걸 그랬다. 리다이렉트 그냥 해버리니 딱히 알림창도 뜨지않고 깔끔하게 삭제가 되었다.

사실 실무에선 delete 쿼리 날릴일도 거의 없고 써보지도 않아서 이렇게 간단하게 delete 메소드를 만든다고? 하며 새삼 놀라움을 느끼고 있다... 처음 배울 땐 몰랐지...

 

데이터가 있는건 괜찮은데 없으면 문제다.

아 물론 없어야할 데이터가 있어도 문제다.

데이터의 정합성은 수없이 말해도 중요하다...

 

아무튼 게시판 기본 조작 기능인 조회, 수정, 삭제 까지 해보았다.