Project/DARLING

2. Entity

package so.ego.re_darling.domains.coupon.domain;

import lombok.*;

import javax.persistence.*;
import java.time.LocalDateTime;

@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "coupon")
@Entity
public class Coupon {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @NonNull private String title;
  private String content;
  private LocalDateTime useDate;

  @Enumerated(value = EnumType.STRING)
  private CouponStatus status;

  @Builder
  public Coupon(@NonNull String title, String content, LocalDateTime useDate, CouponStatus status) {
    this.title = title;
    this.content = content;
    this.useDate = useDate;
    this.status = status;
  }
}

- Entity class의 필드의 접근제어자는 안전하게 private 으로 설정한다.

- Entity는 DB 테이블에 존재하는 Column들을 필드로 가지는 객체이다. ( DB의 테이블과 1대1로 대응된다. )

 

1. @AllArgsConstructor

- NotNull이나 final 이 붙은 필드도 생성자를 만들어준다.

- 클래스에 존재하는 모든 필드에 대한 생성자를 자동으로 생성해준다.

- @NonNull 이 있다면 생성자 내에서 null-check 로직을 자동적으로 생성해준다.

 

2. @NoArgsConstructor

- 파라미터가 없는 생성자를 생성한다.

- Entity 는 반드시 파라미터가 없는 생성자가 있어야 하고 public이나 protected여야 한다. (access 걸어준 이유)

- JpaRepository에서 사용하기 위해 기본 생성자를 만들어준다.

 

3. @NonNull

- NotNull 인 필드에 SQL 쿼리를 보내기 전에 미리 예외를 발생시키기 위해 적용

 

4. @Enumerated

- EnumType.STRING 을 사용하면 enum 타입 그대로 DB에 저장된다.

- EnumType.ORDINAL 을 사용하면 enum 타입 의 순서를 DB에 저장한다. (비추)

 

5. @Builder

Setter를 사용하게 되면 Entity의 인스턴스 값들이 언제 어디서 변경되는지 명확하게 알 수 없다.

그렇다고 해서 생성자로 필드에 값을 넣어주는것 또한 위험하다 (현재 넣는 값이 어떤 필드의 값인지 알 수 없다.)

따라서 Builder 패턴을 사용하는 것이 좋다.

필드가 많아지더라도 어떤 값을 어떤 필드에 넣는지 코드를 통해 확인할 수 있다.

 

 

 

 

프로젝트를 수정 하면서
지속적으로 추가/수정 발생할 예정!

 

'Project > DARLING' 카테고리의 다른 글

7. CI/CD 계획  (0) 2022.02.09
6. 무엇이 문제일까 ...  (0) 2022.01.25
5. Spring REST Docs 사용  (0) 2022.01.24
4. 연관관계 - OneToMany  (0) 2022.01.23
3. 연관관계 - ManyToOne  (0) 2022.01.23