엔티티(Entity) (2-04)

seheeee_97·2023년 11월 22일

스프링부트

목록 보기
4/20

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

모델, 도메인 모델이라고 부르기도 함

sbb-mission 기준으로 설명

  • 질문 엔티티

import java.time.LocalDateTime;

import jakarta.persistence.*;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Entity		//엔티티로 만들기 위해 @Entity 애너테이션 적용
public class Question {
    @Id		//기본키로 지정
    @GeneratedValue(strategy = GenerationType.IDENTITY)	//데이터를 저장할 때 1씩 자동 증가
    private Integer id;
	
    //컬럼의 세부 설정
    @Column(length = 200)	//length는 컬럼의 길이 설정
    private String subject;

    @Column(columnDefinition = "TEXT")	//컬럼의 속성을 정의(TEXT=글자수를 제한할 수 없는 경우)
    private String content;

    private LocalDateTime createDate;
}

@GeneratedValue(strategy = GenerationType.IDENTITY)
  • strategy : 고유번호를 생성하는 옵션
    GenerationType.IDENTITY : 해당 컬럼만의 독립적인 시퀀스를 생성하여 번호를 증가시킬 때 사용
    strategy 옵션을 생략할 경우 @GeneratedValue 애너테이션이 지정된 컬럼들이 모두 동일한 시퀀스로 번호를 생성하기 때문에 일정한 순서의 고유번호를 가질수 없게 됨.

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

  • 답변 엔티티
import jakarta.persistence.ManyToOne;

//생략
	
    @ManyToOne
    private Question question;	//답변 엔티티에서 질문 엔티티를 참조하기 위함
  • 답변 객체를 통해 질문 객체의 제목을 얻으려면 answer.getQuestion().getSubject()처럼 접근
    이렇게 사용하려면 엔티티가 연결된 속성이라는 것을 명시적으로 표시해야 함.

  • 답변 N : 질문 1 = ManyToOne = N:1
    Question(질문) = 부모
    Answer(답변) = 자식


-> 이렇게 되면 질문 엔티티에도 추가 필요

//생략

@OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE)		//mappedBy는 참조 엔티티의 속성명
//cascade=질문을 삭제하면 그에 달린 답변들도 모두 함께 삭제
    private List<Answer> answersList;	//Answer 엔티티 객체로 구성된 answerList를 속성으로 추가
  • 질문 객체에서 답변을 참조하려면 question.getAnswerList()를 호출

업로드중..

0개의 댓글