Hello

게시글 작성 완료

by 볼빵빵오춘기

board2save.html

  • input에 name이 정의되어있어야 서버쪽으로 값이 넘겨갈 수 있다.
  • js나 비동기방식으로 보내는 방식도 있긴하지만 form태그에 넣어서 보낼때 input에 name이 정의되어있어야한다.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>board2save</title>
</head>
<body>
    <!-- action속성: 목적지(서버주소), method속성: http request method(get, post) -->
    <form action="/board2/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: <br>
        <textarea name="boardContents" cols="30" rows="10"></textarea> <br>

        <input type="submit" value="글작성">
    </form>
</body>
</html>

 

Board2Controller

받아온 정보를 받기 위해서는 @RequestParam을 이용하여 input의 name을 받아올 수 있지만 받아올 input이 많다면 계속해서 @RequestParam것은 불편하므로 DTO를 만들러 간다. 

@PostMapping("/save")
public String save(){
    return "index";
}

 

Board2DTO

  • 게시글 작성시간은 보편적으로 쓰지만 수정시간은 보편적으로 쓰진 않는다.
  • DTO정의 시 input의 name과 필드값이 동일하다면 spring이 알아서 담아준다. 
package com.example.member2.dto;
import java.time.LocalDateTime;
import lombok.*;

// DTO(Data Transfer Object), VO, Bean, Entity
@Getter
@Setter
@ToString
@NoArgsConstructor // 기본생성자
@AllArgsConstructor // 모든 필드를 매개변수로 하는 생성자
public class Board2DTO {

    private Long id; // PK
    private String boardWriter; // 작성자
    private String boardPass; // 비밀번호
    private String boardTitle; // 제목
    private String boardContents; // 내용
    private int boardHits; // 조회수
    private LocalDateTime boardCreatedTime; // 게시글 작성시간
    private LocalDateTime boardUpdatedTime; // 게시글 수정시간

}

 

Board2Entity

  • 스프링데이터 jpa와 사용되면서 Entity 하나가 테이블을 구성해주는 객체를 하게된다.
  • Entity는 jpa에서만 쓰여지는 건 아니지만 jpa에서는 필수다.
package com.example.member2.entity;

import com.example.member2.dto.Board2DTO;
import lombok.*;
import javax.persistence.*;

// DB의 테이블 역할을 하는 클래스
@Entity
@Getter
@Setter
@Table(name = "board_table")
public class Board2Entity {
    @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 Board2Entity toSaveEntity(Board2DTO board2DTO){
        Board2Entity board2Entity = new Board2Entity();
        board2Entity.setBoardWriter(board2DTO.getBoardWriter());
        board2Entity.setBoardPass(board2DTO.getBoardPass());
        board2Entity.setBoardTitle(board2DTO.getBoardTitle());
        board2Entity.setBoardContents(board2DTO.getBoardContents());
        board2Entity.setBoardHits(0);

        return board2Entity;

    }

}

 

BaseEntity

Board2DTO 를 보면 현재시간과 수정시간을 정의했는데 이런 시간에 관련된 것들은 별도로 빼서 구분을 하고자 한다. 

package com.example.member2.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 // 생성됐을 때 시(insert 일 때)
    @Column(updatable = false) // 수정시에는 No관여
    private LocalDateTime createdTime;

    @UpdateTimestamp // 수정됐을 때 (update일 때)
    @Column(insertable = false)
    private LocalDateTime updatedTime;
}

 

Board2Entity

BaseEntity을 상속한다.

public class Board2Entity extends BaseEntity{}

 

Board2Repository

package com.example.member2.repository;

import com.example.member2.entity.Board2Entity;
import org.springframework.data.jpa.repository.JpaRepository;

public interface Board2Repository  extends JpaRepository<Board2Entity, Long> {

}

 

Board2Controller

  • Board2Service DI
  • save() 메소드에 매개변수board2DTO를 넣어준다. 
//	... 내용 ....
		@Autowired
    private final Board2Service board2Service;
//	... 내용 ....


		@PostMapping("/save")
    public String save(@ModelAttribute Board2DTO board2DTO){
				board2Service.save(board2DTO);
        return "index";
    }

 

Board2Service

DTO → Entity로 바꿔서 Repostitory로 넘겨 주거나 Entity → DTo로 바꿔서 Controller로 넘겨주는데 이 변환작업을 메소드를 이용해 Service에서 진행한다. 

why? jpa특성인데 entity같은 경우 DB와 직접적으로 연결이 되어있다. 따라서 view단에 이것을 직접적으로 노출시키지 말자라는 취지다. 그러므로 entity클래스는 servic단에서까지만 오도록 코드를 작성하는 경우가 많다. 

@Service
@RequiredArgsConstructor
public class Board2Service {

    private  final Board2Repository board2Repository;

    public void save(Board2DTO boardDTO) {
        Board2Entity board2Entity = Board2Entity.toSaveEntity(boardDTO);
        board2Repository.save(board2Entity);
    }
}

 

Board2Entity

public static Board2Entity toSaveEntity(Board2DTO board2DTO){
    Board2Entity board2Entity = new Board2Entity();
    board2Entity.setBoardWriter(board2DTO.getBoardWriter());
    board2Entity.setBoardPass(board2DTO.getBoardPass());
    board2Entity.setBoardTitle(board2DTO.getBoardTitle());
    board2Entity.setBoardContents(board2DTO.getBoardContents());
    board2Entity.setBoardHits(0);

    return board2Entity;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기