Entity는 실체, 객체라는 의미를 가지며 업무에 필요하고 유용한 정보를 저장하고 관리하기 위한 집합적인 것이다. 파일시스템이나 데이터베이스에서의 레코드가 개체에 해당한다.
ex) User엔티티의 경우 id, 이름, 이메일 등의 정보를 갖는다.
@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(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의 경우는 테이블 생성 이후 데이터 추가 및 업데이트 할때도 적용이 가능하여 해당 설정은 애플리케이션 내에서 동작하는 것으로 보인다.
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에는 3가지 타입이 존재한다. DATE, TIME, TIMESTAMP가 존재한다.
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Transient annotatoin을 붙이면 해당 변수는 DB와 상관없이 객체의 데이터로 쓸 수 있게된다.
@Transient
private String testData;