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 |