[SpringBoot] 엔티티로 테이블 매핑하기

2024. 8. 27. 21:12자바 웹 개발/스프링부트

엔티티란?

엔티티는데이터베이스 테이블과 매핑되는 자바 클래스를 말한다. 질문과 답변을 할 수 있는 게시판을 작성하기 위해서는 질문과 답변 데이터를 제정할 데이터베이스 테이블과 매핑된다. 

 

질문 엔티티 

엔티티를 만들기 위해서는 @Entity로 애너테이션을 적용해야 한다. 

@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;
}

 

@Id : id 속성을 기본키로 지정한다. 각 데이터를 구분하는 값으로 중복될 수 없도록 한다. 

@GeneratedValue : 데이터 저장할 때 값을 입력하지 않아도 자동으로 1씩 증가하도록 저장한다. strategy = GenerationType.IDENTITY는 고유한 번호를 생성하는 방법을 지정하는 부분이다. 해당 속성만 별도로 번호가 차례대로 늘어나도록 사용한다. 

@Column : 열의 세부 설정을 위해 쓰인다. length는 열의 길이를 설정할 때 사용하고, columnDefinition은 열 데이터의 유형이나 성격을 정의할 때 사용한다. 

@Transient : 열로 인식하고 싶지 않을 때 사용한다. 엔티티 속성은 @Column 애너테이션을 사용하지 않더라도 열로 인식한다. 

 

답변 엔티티

질문 엔티티를 참조하기 위해서 question 속성을 추가하였다. 질문 엔티티와 연결된 속성이라는 것을 표시해야만 하는데 이를 위해 @ManyToOne 애너테이션을 추가하였다. 하나의 질문에 답변은 여러개가 달릴 수 있기 때문이다. 데이터베이스에서는 외래키를 이용해 관계를 맺는다. 반대로는 @OneToMany를 사용한다. 

@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;
}
@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> answers;
}

mappedBy는 참조 엔티티의 속성명을 정의한다. mappedBy = "question"이라는 것은 Answer 엔티티 안에 있는 question 필드가 이 관계의 주인이라는 의미입니다. 즉, Answer 엔티티의 question 필드가 외래 키를 가지고 있으며, Question 엔티티는 이 필드를 통해 여러 Answer 엔티티와 연결된다는 뜻이다.

 

cascade = CascadeType.REMOVE는 질문을 삭제하면 답변들도 모두 삭제되도록 한 것이다.