Entity란 무엇인가?
Entity는 Java Persistence API(JPA)에서 데이터베이스 테이블을 객체 지향적으로 표현하는 클래스이다.
즉 데이터베이스의 스키마(schema)를 코드로 매핑하여 데이터베이스와 어플리케이션 간의 데이터 전송을 원활하게 만들어준다.
Entity와 데이터베이스 테이블과의 관계는 다음과 같다.
- 하나의 Entity 클래스는 데이터베이스의 한 테이블과 매핑된다.
- Entity 클래스의 각 변수 필드는 테이블의 열(column)에 해당한다.
- 데이터베이스의 행(row)은 Entity 클래스의 instance object로써 표현된다.
데이터베이스의 구조를 변경할 때 entity 코드의 변경만으로 동기화가 가능하고, JPA 어노테이션을 사용하여 매핑 정보를 명시한다.
이를 데이터베이스와 어플리케이션 간 ORM(Object-Relational Mapping)의 역할을 수행한다고 할 수 있다.
Entity 코드 작성법
먼저 다음 코드는 User entity에 대한 기본적인 예시 코드이다.
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "user")
@Builder
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "login_id", nullable = false, unique = true, length = 30)
private String loginId;
@Column(name="password", nullable = false, length = 30)
private String password;
@Column(name = "nickname", nullable = false, unique = true, length = 15)
private String nickname;
Entity 클래스 작성 시 각 데이터베이스 필드와 매핑되는 변수, 테이블 및 컬럼 정보를 정의해야 한다.
JPA 어노테이션을 사용하여 매핑 정보를 명시하기 때문에 필수적인 어노테이션은 다음과 같다.
- @Entity: 클래스가 JPA Entity임을 명시한다.
- @Table: 데이터베이스에서 매핑될 테이블 이름을 지정. 기본적으로는 클래스 이름과 동일하지만 필요에 따라 변경 가능.
- @Id: 테이블의 기본 키(primary key)를 지정한다.
- @GeneratedValue: 기본 키 생성 전략을 설정(key값 자동 생성 시)
- GenerationType.IDENTITY: 데이터베이스가 자동으로 값을 생성
- GenerationType.SEQUENCE: 데이터베이스의 시퀀스 사용
- GenerationType.AUTO: JPA 구현체가 생성 전략을 결정
Entity 클래스에서 @Column 어노테이션이 붙은 각 변수필드가 데이터베이스 테이블의 column에 매핑된다. 데이터 타입은 Java의 기본 자료형을 사용하며 JPA가 적절한 SQL 데이터 타입으로 변환하여 컬럼에 매핑한다.
기본적인 @Column 어노테이션의 속성은 다음과 같다.
- name: 매핑할 컬럼 이름 지정
- nullable: false로 설정하면 NOT NULL 제약조건이 적용
- unique: true로 설정하면 unique 제약 조건이 적용
- length: 문자열 타입의 컬럼 길이 설정.
또한 각 Column에 제약조건을 설정할 수 있다.
이는 User의 로그인 ID/PW, 닉네임, 이메일 등 필수적으로 입력받아야 하는 요소들에대해 빈 값이 들어오지 않게 한다거나,
특정 필드값에 대해서 길이제한, 입력값 패턴들을 지정하여 들어오는 데이터에 대해 검증을 수행할 수 있다.
Hibernate Validation에서 제공하는 annotation들을 사용하여 entity field에 적용하면 자동으로 validation을 수행한다.
- @NotNull, @NotEmpty, @NotBlank: 이 3가지 어노테이션은 모두 입력 데이터의 null, 공백에 대한 검증이다.
- @NotNull: null 값 허용 X / ""값 허용 / " " 값 허용 -> 오직 null값만 체크
- @NotEmpty: null 값 허용 X / ""값 허용 X / " "값 허용 -> length가 1 이상인 whitespace만 허용
- @NotBlank: null 값 허용 X / ""값 허용 X / " "값 허용 X -> 모든 빈 data 값은 허용하지 않음.
- @Size: 데이터 길이에 대한 검증. min, max 모두 제한을 걸 수 있다.
- @Pattern: regex 데이터 패턴을 지정하여 만족하는 입력만 허용한다.
- @Email: email regex 패턴을 자동으로 생성한 @Pattern이라고 생각하면 된다.
위 언급과 같이 @Column 정의와 validation annotation을 적용하면 다음과 같은 entity 정의를 수행할 수 있다.
@Entity
@Table(name = "user")
@Builder
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "login_id", nullable = false, unique = true, length = 30)
@NotBlank(message = "Login ID entry is required.")
@Size(min = 5, max=30)
private String loginId;
@Column(name="password", nullable = false, length = 30)
@NotBlank(message = "Password entry is required.")
@Size(min = 5, max=30)
private String password;
@Column(name = "nickname", nullable = false, unique = true, length = 15)
@NotBlank(message = "Nickname is required")
@Size(min = 2, max = 15)
@Pattern(regexp = "^[A-Za-z0-9가-힣]+$")
private String nickname;
다음에는 RDB에서 중요한 각 entity간 relation을 설정하는 방법을 포스팅하도록 하겠다.