포트폴리오/SPRINGBOOT 옛날

2-04 : Entity

서버관리자 페페 2022. 9. 27. 20:35

단 하나의 맥락

: 필요한 자료가 담길 박스(테이블) 만들기

 


 

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