엔티티는 데이터베이스 테이블과 매핑되는 자바 클래스를 말한다.
속성명 | 설명 |
---|---|
id | 게시물의 고유번호 |
subject | 게시물의 제목 |
content | 게시물의 내용 |
create_date | 게시물 작성 일시 |
import java.time.LocalDateTime;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
@Getter
@Setter
@Entity // JPA가 해당클랫를 엔티티로 인식함
public class Question {
@Id // 기본 키로 지정한다(primary key)
@GeneratedValue(strategy = GenerationType.IDENTITY)
// 데이터를 저장할 때 해당 속성에 값을 따로 세팅하지 않아도 1씩 자동으로 증가하여 저장된다.
private Integer id;
@Column(length = 200)
// 칼럼의 길이 설정
private String subject;
@Column(columnDefinition = "TEXT")
// 칼럼의 글자수 제한 없애기
private String content;
private LocalDateTime createDate;
@OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE)
private List<Answer> answerList;
}
@GeneratedValue 애너테이션
데이터를 저장할 때 해당 속성에 값을 따로 세팅하지 않아도 1씩 자동으로 증가하여 저장된다.strategy
는 고유번호를 생성하는 옵션으로GenerationType.IDENTITY
는 해당 컬럼만의 독립적인 시퀀스를 생성하여 번호를 증가시킬 때 사용한다.
strategy 옵션을 생략할 경우에 @GeneratedValue 애너테이션이 지정된 컬럼들이 모두 동일한 시퀀스로 번호를 생성하기 때문에 일정한 순서의 고유번호를 가질수 없게 된다. 이러한 이유로 보통 GenerationType.IDENTITY를 많이 사용한다.
@Column 애너테이션
엔티티의 속성은 테이블의 컬럼명과 일치하는데 컬럼의 세부 설정을 위해 @Column 애너테이션을 사용한다.length
는 컬럼의 길이를 설정할때 사용하고columnDefinition
은 컬럼의 속성을 정의할 때 사용한다. columnDefinition = "TEXT"은 "내용"처럼 글자 수를 제한할 수 없는 경우에 사용한다.
@Transient 애너테이션
엔티티의 속성은 @Column 애너테이션을 사용하지 않더라도 테이블 컬럼으로 인식한다. 테이블 컬럼으로 인식하고 싶지 않은 경우에만 @Transient 애너테이션을 사용한다.
@OneToMany 애너테이션
답변과 질문이 N:1의 관계라면 질문과 답변은 1:N의 관계라고 할 수 있다. 이런경우에 사용한다. Board 하나에 Answer는 여러개이므로 Board 엔티티에 추가할 답변의 속성은 List 형태로 구성해야 한다.mappedBy
는 참조 엔티티의 속성명을 의미한다.CascadeType.REMOVE
게시글을 삭제하면 그에 달린 답변들도 모두 함께 삭제하기 위해서 속성으로 cascade = CascadeType.REMOVE를 사용했다.
작성일시에 해당하는 createDate 속성의 실제 테이블의 컬럼명은 create_date가 된다. 즉 createDate처럼 대소문자 형태의 카멜케이스(Camel Case) 이름은 create_date 처럼 모두 소문자로 변경되고 언더바()로 단어가 구분되어 실제 테이블 컬럼명이 된다._
- @Builder 어노테이션
속성명 | 설명 |
---|---|
id | 답변의 고유번호 |
board | 게시물(어떤 게시물의 답변인지 알아야 함) |
content | 답변의 내용 |
create_date | 답변 작성 일시 |
import java.time.LocalDateTime;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Entity
public class Answer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(columnDefinition = "TEXT")
private String content;
private LocalDateTime createDate;
@ManyToOne // 답변(자식)이 many, 게시글(부모)이 one
private Question question;
}
@ManyToOne 애너테이션
N:1 관계라고 할 수 있다. 이렇게 @ManyToOne 애너테이션을 설정하면 Answer 엔티티의 board속성과 Board 엔티티가 서로 연결된다. (실제 데이터베이스에서는 ForeignKey 관계가 생성된다.) 또한, @ManyToOne은 부모 자식 관계를 갖는 구조에서 사용한다. 여기서 부모는 Question, 자식은 Answer라고 할 수 있다.