단 하나의 맥락
: 필요한 자료가 담길 박스(테이블) 만들기
Semiflow Bundle
: 필요한 데이터(속성) 구상
: 질문 / 답변 entity 작성
: entity간의 참조
: 정상 생성되었나 h2-console에서의 체크
자각
: Entity에 사용되는 어노테이션 플러그인들은 import javax.persistence.에 있다
: 시간은 별도로 import java.time.LocalDateTime; 을 사용한다
: 접근제어자는 'private'를 사용한다
: 자동 객체 생성을 위해 import lombok.Setter/Getter 를 사용한다
: A > Q 참조는 @ManyToOne(역시 persistence 플러그인) 하나로 충분
: Q > A 참조는 "import java.util.List;" + "@OneToMany" + "mappedBy = " + "Cascade = CascadeType.REMOVE" 4가지 필요
-
필요한 data 구상
id | 질문의 고유 번호 |
subject | 질문의 제목 |
content | 질문의 내용 |
create_date | 질문을 작성한 일시 |
Question
id | 답변의 고유 번호 |
question | 질문 (어떤 질문의 답변인지 알아야하므로 질문 속성이 필요하다) |
content | 답변의 내용 |
create_date | 답변을 작성한 일시 |
Answer
-
Question Entity 작성
package com.mysite.sbb;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
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;
}
- @Entity 어노테이션을 적용하여 JPA가 Entity로 인식하게 한 후
- 속성들을 만들었다
- 그리고 필요한 @를 붙임
@Id | primary key 지정 | |
@GeneratedValue | 자동 1씩 증가 저장 | strategy는 고유번호를 생성하는 옵션으로 GenerationType.IDENTITY는 해당 컬럼만의 독립적인 시퀀스를 생성하여 번호를 증가시킬 때 사용 |
@Column | 컬럼의 세부 설정을 위해 @Column 애너테이션을 사용한다 | columnDefinition = "TEXT"은 "내용"처럼 글자 수를 제한할 수 없는 경우에 사용한다. |
-
Answer Entity 생성
(... 생략 ...)
import javax.persistence.ManyToOne;
(... 생략 ...)
@Getter
@Setter
@Entity
public class Answer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(columnDefinition = "TEXT")
private String content;
@CreatedDate
private LocalDateTime createDate;
@ManyToOne
private Question question;
}
-
부모 - 자식 참조
@ManyToOne
답변 객체(예:answer)를 통해 질문 객체의 제목을 알고 싶다면 answer.getQuestion().getSubject()처럼 접근할 수 있다.
하지만 이렇게 속성만 추가하면 안되고 질문 엔티티와 연결된 속성이라는 것을 명시적으로 표시해야 한다.
이렇게 @ManyToOne 애너테이션을 설정하면 Answer 엔티티의 question 속성과 Question 엔티티가 서로 연결된다.
(실제 데이터베이스에서는 ForeignKey 관계가 생성된다.)
package com.mysite.sbb;
import java.time.LocalDateTime;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
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;
}
Answer 엔티티 객체로 구성된 answerList를 속성으로 추가하고 @OneToMany 애너테이션을 설정했다.
이제 질문 객체(예:question)에서 답변을 참조하려면 question.getAnswerList()를 호출하면 된다.
@OneToMany 애너테이션에 사용된 mappedBy는 참조 엔티티의 속성명을 의미한다.
즉, Answer 엔티티에서 Question 엔티티를 참조한 속성명 question을 mappedBy에 전달해야 한다.
-
정상 생성 확인
'포트폴리오 > SPRINGBOOT 옛날' 카테고리의 다른 글
2-07 : template (3) | 2022.09.30 |
---|---|
2-05 : repository (6) | 2022.09.29 |
2-03 : ORM / JPA / H2-DB / JPA 셋팅 (4) | 2022.09.27 |
2-02 : Controller (0) | 2022.09.27 |
2-01 : Structure (0) | 2022.09.25 |