class User {
private int id;
private String name;
private int age;
private long salary;
}
์์ ๋ฐ์ดํฐ(ํ๋)๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํด์ ๊ด๋ฆฌํด์ผํ๋ค๋ฉดโ
๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ ์์ฑ
์ดํ๋ฆฌ์ผ์ด์ ์์ ์ง์ ์ฟผ๋ฆฌ ์์ฑ
์ฟผ๋ฆฌ JDBC API ํตํด ์ง์ ์คํ
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ก ํด๋น ๊ฐ์ฒด ์ง์ ์์ฑ
โก๏ธ ๊ฐ๋ฐ์ ์ ์ฅ์์ ๋๋ฌด ๋ฒ๊ฑฐ๋ก์
class User {
private int id;
private String name;
private int age;
private long salary;
// ์ถ๊ฐ!
private int weight;
}
User์ ๋ชธ๋ฌด๊ฒ ๋ฐ์ดํฐ๋ฅผ ์๋ก ๋ฐ์์์ผ ํ๋ค๋ฉดโ
์ฟผ๋ฆฌ๋ฌธ ์ง์ ์์ ํ์
์ ์ ๊ฐ์ฒด์ ๊ฐ ๋ฃ์ด์ฃผ๋ ๋ถ๋ถ ์ถ๊ฐ
ORM(SQL ์๋์์ฑ)
์ด ์๋ ํ๊ฒฝ โ
โ ๊ฐ๋ฐ์๊ฐ ๋น์ฆ๋์ค ๋ก์ง๋ณด๋ค, SQL ์์ฑ์ ๋ ๋ง์ ๋ ธ๋ ฅ์ ํด์ผํจ
๊ฐ์ฒด | ๋ฆด๋ ์ด์ | |
---|---|---|
๋ฐ๋๋ฌธ์ | ๋ค์ํ ํฌ๊ธฐ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์์ | ํ ์ด๋ธ(row, column) โ ๊ธฐ๋ณธ ๋ฐ์ดํฐํ์ |
์๋ธํ์ ๋ฌธ์ | ์์, ๋คํ์ฑ ๊ตฌํ ์ฌ์ | ์์ ๋ฐ ๋คํ์ ๊ด๊ณ ํํ๋ถ๊ฐ |
์๋ณ์ฑ๋ฌธ์ | ๋ ํผ๋ฐ์ค, ์ธ์คํด์ค ๋์ผ์ฑ | ์ค์ง PK |
๊ด๊ณ๋ฌธ์ | ์๋ก ๊ฐ ๊ฐ์ฒด์ฐธ์กฐ โ M : N ๊ฐ๋ฅ, ๋ฐฉํฅ์์ | M : N ๋ถ๊ฐ๋ฅ, FK๋ก ๋ฐ๋ก ์กฐํ๊ฐ๋ฅ (๋ฐฉํฅ์์) |
๋ฐ์ดํฐ๋ค๋น๊ฒ์ด์ ๋ฌธ์ | ๋ง์๋๋ก ๋ ํผ๋ฐ์ค ํ๊ณ ๊ฐ๋ฅ | ๋นํจ์จ์ (๋งค๋ฒ JOIN โ ์ฑ๋ฅ๋ฌธ์ |
๐ ORM
: ๊ฐ์ฒด ๊ด๊ณ ๋งตํ ๊ธฐ์
ํจ๋ฌ๋ค์ ๋ถ์ผ์น ๋ฌธ์ ํด๊ฒฐ โ
๋ฐ๋ณต์ ์ด๊ณ ๋ฒ๊ฑฐ๋ก์ด ์ดํ๋ฆฌ์ผ์ด์ ๋จ์์์ ์ฟผ๋ฆฌ์์ ์ค์ฌ์ค โ
SQL ์๋์์ฑ
๐ JPA(Java Persistence API)
: Java ORM ๊ธฐ์ ์ ๋ํ ํ์ค๋ช ์ธ
์ฟผ๋ฆฌ ์๋์์ฑ
์ดํ๋ฆฌ์ผ์ด์ ๊ณ์ธต โ SQL ์์กด๋ ๋ฎ์ถค โก๏ธ ๋ฒ๊ฑฐ๋ก์ด ์์ ๋จ์ถ โญ๏ธ
ํจ๋ฌ๋ค์ ๋ถ์ผ์น ๋ฌธ์ ํด๊ฒฐ
์ฑ๋ฅ ์ต์ ํ ์๋ฃ
H2, MySQL, ORACLE โ ์ธ์ด๊ฐ ๋ชจ๋ ๋ฌ๋ผ๋ ์ฝ๋๋ณ๊ฒฝ โ
๊ด๊ณํ DB์ด์, ํ์ค์ ์ค์ํ SQL ์ง์ โ JPA๊ฐ ์์์ ์ฒ๋ฆฌํจ
๐ @Entity
: JPA์์ ํ ์ด๋ธ์ ๋์ํ๋ ํ๋์ Java ํด๋์ค
@Entity
public class Account {
private String username;
private String password;
}
// username, password โ DB์ Column
// username, password : Account Entity ํด๋์ค์ ํ๋
username | password |
---|---|
mallang | 1234 |
chunsik | 5678 |
ํ๋์ Entity ํ์ ์์ฑ โ ํ๋์ ํด๋์ค๋ฅผ ์์ฑ
@Entity ์ด๋
ธํ
์ด์
: JPA๋ฅผ ์ฌ์ฉํด ํ
์ด๋ธ๊ณผ ๋งคํํ ํด๋์ค๋ฅผ ๋ถ์ฌ์ฃผ๋ ์ด๋
ธํ
์ด์
(ํด๋น ์ด๋
ธํ
์ด์
์ผ๋ก JPA๊ฐ ํด๋น ํด๋์ค๋ฅผ ๊ด๋ฆฌํจ)
Entity
: ํ
์ด๋ธ์ ์ฒดColumn
: ํ๋, ์ธ๋ก ์ด๋ถ๋ถrow
: Entity ๊ฐ์ฒด, ๊ฐ๋ก ํ๋ถ๋ถ// DB ํ
์ด๋ธ ์ญํ
// @Entity -> @getter, @setter ๋ฐ๋ก ์ง์ ์ํจ
@Entity
public class User {
// primary key(๊ธฐ๋ณธํค) ๋ณ์ ์ ์ธ
@Id
// ID๊ฐ ์๋์ผ๋ก ์์ฑ ๋ฐ ์ฆ๊ฐ
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(nullable = false, unique = true)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false, unique = ture)
private String email;
@Column(nullable = false)
@Enumerated(value = EnumType.STRING)
private UserRoleEnum role;
@Column(unique = true)
private Long kakaoId;
}
ID | KAKAO_ID | PASSWORD | ROLE | USERNAME | |
---|---|---|---|---|---|
1 | mallang@mallang.com | mallang | 1234 | ADMIN | mallang |
Java | Database | |
---|---|---|
์ฐ๊ด๊ด๊ณ | ๊ฐ์ฒด, ๋ ํผ๋ฐ์ค | ํ ์ด๋ธ(Entity)์ฌ์ด์ ๊ด๊ณ ; FK |
์ ๋ณด์ฌ์ด์ ์ฐ๊ด๊ด๊ณ๋ฅผ ํํํ๊ณ ์ฒ๋ฆฌํ๋ ๋ ๋ฐฉ์์ ์ฐจ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ์ํด,
JPA
โก๏ธ Java ์ดํ๋ฆฌ์ผ์ด์ ์์์, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ด๊ด๊ณ๋ฅผ ํ์ํด์ฃผ๋ ์ฅ์น๋ฅผ ๊ฐ์ง๊ณ ์์
JPA๊ฐ ์ ๊ณตํ๋ ์ฐ๊ด๊ด๊ณ โ DB์ ์ฐ๊ด๊ด๊ณ๋ฅผ ํํํ๊ธฐ ์ํจ
๋๋ฌธ์ DB์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋จผ์ ํ์ ํ ํ, ์ค๊ณ
DB ์ฐ๊ด๊ด๊ณ โ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ๋ง์ถฐ ์ด๋ค์ง
๐ JPA ์ฐ๊ด๊ด๊ณ
: Entity ํด๋์ค ํ๋ ์ โ ์ฐ๊ด๊ด๊ณ Annotation ์ค์ โ ํ์ฑ์๋ฃ
๊ด๊ณ | Annotation |
---|---|
1 : N (์ผ๋๋ค) | @OneToMany |
N : 1 (๋ค๋์ผ) | @ManyToOne |
1 : 1 (์ผ๋์ผ) | @OneToOne |
N : M (๋ค๋๋ค) | @ManytoMany |
@Entity
public class Product extends Timestamped {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private Long userId;
private String title;
private String image;
private String link;
private int lprice;
private int myprice;
}
public interface ProductRepository extends JpaRepository<Product, Long> {
// JPA๋ ํฌ์งํ ๋ฆฌ -> ์์๋ฐ์
// <์ฐ๊ฒฐํ Entity ํ
์ด๋ธ, Id ํ์
>
}
// ๐ ์ํ์์ฑ
Product product = new Product();
productRepository.save(product); // save() -> ๊ฐ์ฒด DB์ ์ ์ฅ
// ๐ ์ํ์ ์ฒด์กฐํ
List<Product> productList = productRepository.findAll();
// ๐ ์ํ์ ์ฒด๊ฐ์์กฐํ
long productCount = productRepository.count();
// ๐ ์ํ์ญ์
productRepository.delete(product);
JpaRepository<Product, Long> {
// ๐ ํ์Id -> ์ํ์กฐํ
List<Product> findAllByUserId(Long userId);
// ๐ title -> ์ํ์กฐํ
List<Product> findByTitle(String title);
// ๐ word๊ฐ ํฌํจ๋ ์ํ -> ์กฐํ
List<Product> findAllByTitleContaining(String word);
// ๐ ์ต์ ๊ฐ fromPrice ~ toPrice -> ์ํ์กฐํ
List<Product> findAllByLpriceBetween(int fromPrice, int toPrice);
}