스프링 부트 board 설계

Kim taegwan·2026년 4월 30일
post-thumbnail
package com.tenco.blog.board;


import com.tenco.blog.user.User;
import com.tenco.blog.util.MyDateUtil;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;

import java.sql.Timestamp;

@Data // get,set, toString ..
// @Entity -JPA가 이 클래스를 데이터베이스 테이블과 매핑하는 객체로 인식하게 설정
// 즉, 이 어노테이션이 있어야 JPA가 관리 함
@Entity
@Table(name = "board_tb")
@NoArgsConstructor // 기본 생성자 (필수)
@AllArgsConstructor // 전체 멤버 변수를 넣을 수 있는 생성자.
@Builder // 빌더 패턴
public class Board {

    // @id : 이 필드가 기본키임을 설정 함
    @Id
    // IDENTITY 전략: 데이터베이스에 기본 AUTO_INCREMENT 기능 사용
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    //private
    private String username;
    private String title;
    private String content;
    // 연관관계 설정 해주어야 한다.
    // 다대일 연관관계 : 여러개 게시글이 하나의 사용자에게 속한다.
    // FetchType 전략 : EAGER, LAZY
    // EAGER - 조회시 한버너에 다 들고 와라 (1번 게시글 조회시 한번 조인까지 해라)
    // LAZY - 처음부터 Board 조회할때 User 정보를 가져오지 마. 필요할때 한번 더 조회해
    @ManyToOne(fetch = FetchType.LAZY)
    // @One

    @JoinColumn(name = "user_id") // 외래키 컬럼명 표시 됨
    private User user;
    //CreationTimestamp: 하이버네이트가 제
    // 특정 하나의 엔티티가 저장이 될 때 현재 시간을 자동으로 저장해 설정
    // now 명시할 필요 없음
    @CreationTimestamp
    private Timestamp createdAt;

    public String getTime() {
        return MyDateUtil.timestampFormat(createdAt);
    }

    // 수정 편의 기능 만들기
    public void update(BoardRequest.UpdateDTO updateDTO) {
//        this.username = updateDTO.getUsername();
        this.title = updateDTO.getTitle();
        this.content = updateDTO.getContent();
    }

    // 더티체킹 - 변경 감지 동작 과정
    // 1. 최초 조회시 영속성 컨텍스트 1차 캐시에 데이터를 스냅샷으로 보관 함.
    // 2. 영속화된 엔티티가 (board)의 멤버 변수값이 변경이 된다면
    //   1차에서 보관했던 값과 2차에서 수정된 필드값을 비교 함.
    // 3. 변화가 발생이 되었다면 트랜잭션 커밋 시점에 변경된 필드만 update 쿼리 자동으로 생성
    // 4. 물리적인 DB에 반영 됨.


    // createdAt -> 포맷 하는 메서드 만들어 보기
    //테스트 코드

}
@Data

@Entity 어노테이션을 적으면 이 클래스는 JPA가 관리하는 엔티티가 되고, 필드들이 DB 테이블의 컬럼과 매핑된다. 그리고 ddl-auto 설정이 create나 update라면 실행 시 엔티티 구조를 기준으로 DB 테이블 구조가 생성되거나 수정될 수 있다.

@NoArgsConstructor // 기본 생성자 (필수)
생성자를 자동으로 만들어 준다.
@AllArgsConstructor // 전체 멤버 변수를 넣을 수 있는 생성자.
클래스 안에 있는 모든 멤버 변수를 매개변수로 받는 생성자가 자동으로 만들어진다.

 // 편의 기능 - 게시글 소유자 확인을 위한 기능 추가
    public boolean isOwner(Integer sessionUserId) {
        if(!this.user.getId().equals(sessionUserId)) {
            throw new Exception403("본인이 작성한 게시글이 아닙니다");
        }
        return true;
    }

integer 객체가 들어오면 그 게시글 작성자 user객체의 id와 integer 객체와 비교해서 본인이 작성한 게시글인지 확인을 한다.
this.user안에는 serviec단에 있는 Board boardEntity = findById(id); 이런 메서드가 있다 여기서
Board 객체의 필드 값을 넘겨준다.

0개의 댓글