
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 객체의 필드 값을 넘겨준다.