본문으로 바로가기

이전글 보기

https://aamoos.tistory.com/678

 

[Spring Jpa] 9. 게시판 만들기 - 체크박스 선택삭제 기능 만들기

목표 - 이번장에서 변경하는 부분은 체크박스 선택해서 삭제시 post로 form 전송하는부분, 삭제시 del_yn 플래그를 Y로 업데이트, 이전장에만든 querydsl select 부분에 where절에 del_yn을 Y 조건을 추가하

aamoos.tistory.com

 

목표

- 게시판 글 등록기능을 개발합니다.

 

write.html

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{layout/default_layout}">

<div layout:fragment="content" class="content">
    <form th:action th:object="${form}" method="post">
        <article>
            <div class="container" role="main">
                <div class="mb-3">
                    <label for="boardTitle">제목</label>
                    <input type="text" class="form-control" id="boardTitle" name="title" placeholder="제목을 입력해 주세요">
                </div>
                <br>
                <div class="mb-3">
                    <label for="reg_id">작성자</label>
                    <input type="text" class="form-control" id="reg_id" name="regId"  value="관리자" readonly>
                </div>
                <br>
                <div class="mb-3">
                    <label for="boardContent">내용</label>
                    <textarea class="form-control" rows="5" id="boardContent" name="content" placeholder="내용을 입력해 주세요"></textarea>
                </div>
                <br>
                <br>
                <div>
                    <button type="submit" class="btn btn-sm btn-primary" id="btnSave">저장</button>
                    <button onclick="location.href='/'" type="button" class="btn btn-sm btn-primary" id="btnList">목록</button>
                </div>
            </div>
        </article>
    </form>
</div>
</html>

<script>
</script>

 

BoardController.java

package jpa.board.controller;

import jpa.board.dto.BoardDto;
import jpa.board.entity.Board;
import jpa.board.repository.BoardRepository;
import jpa.board.repository.CustomBoardRepository;
import jpa.board.service.BoardService;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.List;

/**
 * packageName    : jpa.board.controller
 * fileName       : BoardController
 * author         : 김재성
 * date           : 2022-08-01
 * description    :
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2022-08-01        김재성       최초 생성
 */
@Controller
@RequiredArgsConstructor
public class BoardController {

    private final CustomBoardRepository customBoardRepository;
    private final BoardService boardService;

    /**
    * @methodName : list
    * @date : 2022-08-02 오후 2:07
    * @author : 김재성
    * @Description: 게시판 목록화면
    **/
    @GetMapping("/")
    public String list(String searchVal, Pageable pageable, Model model){
        Page<BoardDto> results = customBoardRepository.selectBoardList(searchVal, pageable);
        model.addAttribute("list", results);
        model.addAttribute("maxPage", 5);
        model.addAttribute("searchVal", searchVal);

        pageModelPut(results, model);
        return "board/list";
    }

    /**
    * @methodName : pageModelPut
    * @date : 2022-08-02 오후 4:36
    * @author : 김재성
    * @Description: pagenation 관련 값 model 넣기
    **/
    private void pageModelPut(Page<BoardDto> results, Model model){
        model.addAttribute("totalCount", results.getTotalElements());
        model.addAttribute("size",  results.getPageable().getPageSize());
        model.addAttribute("number",  results.getPageable().getPageNumber());
    }

    /**
    * @methodName : write
    * @date : 2022-08-02 오후 2:07
    * @author : 김재성
    * @Description: 게시판 글쓰기화면
    **/
    @GetMapping("/write")
    public String write(Model model){
        model.addAttribute("form", new BoardDto());
        return "board/write";
    }

    /**
    * @methodName : save
    * @date : 2022-08-03 오후 2:15
    * @author : 김재성
    * @Description: 게시판 글 등록
    **/
    @PostMapping("/write")
    public String save(BoardDto boardDto){
        boardService.saveBoard(boardDto);
        return "redirect:/";
    }

    /**
    * @methodName : update
    * @date : 2022-08-02 오후 2:07
    * @author : 김재성
    * @Description: 게시판 수정화면
    **/
    @GetMapping("/update")
    public String update(){
        return "board/update";
    }

    @PostMapping("/delete")
    public String delete(@RequestParam List<String> boardIds){

        for(int i=0; i<boardIds.size(); i++){
            Long id = Long.valueOf(boardIds.get(i));
            boardService.deleteBoard(id);
        }

        return "redirect:/";
    }
}

 

BoardService.java

package jpa.board.service;

import jpa.board.dto.BoardDto;
import jpa.board.entity.Board;
import jpa.board.entity.Member;
import jpa.board.repository.BoardRepository;
import jpa.board.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * packageName    : jpa.board.service
 * fileName       : BoardService
 * author         : 김재성
 * date           : 2022-08-03
 * description    :
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2022-08-03        김재성       최초 생성
 */

@Service
@RequiredArgsConstructor
public class BoardService {

    private final BoardRepository boardRepository;
    private final MemberRepository memberRepository;

    /**
     * @methodName : saveBoard
     * @date : 2022-08-03 오후 2:13
     * @author : 김재성
     * @Description: 글등록
     **/
    @Transactional
    public Long saveBoard(BoardDto boardDto){
        List<Member> memberList = memberRepository.findAll();
        Member member = memberList.get(0);
        Board board = null;

        //insert
        if(boardDto.getId() == null){
            board = boardDto.toEntity(member);
            boardRepository.save(board);
        }

        //update
        else{
            board = boardRepository.findById(boardDto.getId()).get();
            board.update(boardDto.getTitle(), boardDto.getContent());
        }

        return board.getId();
    }

    /**
    * @methodName : deleteBoard
    * @date : 2022-08-03 오후 2:14
    * @author : 김재성
    * @Description: 글 삭제
    **/
    @Transactional
    public Board deleteBoard(Long id){
        Board board = boardRepository.findById(id).get();

        //플래그값이 Y이면 논리삭제
        board.delete("Y");
        return board;
    }

}

 

Board.java

package jpa.board.entity;

import jpa.board.dto.BoardDto;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.time.LocalDateTime;

/**
 * packageName    : jpa.board.entity
 * fileName       : Board
 * author         : 김재성
 * date           : 2022-08-01
 * description    :
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2022-08-01        김재성       최초 생성
 */

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@EntityListeners(AuditingEntityListener.class)
public class Board {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "board_id")
    private Long id;            //번호

    private String title;       //제목
    private String content;     //내용

    @CreatedDate
    private LocalDateTime regDate;     //등록 날짜

    @LastModifiedDate
    private LocalDateTime uptDate;     //수정 날짜

    private Long viewCount;     //조회수
    private String delYn;       //삭제여부

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member;

    public Board update(String title, String content){
        this.title = title;
        this.content = content;
        return this;
    }

    public Board delete(String delYn){
        this.delYn = delYn;
        return this;
    }

    @Builder
    public Board(BoardDto boardDto, Member member){
        this.title = boardDto.getTitle();
        this.content = boardDto.getContent();
        this.viewCount = 0L;
        this.delYn = "N";
        this.member = member;
    }

}
- 빌더패턴에 title, content로 넘어왔던 항목들을 dto로 넘어오게 수정을 하였습니다. 해당 소스로 바꾸면 빌더 패턴 쓰는 부분중에 에러가 나는 부분이 생기는데, 해당 부분을 String을 직접받는 형식에서 dto로 받는 식으로 변경하면 됩니다.

 

결과화면

 

 

 

- 정상적으로 글이 등록되었습니다. 다음장에는 @Valid를 사용하여 유효성체크를 개발해보겠습니다.

 

다음글보기

https://aamoos.tistory.com/680 

 

[Spring Jpa] 11. 게시판 만들기 - 유효성 검증, @Valid 사용해보기

목표 - 간단하게 글등록시 필수항목 영역(타이틀)을 입력하지않으면 화면에 메시지를 표출합니다. Validation 설정방법 https://aamoos.tistory.com/662 타임리프 유효성체크 build.gradle implementation 'org.sp..

aamoos.tistory.com