[Spring JPA] Entity Annotation

SeongWon Oh·2021년 9월 18일
0

Spring Framework

목록 보기
15/33
post-thumbnail

Entity란?

Entity는 실체, 객체라는 의미를 가지며 업무에 필요하고 유용한 정보를 저장하고 관리하기 위한 집합적인 것이다. 파일시스템이나 데이터베이스에서의 레코드가 개체에 해당한다.
ex) User엔티티의 경우 id, 이름, 이메일 등의 정보를 갖는다.

Spring boot에서 Entity사용하기

@Entity, @Id, @GeneratedValue

  • Spring JPA에서는 객체(class)를 entity로 사용하기 위해서는 @Entity annotation을 객체 위에 붙여주고 PK를 지정해주면 된다.
    • @Entity의 속성에는 name속성이 존재한다. 해당 속성은 jpa내부에서 사용할 엔티티의 이름을 정하는 것으로, 기본 값은 클래스 이름이다.
  • entity는 primary key가 꼭 필요하다. 그래서 PK로 사용할 변수 위에는 @Id를 붙여 PK로 지정해줘야한다.
  • @GeneratedValue은 ID의 값을 entity가 생성될 때마다 자동 생성되게 해주는 annotation이다.
@Entity // entity는 primary key가 꼭 필요하다. (@Id로 지정)
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@Data
@Builder
public class User {
    @Id // PK지정
    @GeneratedValue // entity를 만들때 자동으로 순차적으로 생성해줌
    private Long id;

    @NonNull
    private String name;

    @NonNull
    private String email;

    private LocalDateTime createdAt; // 생성된 시간
    private LocalDateTime updatedAt; // 업데이트된 시간

}

🚨 주의사항

  • 엔티티를 사용하기 위해서는 파라미터가 없는 public 또는 protected의 생성자가 필요하다.
  • final, enum, interface, inner클래스는 엔티티로 사용 불가능하다.
  • 엔티티로 사용할 클래스 내부 필드에는 final을 사용하면 안된다.

@Column annotation

  • @Column(name = "") : Entity객체를 사용하여 DB에 저장을 하면 기본적으로 객체에 만들어진 변수명으로 DB column의 이름이 정해진다. 프로그래밍을 하면서 사용하는 변수명과 DB에 저장되는 column명을 다르게 해야하는 상황이 존재하기도 하는데 이러한 경우 @Column annotation에서 name을 설정해주면 된다.

  • @Column(length= ~) : 해당 컬럼 값의 length를 정해주는 annotation이다. (String 타입에만 사용 가능하다.)

  • @Column(nullable = false) : nullable을 false로 해주면 filed가 notNull column으로 설정된다.

  • @Column(unique = true) : 해당 column을 unique로 설정해준다.

    @Table(name = "user", indexes = {@Index(columnList = "name")}, uniqueConstraints = {@UniqueConstraint(columnNames = "email")})
    다음과 같이 table을 사용하여 지정한 unique는 복합 column을 지정할 때 사용한다. (name과 email을 모두 unique하게 하는 복합 column의 예)
    @Column(unique = true)은 단일 column을 unique로 지정할 때 사용

  • @Column(updatable = false) : updatable=false를 하면 해당 column은 update가 불가능하다. (default값은 true)

  • @Column(insertable = false) : insertable=false를 하면 해당 column은 insert가 불가능하다. (default값은 true)

unique, length와 같은 @Column의 속성들은 실제 애플리케이션의 성능에 영향을 주지는 않는다. 해당 테이블을 사용할 때마다 애플리케이션에서 조회하는 것이 아닌 처음 테이블을 생성할 때 ALTER를 통한 제약조건을 DB에 추가할 때만 사용하게 된다.

🚨 주의할 점!!

  • entity column 설정 변경을 할 때 테이블의 기본 세팅값에 변경이 있는
    length(), nullable, name 등의 설정들은 무조건 테이블을 초기 세팅할때만 적용된다.
  • insertable, updatable의 경우는 테이블 생성 이후 데이터 추가 및 업데이트 할때도 적용이 가능하여 해당 설정은 애플리케이션 내에서 동작하는 것으로 보인다.

@Enumerated(value = EnumType.STRING)

  • DB에서는 enum의 값들을 기본적으로 데이터를 0,1,~순으로 값을 저장한다.(default값이 ORDINAL)
  • 아래 Gender를 예시로 들면 DB에 값을 저장하면 MALE은 0, FEMALE은 1로 DB에 저장된다.
  • User객체의 gender를 변수에 @Enumerated를 확인해보면 default값이 ORDINAL인 것을 확인할 수 있다.(STRING이 아니다.)
  • String으로 바꾸려면 @Enumerated(value = EnumType.STRING)으로 변경해줘야한다.

ordinal로 사용하게 된다면 운영 중간에 enum값들이 추가되게 된다면 이전에 값들의 index와 추가된 값의 index가 꼬일 수가 있다. 이런 경우 큰 문제를 유발할 수 있기에 약간의 데이터를 아끼려고 ordinal을 사용하기보다 데이터를 조금 더 쓰더라도 String을 사용해야한다.

Gender.java(Enum)

// enum은 java에서 사용하는 상수 객체이다.
public enum Gender {
    MALE,
    FEMALE
}

User.java

@Entity // entity는 primary key가 꼭 필요하다. (@Id로 지정)
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@Data
@Builder
public class User {
    @Id // PK지정
    @GeneratedValue // entity를 만들때 자동으로 순차적으로 생성해줌
    private Long id;

    @NonNull
    private String name;

    @NonNull
    private String email;

    private LocalDateTime createdAt; // 생성된 시간
    private LocalDateTime updatedAt; // 업데이트된 시간
    
    @Enumerated(value = EnumType.STRING)
    private Gender gender;

}

@Temporal

날짜 타입을 사용하고 싶다면 @Temporal을 사용한다. @Temporal에는 3가지 타입이 존재한다. DATE, TIME, TIMESTAMP가 존재한다.

  • Java8이상에서는 LocalDate, LocalDateTime타입이 지원되기 때문에 @Temporal을 사용하지 않아도 된다.
 @Temporal(TemporalType.TIMESTAMP)
 private Date createdDate;
 
 @Temporal(TemporalType.TIMESTAMP)
 private Date lastModifiedDate;

@Transient

@Transient annotatoin을 붙이면 해당 변수는 DB와 상관없이 객체의 데이터로 쓸 수 있게된다.

    @Transient
    private String testData;


Reference

profile
블로그 이전했습니다. -> https://seongwon.dev/

0개의 댓글