Jpa Domain 작성하기
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Getter
@NoArgsConstructor
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String nickname;
@Column(nullable = false)
private String email;
@Enumerated(EnumType.STRING)
MemberType memberType;
@Enumerated(EnumType.STRING)
OAuthType oAuthType;
@OneToMany(mappedBy = "write", cascade = CascadeType.ALL)
private List<Post> posts = new ArrayList<>();
@OneToMany(mappedBy = "reportMember", cascade = CascadeType.ALL)
private List<Report> reports = new ArrayList<>();
@OneToMany(mappedBy = "goodMember", cascade = CascadeType.ALL)
private List<Good> goods = new ArrayList<>();
@OneToMany(mappedBy = "commentWriter", cascade = CascadeType.ALL)
private List<Comment> comments = new ArrayList<>();
@Builder
public Member(String name, String nickname, String email, MemberType memberType,
OAuthType oAuthType, List<Post> posts, List<Report> reports, List<Good> goods, List<Comment> comments) {
this.name = name;
this.nickname = nickname;
this.email = email;
this.memberType = memberType;
this.oAuthType = oAuthType;
this.posts = posts;
this.reports = reports;
this.goods = goods;
this.comments = comments;
}
}
1. 기본 어노테이션
@Entity
- jpa를 사용
- 테이블 생성
@Getter
- 자동으로 생성된 접근자와 설정자 메소드를 사용 할 수 있따
** @Setter은 사용하면 안 된다
-> 객체(엔티티)의 값을 마음대로 변경할 수 있으므로 객체의 일관성을 보장할수 없다.
@NoArgsConstructor
- 파라미터가 없는 기본 생성자를 생성해준다.
@Builder
- 빌더 패턴 사용
** 클래스 위에 어노테이션으로 @Builder 을 사용 했으나 그렇게 사용하려면 @AllArgsConstructor 을 사용하여야 한다.
@AllArgsConstructor
-클래스에 존재하는 모든 필드에 대한 생성자를 자동으로 생성해준다.
- 인스턴스 멤버의 선언순서에 영향을 받기 때문에 순서를 바꾸면 생성자의 입력값 순서도 바뀌게 되어
검출되지 않는 치명적인 오류를 발견 할 수 있기 때문
@Id
@GenerateValue(strategy = GenerationType.IDENTITY)
- Table 의 pk(기본키)
- id값을 따로 할당하지 않아도 DB에서 자동으로 기본키를 생성해준다.
@Column(nullable = false)
- 공백이 되어서는 안 되는 컬럼
@Enumerated(EnumType.SPRING)
public enum MemberType {
GENERAL, MANAGER
}
- spring형식으로 enum 의 값을 넣어줌
- MemberType 이라는 컬럼 안에 spring 형식을 GENERAL, MANAGER 둘중 하나의 값이 들어간다.
2. BaseTimeEntity
- 게시글, 댓글을 등록, 수정할때 시간이 필요하다. 항상 게시글테이블에 생성시간, 수정시간의 컬럼을 생성 하였는데
이번에는 BaseTimeEntity를 상속 받기로 하였다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {
@CreatedDate
private LocalDateTime createDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
@MappedSuperclass
- 공통 매핑 정보가 필요 할때 사용, 부모 클래스에 선언할때 사용한다.
@EntityListeners(AuditingEntityListener.class)
- 엔티티를 DB에 적용하기전, 이후에 이벤트가 발생할때마다 특정 로직을 실행시킬 수 있다.
->entity 에서 이벤트가 발생 할때 -> 게시물을 등록, 수정 한다 -> db에 들어가기 전 등록, 수정 시간 자동 저장!
@CreateDate, LastModifiedDate
- LocalDateTime 사용으로 등록, 수정시 시간이 자동으로 저장된다.
3. ManyToOne, OneTOMany
- 내 DB는 양방향 ManyToOne, OneToMany를 사용 하였다.
- 밑에 예를 보자 한 멤버가 여러개의 게시물을 작성 할 수 있다.
- 그러하여 Member테이블에는 여러개의 게시물이 있는 List<Post>가 있다.
- 한 게시물에 글쓸 수 있는 사람은 한 명 밖에 없다
- 그러하여 Post 테이블에는 Member 한명 밖에 없다
//Member
@OneToMany(mappedBy = "write", cascade = CascadeType.ALL)
private List<Post> posts = new ArrayList<>();
//Post
@ManyToOne
private Member write;
1. mappedBy = "write"
- 양방향이기 때문에 mapping 상대방을 지정 해준다.
2. cascadeType.All
- 상위 엔티티에서 하위 엔티티로 모든 작업을 전파 한다.