Springboot

Jpa Domain 작성하기

mingkyy 2023. 1. 9. 19:24
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

 - 상위 엔티티에서 하위 엔티티로 모든 작업을 전파 한다.

 

4. ERD