[Spring Boot] 엔티티(Entity) 란?

DANI·2023년 9월 29일
0
post-thumbnail

📝 엔티티(Entity)란?

엔티티는 데이터베이스 테이블과 매핑되는 자바 클래스를 말한다.


📁 엔티티(Entity)속성 구성하기

- Board 엔티티

속성명설명
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 어노테이션



- Answer 엔티티

속성명설명
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라고 할 수 있다.


💻 CMD창에서 실행하기

1. cd [h2.bat파일이 있는 경로] // 위치이동

2. h2.bat // 실행




🚫 application.properties에서 경로를 JDBC URL과 동일하게 변경


😍 테이블이 생성되었다!




0개의 댓글