[점프 투 스프링부트] 2-04 엔티티

dwkim·2023년 3월 29일
0

엔티티(Entity)

데이터베이스 테이블과 매핑되는 자바 클래스

  • 모델 또는 도메인 모델이라고 부르기도 한다.
  • @Entity 애너테이션을 적용해야 JPA가 엔티티로 인식한다.

질문 엔티티 작성하기

package com.mysite.sbb;

import java.time.LocalDateTime;
import java.util.List;

import jakarta.persistence.*;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Entity
public class Question {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    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;
}

@Id

해당 속성을 기본 키로 지정

  • 기본 키로 지정하면 이제 id 속성의 값은 데이터베이스에 저장할 때 동일한 값으로 저장할 수 없다.
    • 데이터베이스에서는 id와 같은 특징을 가진 속성을 기본 키(primary key)라고 한다.

@GeneratedValue

데이터를 저장할 때 해당 속성에 값을 따로 세팅하지 않아도 1씩 자동으로 증가하여 저장됨

strategy : 고유번호를 생성하는 옵션
GenerationType.IDENTITY : 해당 컬럼만의 독립적인 시퀀스를 생성하여 번호를 증가시킬 때 사용

  • strategy 옵션을 생략할 경우, @GeneratedValue 애너테이션이 지정된 컬럼들이 모두 동일한 시퀀스로 번호를 생성하기 때문에 일정한 순서의 고유번호를 가질수 없게 된다. 이러한 이유로 보통 GenerationType.IDENTITY를 많이 사용한다.

@Column

엔티티의 속성은 테이블의 컬럼명과 일치하는데 컬럼의 세부 설정을 위해 @Column 애너테이션을 사용.

length : 컬럼의 길이를 설정할때 사용
columnDefinition : 컬럼의 속성을 정의할 때 사용
columnDefinition = "TEXT" : 글자 수를 제한할 수 없는 경우에 사용

  • 엔티티의 속성은 @Column 애너테이션을 사용하지 않더라도 테이블 컬럼으로 인식한다. 테이블 컬럼으로 인식하고 싶지 않은 경우에만 @Transient 애너테이션을 사용한다.



답변 엔티티 생성하기

package com.mysite.sbb;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;

@Getter
@Setter
@Entity
public class Answer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private  Integer id;

    @Column(columnDefinition = "TEXT")
    private String content;

    private LocalDateTime createDate;

	@ManyToOne
    private Question question;
}

question 속성은 답변 엔티티에서 질문 엔티티를 참조하기 위해 추가됨.

질문 엔티티와 연결된 속성이라는 것을 명시적으로 표시하기 위해
question 속성에 @ManyToOne 애너테이션을 추가해야 함

@ManyToOne

N:1 관계
부모 자식 관계를 갖는 구조에서 사용

  • 답변은 하나의 질문에 여러개가 달릴 수 있는 구조
  • 답변- Many / 질문- One
  • 부모- Question / 자식- Answer
  • @ManyToOne로 Answer 엔티티의 question 속성과 Question 엔티티가 서로 연결됨.
    • 실제 데이터베이스에서는 ForeignKey 관계가 생성


@OneToMany

1:N의 관계

mappedBy = "참조 엔티티의 속성명"
Answer 엔티티(참조 엔티티)에서 Question 엔티티를 참조한 속성명 questionmappedBy에 전달

CascadeType.REMOVE
질문 하나에는 여러개의 답변이 작성될 수 있음. 질문을 삭제하면 그에 달린 답변들도 모두 함께 삭제하기 위해 사용.









출처: https://wikidocs.net/161165

profile
예비 백엔드 개발자

0개의 댓글