이전글 보기
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