Search

์ฃผ์š” ์–ด๋…ธํ…Œ์ด์…˜

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 ์–ด๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•˜๋ฉด ์—”ํ„ฐํ‹ฐ์™€ ๊ด€๊ณ„๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!