Digking's cave

SpringBoot 게시판 만들기 프로젝트 (3) - 게시글 작성 후 DB에 게시글 등록하기 본문

Spring/SpringBoot 게시판 프로젝트

SpringBoot 게시판 만들기 프로젝트 (3) - 게시글 작성 후 DB에 게시글 등록하기

디깅 2023. 7. 17. 21:24
728x90

안녕하세요.

오늘은 게시글을 작성하는 서비스를 작성하였습니다.

해당 내용은 유튜브 코딩레시피 강사님의 유튜브 강의를 수강 후 개인적으로 요약정리 하였습니다.

 

index.html

글작성 버튼 생성

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
<button onclick="saveReq()">글작성</button>
<a href="/board/save">글작성(링크)</a>
</body>
<script>
//  function saveReq() {
//
//  }

  const saveReq = () => {
    location.href = "/board/save";
  }


</script>
</html>

 

save.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>save</title>
</head>
<body>
<!-- front 부분은 되도록이면 복사 붙여넣기 해주세요 -->
<!-- action속성: 목적지(서버주소), method속성: http request method(get, post) -->
<form action="/board/save" method="post" enctype="multipart/form-data">
    writer: <input type="text" name="boardWriter"> <br>
    pass: <input type="text" name="boardPass"> <br>
    title: <input type="text" name="boardTitle"> <br>
    contents: <textarea name="boardContents" cols="30" rows="10"></textarea> <br>
    <input type="submit" value="글작성">
</form>
</body>
</html>

- action 속성 : 목적지(서버 주소)

- method 속성 : http request method (get, post)

 

BoardController.java

    @GetMapping("/save")
    public String saveForm() {
        return "save";
    }

    @PostMapping("/save")
    public String save(@ModelAttribute BoardDTO boardDTO) throws IOException {
        System.out.println("boardDTO = " + boardDTO);
        boardService.save(boardDTO);
        return "index";
    }

saveForm()은 버튼을 눌렀을 때, 글 작성 화면으로 이동

save()는 실제로 글을 저장 후 index화면으로 이동

 

BoardDTO.java

- DTO(Data Transfer Object) 데이터 전달하는 객체
- Lombok을 통해 자동으로 get / set을 사용 가능

@Getter
@Setter
@ToString
@NoArgsConstructor // 기본 생성자
@AllArgsConstructor // 모든 필드를 매개변수로 하는 생성자
public class BoardDTO {
    private Long id;
    private String boardWriter;
    private String boardPass;
    private String boardTitle;
    private String boardContents;
    private int boardHits;
    private LocalDateTime boardCreatedTime;
    private LocalDateTime boardUpdatedTime;

    public BoardDTO(Long id, String boardWriter, String boardTitle, int boardHits, LocalDateTime boardCreatedTime) {
        this.id = id;
        this.boardWriter = boardWriter;
        this.boardTitle = boardTitle;
        this.boardHits = boardHits;
        this.boardCreatedTime = boardCreatedTime;
    }

 

BoardEntity.java

package com.testboard.board.entity;

import com.testboard.board.dto.BoardDTO;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.*;

@Entity
@Getter
@Setter
@Table(name = "board_table")
public class BoardEntity extends BaseEntity {
    @Id //pk 컬럼 지정 (필수요소)
    @GeneratedValue(strategy = GenerationType.IDENTITY) // auto-increment
    private Long id;

    @Column(length = 20, nullable = false) // 크기 20, not null
    private String boardWriter;

    @Column // 크기 255, null 가능
    private String boardPass;
    @Column
    private String boardTitle;
    @Column(length = 500)
    private String boardContents;

    @Column
    private int boardHits;

    public static BoardEntity toSaveEntity(BoardDTO boardDTO) {
        BoardEntity boardEntity = new BoardEntity();
        boardEntity.setBoardWriter(boardDTO.getBoardWriter());
        boardEntity.setBoardPass(boardDTO.getBoardPass());
        boardEntity.setBoardTitle(boardDTO.getBoardTitle());
        boardEntity.setBoardContents(boardDTO.getBoardContents());
        boardEntity.setBoardHits(0);
        return boardEntity;
    }
}

toSaveEntity 는 DTO의 값을 Entity로 옮겨담는것

BaseEntity.java

시간 관련 값들은 별도  Entity로 

package com.testboard.board.entity;

import lombok.Getter;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Getter
public class BaseEntity {
    @CreationTimestamp
    @Column(updatable = false)
    private LocalDateTime createdTime;

    @UpdateTimestamp
    @Column(insertable = false)
    private LocalDateTime updatedTime;
}

 

BoardService.java

package com.testboard.board.service;

import com.testboard.board.dto.BoardDTO;
import com.testboard.board.entity.BoardEntity;
import com.testboard.board.repository.BoardRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

// DTO > ENTITY (Entity class)
// ENTITY > DTO (DTO class)
// 변환하는 작업을 주로 service에서 한다

@Service
@RequiredArgsConstructor
public class BoardService {
    private final BoardRepository boardRepository;
    public String save(BoardDTO boardDTO) {
        BoardEntity boardEntity = BoardEntity.toSaveEntity(boardDTO);
        boardRepository.save(boardEntity); // insert문이 실행된다
        return "index";
    }
}

 

반응형