package coffee.pastry.joshuablog.model.board;
import java.time.LocalDateTime;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import coffee.pastry.joshuablog.model.love.Love;
import coffee.pastry.joshuablog.model.reply.Reply;
import coffee.pastry.joshuablog.model.user.User;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Table(name = "board_tb")
@Entity
public class Board {
/**
* 1명의 User N개의 게시글 + 1개의 게시글 1명의 User => User:Board=1:N
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@Lob // 4GB
private String content;
@Lob // 4GB
private String thumbnail;
@ManyToOne
private User user;
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
@JsonIgnoreProperties({ "board" }) // 무한참조 방지...드디어...
@OrderBy("id desc")
private List<Reply> replys;
@JsonIgnoreProperties({ "board" }) // 무한참조 방지
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER)
private List<Love> loves;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
@PrePersist
protected void onCreate() {
this.createdAt = LocalDateTime.now();
}
@PreUpdate
protected void onUpdate() {
this.updatedAt = LocalDateTime.now();
}
public void chaengeTitle(String title) {
this.title = title;
}
public void changeContent(String content) {
this.content = content;
}
}
같은 엔티티에 fetch 타입이 EAGER가 2개이상 존재하면 생기는 에러 -> 같은 쿼리에 여러 개의 컬렉션을 EAGER 로딩하는 것을 허용 X
2가지 중에 1개를 LAZY로 바꾸는 것 + join fetch(JPQL fetch join) 사용하기
난 이거 선택
@JsonIgnoreProperties({ "board" }) // 무한참조 방지
@OneToMany(mappedBy = "board")
private List<Love> loves;
서비스 계층에서 필요한 시점에 컬렉션을 로딩하도록
성능 이슈를 피하고 불필요한 쿼리 감소