Search
Duplicate

μ£Όμš” μ–΄λ…Έν…Œμ΄μ…˜

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 μ–΄λ…Έν…Œμ΄μ…˜μ„ ν™œμš©ν•˜λ©΄ 엔터티와 관계λ₯Ό 효율적으둜 관리할 수 μžˆμŠ΅λ‹ˆλ‹€!