κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μμ λ°μ΄ν°λ₯Ό μ μ₯νκ³ κ΄λ¦¬νκΈ° μν΄ μλ° κ°μ²΄λ₯Ό μ¬μ©νλ λ°©μμΈ ORMμμ μ¬μ©λλ κ°μ²΄λ₯Ό λ§ν©λλ€.
λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈκ³Ό 맀νλλ μλ° ν΄λμ€μ λλ€. ν΄λΉ ν΄λμ€λ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμ ꡬ쑰μ λμΌν ꡬ쑰λ₯Ό κ°μ ΈμΌνλ©°, ν΄λμ€ λ΄μ λ©€λ² λ³μλ ν μ΄λΈμ 컬λΌκ³Ό 맀νλ©λλ€.
create table user_data (
id integer not null,
created_at timestamp(6),
email varchar(255),
name varchar(255),
updated_at timestamp(6),
primary key (id)
)
μλ₯Ό λ€μ΄ ν΄λΉ ν μ΄λΈκ³Ό 맀νλλ Entityν΄λμ€λ₯Ό λ§λ€κΈ° μν΄μλ ν΄λΉ ν μ΄λΈκ³Ό λμΌν ꡬ쑰λ₯Ό κ°μ§ ν΄λμ€κ° νμν©λλ€. κ° μ»¬λΌκ³Ό 맀νλλ λ©€λ² λ³μλ₯Ό μ μΈνκ³ , ν΄λΉ λ³μλ₯Όμ getter, setter λ©μλλ‘ μ κ·Όν μ μλλ‘ λ§λ€μ΄μΌ ν©λλ€.
JPA Entity ν΄λμ€μλ λ°λμ @Entity μ΄λ Έν μ΄μ μ μ¬μ©ν΄μΌ ν΄λΉ ν΄λμ€κ° λ°μ΄ν°λ² μ΄μ€μ 맀νλλ€λ κ²μ μΈμν μ μμ΅λλ€.
@Idλ‘ PrimaryKey μν μ νλ νλλ₯Ό μ§μ νκ³ @GeneratedValue μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ PrimaryKey κ°μ μλμΌλ‘ μμ±νλ λ°©λ²μ μ§μ ν μ μμ΅λλ€.
@Id μ΄λ Έν μ΄μ κ³Ό ν¨κ» μ¬μ©λλ©° μλμΌλ‘ κ³ μ ν κ°μ μμ±νλ©° κ³ μ ID(PK)λ₯Ό μμ±νλ λ°©λ²μ λν μ 보λ₯Ό μ 곡νλ μ΄λ Έν μ΄μ μ λλ€.
@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface GeneratedValue {
/**
* (Optional) The primary key generation strategy
* that the persistence provider must use to
* generate the annotated entity primary key.
*/
GenerationType strategy() default AUTO;
/**
* (Optional) The name of the primary key generator
* to use as specified in the {@link SequenceGenerator}
* or {@link TableGenerator} annotation.
* <p> Defaults to the id generator supplied by persistence provider.
*/
String generator() default "";
}
public enum GenerationType {
/**
* Indicates that the persistence provider must assign
* primary keys for the entity using an underlying
* database table to ensure uniqueness.
*/
TABLE,
/**
* Indicates that the persistence provider must assign
* primary keys for the entity using a database sequence.
*/
SEQUENCE,
/**
* Indicates that the persistence provider must assign
* primary keys for the entity using a database identity column.
*/
IDENTITY,
/**
* Indicates that the persistence provider must assign
* primary keys for the entity by generating an RFC 4122
* Universally Unique IDentifier.
*/
UUID,
/**
* Indicates that the persistence provider should pick an
* appropriate strategy for the particular database. The
* <code>AUTO</code> generation strategy may expect a database
* resource to exist, or it may attempt to create one. A vendor
* may provide documentation on how to create such resources
* in the event that it does not support schema generation
* or cannot create the schema resource at runtime.
*/
AUTO
}
ν΄λΉ μ΄λ Έν μ΄μ κ³Ό λ΄λΆμ GenerationTypeμ λλ€. @GeneratedValueμλ 4κ°μ§μ μ λ΅μ΄ μ 곡λ©λλ€.
AUTO : λ°μ΄ν°λ² μ΄μ€ νλ«νΌμ κΈ°λ°μΌλ‘ν μμ± μ λ΅μ μλμΌλ‘ μ νν©λλ€. (κΈ°λ³Έκ°)
IDENTITY : μν°ν°μ λν κ³ μ ν PKλ₯Ό μμ±νκΈ° μν΄ λ°μ΄ν°λ² μ΄μ€μ μμ‘΄ν©λλ€. μ£Όλ‘ μλ μ¦κ° μ«μ μ΄μ μ§μνλ λ°μ΄ν°λ² μ΄μ€μ μ¬μ©λλ©° μλ‘μ΄ μν°ν°κ° μμλλ κ²½μ° λ°μ΄ν°λ² μ΄μ€λ μλ‘μ΄ κ³ μ IDκ°μ μμ±νμ¬ μν°ν°μ ID νλμ ν λΉν©λλ€.
SEQUENCE : λ°μ΄ν°λ² μ΄μ€ μνμ€λ₯Ό μ¬μ©νμ¬ κ³ μ ν κΈ°λ³Έ ν€ κ°μ μμ±ν©λλ€. μνμ€λ₯Ό μ§μνλ λ°μ΄ν°λ² μ΄μ€μ ν¨κ» μ¬μ©λλ©° IDENTITY
μ λ΅λ³΄λ€ λ λμ μ±λ₯μ 보μ¬μ€λλ€. μ μν°ν°κ° μμλλ©΄ λ°μ΄ν°λ² μ΄μ€ μνμ€μμ μ κ°μ μμ² μν°ν°μ IDνλμ ν λΉν©λλ€.
@Data
@AllArgsConstructor
@RequiredArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@SequenceGenerator(
name = "TEST_SEQ",
sequenceName = "USER_SEQ_GEN",
initialValue = 1,
allocationSize = 50
)
public class UserData {
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TEST_SEQ")
@Id
private int id;
@NonNull
private String name;
@NonNull
private String email;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
@SequenceGeneratorλ₯Ό μ¬μ©νμ¬ μ§μ ν μ μμΌλ©° μμ λ€μ΄κ° λ΄μ©μ κ°κ° λ€μκ³Ό κ°μ΅λλ€.
μ’
ν©ν΄λ³΄λ©΄ ν΄λΉ μν°ν°μμ Id
κ°μ μλμμ±ν λ μ΄κΈ°κ°μ 1, μλ³μ μμ±κΈ°λ₯Ό μ€μ ν΄ λμ TEST_SEQλ‘ μ€μ , 50κΉμ§λ λ©λͺ¨λ¦¬μμ νμ¬ μνμ€μμ κ°μ μ μ₯νλ©° μ΄ν 51μ΄ λλ μμ μ DB μνμ€λ₯Ό νλ² λ νΈμΆν μ΄ν 100κΉμ§ κ°μμΌλ‘ μνμ€ μλ³μλ₯Ό κ΄λ¦¬νκ² λ€λ λ΄μ©μ
λλ€.
ν΄λΉ μ λ΅μ SEQUENCE
μ λ΅κ³Ό λμΌνκ² generatorλ₯Ό μ€μ νμ¬ λ§€νν©λλ€. μ£Όλ‘ λ€λ₯Έ μ λ΅μ μ¬μ©νμ§ μμ λ μ¬μ©ν©λλ€.
@Columnμ΄λ Έν μ΄μ μΌλ‘ λ©€λ¨Έ λ³μμ λ°μ΄ν°λ² μ΄μ€ columnκ°μ 맀νμ μ§μ ν©λλ€.
Entityν΄λμ€λ₯Ό μμ±νλ€λ©΄ ν΄λΉ ν΄λμ€μ κ΄λ ¨λ CRUDλ₯Ό μ 곡νλ μμ μ μννκΈ° μν RepositoryμΈν°νμ΄μ€λ₯Ό μ μνκ³ λ©μλλ₯Ό μμ±ν΄μΌ ν©λλ€.
ν΄λΉ μ΄λ Έν μ΄μ μ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈ κ°μ 맀νμ μ μνλλ° μ¬μ©λ©λλ€. μν°ν° ν΄λμ€μ μ μ©λλ©° ν μ΄λΈμ μ΄λ¦κ³Ό ꡬμ±ν΄μΌ νλ μΆκ° ν μ΄λΈ μμ€ μμ±μ μ§μ ν©λλ€.
name : μν°ν°κ° 맀νλ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμ μ΄λ¦μ μ§μ ν μ μμ΅λλ€. defaultλ μν°ν° ν΄λμ€ μ΄λ¦κ³Ό λμΌν©λλ€.
category : λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμ μΉ΄ν κ³ λ¦¬ μ§μ ν μ μμ΅λλ€. default : ""
scherma : λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμ μ€ν€λ§λ₯Ό μ§μ ν μ μμ΅λλ€. default : ""
UniqueConstraint[] : ν μ΄λΈμ λ°°μΉν΄μΌ νλ κ³ μ μ μ½ μ‘°κ±΄μ μ§μ ν μ μμ΅λλ€. @Column, @JoinColumn μ΄λ Έν μ΄μ μΌλ‘ λͺ¨λ μ μ½ μ‘°κ±΄κ³Ό PK맀νμ΄ μλ°νλ μ μ½ μ‘°κ±΄μΈμλ μ μ©μ΄ κ°λ₯ν©λλ€. default : {}
Index[] : ν μ΄λΈμ λν΄ μμ±ν΄μΌ νλ μΈλ±μ€λ₯Ό μ§μ ν μ μμ΅λλ€. deafult : {} -> @NonNullμ κ°μ μν
@Table μ΄λ Έν μ΄μ μ ν μ΄λΈμ 맀ννλλ° μ¬μ©νλ©° μν°ν°, ν μ΄λΈ λ€μ, μ€ν€λ§ λ±μ μ μ©ν΄μΌ νλ 쑰건μ μ§μ νλλ° μ¬μ©λ μ μμ΅λλ€. νμ§λ§ μ€μ DBμ indexμ€μ μ΄ λμ΄μμ§ μμλ° ν μ΄λΈ μμ±μ indexμ€μ μ΄ λμ΄μλ€κ³ ν΄μ λμνμ§ μμ΅λλ€.
μΈλ±μ€λ μ μ½μ¬νλ€μ DBμ€μ μ λ§‘κΈ°κ³ Entityμ νκΈ°νμ§ μλ κ²μ΄ μ‘°κΈ λ μ’μ보μ λλ€.
JPA Entity ν΄λμ€λ₯Ό μμ±νλ©΄, ν΄λΉ ν΄λμ€λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€μ μνΈμμ©νλλ° μ¬μ©λ μ μμ΅λλ€. ν΄λΉ ν΄λμ€λ λ€μν JPA 쿼리 λ©μλλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€μμ λ°μ΄ν°λ₯Ό κ²μνκ³ μ μ₯ν μ μμ΅λλ€.
1. λ‘μ§ λΆλ¦¬ μ΄λ €μ
JPA Entityλ λ°μ΄ν°λ² μ΄μ€μ 1:1λ‘ λ§€νλλ κ°μ²΄μ λλ€. κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μμ κΆμ₯νλ μν°ν°μ λΉμ¦λμ€ λ‘μ§μ λΆλ¦¬νλ λ°©μμ μ¬μ©νκΈ° μ΄λ €μ Service λ±μ μΆκ°λ‘ ꡬνν΄μΌ ν μλ μμ΅λλ€.
2. μΌλΆ κΈ°λ₯ λ―Έμ§μ
JPA Entityλ λ°μ΄ν°λ² μ΄μ€μ κΈ°λ³Έ κΈ°λ₯μ μ§μνλ©°, μΌλΆ κΈ°λ₯μ μ§μνμ§ μμ μ μμ΅λλ€. μ΄λ¬ν κ²½μ° Native Queryλ₯Ό μ¬μ©νκ±°λ λ³λμ JDBC μ½λλ₯Ό μμ±ν΄μΌ ν μλ μμ΅λλ€.
3. μ±λ₯ μ΄μ
λ°μ΄ν°λ² μ΄μ€μμ 맀νμ μν΄ λ§μ λ©νλ°μ΄ν°λ₯Ό μμ±ν©λλ€. JPA λ΄λΆλμμ μν΄ νμνμ§λ§, μ€νμκ°μ΄ λμ΄λλ μμΈμ΄ λ μ μμ΅λλ€. λν Entityλ κ°μ²΄ κ·Έλνλ₯Ό λ°λΌ λ€λ₯Έ Entity κ°μ²΄λ₯Ό μλμΌλ‘ λ‘λνλ κΈ°λ₯μ μ 곡ν©λλ€ μ΄ λ, λΆνμν Entity κ°μ²΄λ₯Ό λ‘λνλ κ²½μ°κ° λ°μν μ μμΌλ©° μ΄λ μ±λ₯ λ¬Έμ λ₯Ό μΌκΈ°ν μ μμ΅λλ€.