Entity Class

Entity Class 는 database table 에 mapping 된 Java Class 를 의미한다. Entity Class 는 ORM 기술을 사용하여 OOP 와 DB 간의 연결을 효율적으로 관리할 수 있다.
Entity Class 로 사용하기 위하여는 다음 최소한의 조건이 필요하다.
@Entityannotated 되어야 한다.public또는protected인 default constructor (no-arguments) 는 반드시 존재해야 한다.
Java Annotation
다음은 Java Annotation 을 사용하여 Java class 와 Database 를 mapping 하는 방법이다.
Step 1: Map class to database table
먼저 class 를 database 의 table 과 mapping 시켜주는 작업이 필요하다.
@Entity
@Table(name="student")
public class Student {
...
}우선 @Entity annotation 을 사용하여 Student class 를 Entity Class 로 사용하고, @Table annotation 을 사용하여 explicit 하게 class 와 database 의 table 을 mapping 한다.
Step 2: Map fields to database columns
그 다음은 class 의 각각의 field 를, database table 의 각각의 column 으로 mapping 시켜주는 작업이다.
@Entity
@Table(name="student")
public class Student {
@Id
@Column(name="id")
private int id;
@Column(name="first_name")
private String firstName;
...
}@Column annotation 을 사용하여 explicit 하게 field 와 column 을 mapping 시켜준 모습이다.
Implicit or Explicit
하지만 이렇게 @Table, @Column annotation 을 사용하여 explicit 하게 mapping 하는 것은 추천되지 않는다. 우선, implicit mapping 을 통하여 class name 을 table name 으로, field name 을 column name 으로 자동 mapping 하는 규칙이 충분히 강력하기 때문이다.
또한, 코드의 가독성 측면에서도 훨씬 깔끔해질 가능성이 있으며, Database 의 설계가 변경될 경우 explicit 하게 설정된 mapping 정보는 수정해야 할 부분이 더 많아질 수 있다. 예를 들어 implicit mapping 에서는 class 및 field 의 이름만 수정하는 것으로 유지보수를 완료할 수 있다.
Primary Key
Primary Key 는 RDB 에서 table 의 각 row 를 uniquely 하게 식별하기 위하여 사용되는 key 이다. Primary 는 다음 특징을 가진다.
- 유일성: key 값은 table 내에서 중복될 수 없다.
- NULL 값 불허: key 값이 반드시 존재해야 하며, NULL 값을 가질 수 없다.
- 단일성: 하나의 table 에는 하나의 primary key 만 정의할 수 있다.
MySQL - Auto Increment
CREATE TABLE student (
id int NOT NULL AUTO_INCREMENT,
first_name varchar(45) DEFAULT NULL,
last_name varchar(45) DEFAULT NULL,
email varchar(45) DEFAULT NULL,
PRIMARY KEY (id)
)SQL 상에서 AUTO_INCREMENT 를 사용하여 id 를 1씩 증가시킴으로써 uniqueness 를 유지할 수 있다. 또한 마지막에 PRIMARY KEY (id) 로 column name 을 지정하여 Primary Key 로 설정한다.
JPA Identity - Primary Key
@Entity
@Table(name="student")
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
...
}JPA 에서는 특정 field 에 @Id annotation 을 추가해줌으로써 Primary Key 를 설정한다. 또한 @GeneratedValue() 를 지정하여 직접 값을 설정하는 것이 아닌, Database 가 자동으로 관리하는 Primary Key 의 생성 방법을 설정할 수 있다. ID Generation Strategies 는 다음 것들이 있다.
JPA ID Generation Strategies
-
GenerationType.AUTO- JPA가 Database Dialect 에 따라 적절한 ID 생성 전략을 자동으로 선택
-
GenerationType.IDENTITY- Database 의
AUTO_INCREMENT기능을 사용해 ID를 생성
- Database 의
-
GenerationType.SEQUENCE- Database 의 Sequence(DB 에서 순차적으로 증가하거나 감소하는 숫자 값을 자동을 생성해주는 object) 를 사용해 고유한 ID 를 생성
@SequenceGenerator를 통해 Sequence 설정 가능
-
GenerationType.TABLE- 별도의 Table 을 만들어 ID를 관리하는 방법, Sequence 를 흉내내는 방식
- 모든 Database 에서 사용 가능하지만 성능이 낮아 잘 사용되지 않음
-
GenerationType.UUID- 전 세계적으로 고유한 UUID를 생성하여 ID로 사용, 128-bit 이기 때문에 네트워크 전체에서도 고유함
- 분산 시스템에서 유용하지만 indexing 효율이 떨어지고 저장 공간을 많이 차지함
이들뿐만이 아니라 직접 generation stategy 를 구성할 수도 있다. org.hibernate.id.IdentifierGenerator Interface 의 public Serializable generate() method 를 overriding 하는 방법으로 직접 구성할 수 있다.