JPA μ£Όμ μ΄λ
Έν
μ΄μ
JPAμμ μμ£Ό μ¬μ©λλ μ΄λ
Έν
μ΄μ
μ κΈ°λ³Έ μν°ν°, κ΄κ³ λ§€ν, κΈ°ν κΈ°λ₯μΌλ‘ λΆλ₯νμ¬ μ 리νμ΅λλ€.
μν°ν° κΈ°λ³Έ μ΄λ
Έν
μ΄μ
μ΄λ
Έν
μ΄μ
| μ€λͺ
|
@Entity | ν΄λΉ ν΄λμ€κ° JPA μν°ν°μμ μ μΈ |
@Table(name = "table_name") | λ§€νν ν
μ΄λΈ μ΄λ¦ μ§μ |
@Id | κΈ°λ³Έ ν€(Primary Key) μ§μ |
@GeneratedValue
(strategy = GenerationType.IDENTITY) | κΈ°λ³Έ ν€ μμ± μ λ΅ μ§μ (AUTO, IDENTITY, SEQUENCE, TABLE) |
@Column
(name = "name", nullable = false, length = 100) | μ»¬λΌ μμ± μ§μ (μ΄λ¦, κΈΈμ΄, NULL νμ© μ¬λΆ λ±) |
@Embedded | κ°μ²΄ κ° νμ
(λ΄μ₯ νμ
) λ§€ν |
@Embeddable | λ΄μ₯ νμ
ν΄λμ€ μ§μ |
@Transient | DBμ λ§€νλμ§ μλ νλ μ§μ |
κ΄κ³ λ§€ν μ΄λ
Έν
μ΄μ
μ΄λ
Έν
μ΄μ
| μ€λͺ
|
@OneToOne | 1:1 κ΄κ³ μ€μ |
@OneToMany(mappedBy = "field_name") | 1:N κ΄κ³ μ€μ (λΆλͺ¨) |
@ManyToOne | N:1 κ΄κ³ μ€μ (μμ) |
@ManyToMany | N:M κ΄κ³ μ€μ |
@JoinColumn(name = "foreign_key") | μΈλ ν€(FK) μ€μ |
@JoinTable(name = "middle_table") | λ€λλ€(N:M) κ΄κ³μμ μ€κ° ν
μ΄λΈ λ§€ν |
@MappedBy | μλ°©ν₯ κ΄κ³μμ μ°κ΄λ νλλͺ
μ§μ |
@Cascade(CascadeType.ALL) | μ°κ΄λ μν°ν°μ λ³κ²½ μ¬ν μ ν |
@Fetch(FetchType.LAZY / FetchType.EAGER) | μ§μ° λ‘λ©(LAZY) or μ¦μ λ‘λ©(EAGER) μ€μ |
κΈ°ν μ£Όμ μ΄λ
Έν
μ΄μ
μ΄λ
Έν
μ΄μ
| μ€λͺ
|
@Lob | λμ©λ λ°μ΄ν°(BLOB, CLOB) μ μ₯ |
@Enumerated(EnumType.STRING) | Enum νμ
λ§€ν (STRING or ORDINAL) |
@Temporal(TemporalType.TIMESTAMP) | λ μ§ λ° μκ° νμ
λ§€ν |
@CreatedDate | μν°ν° μμ± μ μλμΌλ‘ λ μ§ μ μ₯ (Spring Data JPA) |
@LastModifiedDate | μν°ν° μμ μ μλμΌλ‘ λ μ§ μ
λ°μ΄νΈ (Spring Data JPA) |
@Version | λκ΄μ λ½(Optimistic Lock) μ¬μ© |
@NamedQuery(name = "queryName", query = "JPQL_QUERY") | μ μ JPQL 쿼리 μ§μ |
@Query("JPQL_QUERY") | Spring Data JPAμμ JPQL 쿼리 μ€ν |
@Modifying | λ°μ΄ν° λ³κ²½ JPQL μ€ν μ μ¬μ© (INSERT, UPDATE, DELETE) |
μ€μ μμ : μν°ν°μ κ΄κ³ λ§€ν
Users μν°ν°
import jakarta.persistence.*;
import lombok.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "users")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Users {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 50)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false, unique = true)
private String email;
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
}
Java
볡μ¬
Boards μν°ν°
@Entity
@Table(name = "boards")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Boards {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 100)
private String title;
@Column(nullable = false, columnDefinition = "TEXT")
private String content;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private Users user;
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
}
Java
볡μ¬
Files μν°ν°
@Entity
@Table(name = "files")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Files {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String fileName;
@Column(nullable = false)
private String filePath;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "board_id", nullable = false)
private Boards board;
}
Java
볡μ¬
μ 리
1.
κΈ°λ³Έ μν°ν° μ΄λ
Έν
μ΄μ
(@Entity, @Table, @Id, @GeneratedValue) νμ
2.
κ΄κ³ λ§€ν (@OneToMany, @ManyToOne, @JoinColumn) νμ©
3.
Cascade, FetchType λ± μ΅μ ν μ€μ κ³ λ €
4.
Spring Data JPA μ΄λ
Έν
μ΄μ
(@CreatedDate, @LastModifiedDate) νμ©
μ΄λ κ² JPA μ΄λ
Έν
μ΄μ
μ νμ©νλ©΄ μν°ν°μ κ΄κ³λ₯Ό ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν μ μμ΅λλ€! 