2swan

엔티티 본문

Programming/Spring

엔티티

2swan 2023. 9. 14. 12:38

@Id:

@Id 에너테이션은 id 속성을 기본 키로 지정한다. 기본 키로 지정하면 id 속성의 값은 데이터베이스에 저장할 때 동일한 값으로 저장할 수 없다.

@GeneratedValue:

데이터를 저장할 때 해당 속성에 값을 따로 세팅하지 않아도 1씩 자동으로 증가하여 저장된다. starategt 는 고유번호를 생성하는 옵션으로 GenerationType.IDENTITY는 해당 컬럼만의 독립적인 시퀀스를 생성하여 번호를 증가시킬 때 사용한다.

 

@Column:

컬럼의 세부 설정을 위해 @Column 애너테이션을 사용한다. length는 컬럼의 길이를 설정할때 사용하고 columnDefinition은 컬럼의 속성을 정의할 때 사용한다. columnDefinition = "TEXT"은 글자 수를 제한할 수 없는 경우에 사용한다.

 

테이블의 컬럼명:
createDate처럼 대소문자 형태의 카멜케이스(Camel Case) 이름은 create_date 처럼 모두 소문자로 변경되고 언더바(_)로 단어가 구분되어 실제 테이블 컬럼명이 된다.

 

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

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

    private LocalDateTime createDate;

    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> answerList;
}
@ManyToOne:
답변은 하나의 질문에 여러개가 달릴 수 있는 구조이다 답변은 Many 질문은 One이 된다.
@ManyToOne은 N:1 관계라고 할 수 있다 @ManyToOne 설정하면 Answer 엔티티의 question 속성과 Question 엔티티가 서로 연결된다.(실제 데이터베이스에서는 ForeignKey 관계 생성)
@ManyToOne은 부모 자식 관계를 갖는 구조이며 부모는 Question, 자식은 Answer
반대로 답변과 질문이 N:1의 관계라면 질문과 답변은 1:N의 관계라고 할 수 있다.

@OneToMany:
이런 경우에는 @OneToMany 사용하며 Question 하나에 Answer는 여러개이므로 Question 엔티티에 추가할 답변의 속성은 List 형태로 구성해야 한다.
mapperBy는 참조 엔티티의 속성명을 의미하고 Answer 엔티티에서 Question 엔티티를 참조한 속성명 question을 mappedBy에 전달해야 한다.
CascadeType.REMOVE:
질문 하나에는 여러개의 답변이 작성될 수 있다. 질문을 삭제하면 그에 달린 답변들도 모두 함께 삭제하기 위해서 @OneToMany의 속성으로 cascade = CascadeType.REMOVE를 사용한다.

'Programming > Spring' 카테고리의 다른 글

Model, ModelAndView  (0) 2023.09.19
Repository, @Autowired  (0) 2023.09.14
Spring Boot 프로젝트 구조  (0) 2023.09.14
SpringBoot Tools  (0) 2023.09.14
@Controller, @ResponseBody  (0) 2023.09.14