Entity Class

Entity Class 는 database table 에 mapping 된 Java Class 를 의미한다. Entity Class 는 ORM 기술을 사용하여 OOP 와 DB 간의 연결을 효율적으로 관리할 수 있다.

Entity Class 로 사용하기 위하여는 다음 최소한의 조건이 필요하다.

  • @Entity annotated 되어야 한다.
  • 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
  1. GenerationType.AUTO

    • JPA가 Database Dialect 에 따라 적절한 ID 생성 전략을 자동으로 선택
  2. GenerationType.IDENTITY

    • Database 의 AUTO_INCREMENT 기능을 사용해 ID를 생성
  3. GenerationType.SEQUENCE

    • Database 의 Sequence(DB 에서 순차적으로 증가하거나 감소하는 숫자 값을 자동을 생성해주는 object) 를 사용해 고유한 ID 를 생성
    • @SequenceGenerator 를 통해 Sequence 설정 가능
  4. GenerationType.TABLE

    • 별도의 Table 을 만들어 ID를 관리하는 방법, Sequence 를 흉내내는 방식
    • 모든 Database 에서 사용 가능하지만 성능이 낮아 잘 사용되지 않음
  5. GenerationType.UUID

    • 전 세계적으로 고유한 UUID를 생성하여 ID로 사용, 128-bit 이기 때문에 네트워크 전체에서도 고유함
    • 분산 시스템에서 유용하지만 indexing 효율이 떨어지고 저장 공간을 많이 차지함

이들뿐만이 아니라 직접 generation stategy 를 구성할 수도 있다. org.hibernate.id.IdentifierGenerator Interface 의 public Serializable generate() method 를 overriding 하는 방법으로 직접 구성할 수 있다.