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 ์ด๋
ธํ
์ด์
์ ํ์ฉํ๋ฉด ์ํฐํฐ์ ๊ด๊ณ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค! 