DOing
[Spring] Spring Data JPA ์ดํดํ๊ธฐ (feat ORM, JPA) ๋ณธ๋ฌธ
๐ฑ ORM ์ด๋?
ORM ์ด๋ Object-Relational Mapping ์ ์ฝ์๋ก, ์ด๋ฆ ๊ทธ๋๋ก ๊ฐ์ฒด(Object)์ ๊ด๊ณํ ๋ฐ์ดํฐ(Relational data) ๋ฅผ ๋งคํํ๊ธฐ ์ํ ๊ธฐ์ ์ด๋ค. ์ด๋ฌํ ๋งคํ์ด ํ์ํ ์ด์ ๋ ๊ฐ์ฒด ์งํฅ ์ธ์ด๊ณผ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ฌ์ด์ ํจ๋ฌ๋ค์ ๋ถ์ผ์น๊ฐ ์๊ธฐ๋๋ฌธ์ด๋ค. ์ด ๋ ๊ฐ์ ํจ๋ฌ๋ค์ ๋ถ์ผ์น ๋๋ฌธ์ ๊ฐ๋ฐ์๋ ๋ ๋ง์ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ฉฐ, ์ด๋ ๋ฐ๋ณต์ ์ด๊ณ ์ค์ํ๊ธฐ ์ฌ์ด ์์ ์ด ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๋ ๊ฐ์ฒด์งํฅ์ ์ธ ์ค๊ณ์ ์ง์คํ ์ ์๊ฒ ๋๋ค. ORM์ด ๋ฐ๋ก ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ์ค๋ค.
๐ฑ ํจ๋ฌ๋ค์ ๋ถ์ผ์น
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ด์ ๋ฐ์ดํฐ ํํ ๋ฐฉ์์ด ๋ฌ๋ผ์ ์๊ธฐ๋ ๋ฌธ์ ๋ฅผ ํจ๋ฌ๋ค์ ๋ถ์ผ์น๋ผ๊ณ ํ๋ค. ํจ๋ฌ๋ค์ ๋ถ์ผ์น๊ฐ ์ผ์ด๋๋ ์ด์ ๋ ์ ์ด์ ์ด๋ค์ ๋ชฉํ์ ๋์ ๋ฐฉ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
- ๊ฐ์ฒด ์งํฅ
- ํ๋์ ๋ฉ์๋ ๋ฑ์ ๋ฌถ์ด์ ๊ฐ์ฒด๋ก ์ ๋ง๋ค์ด ์ฌ์ฉํ๋ ๊ฒ์ด ๋ชฉํ
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ถ์ํ, ์บก์ํ, ์ ๋ณด์๋, ์์, ๋คํ์ฑ ๋ฑ ์์คํ ์ ๋ณต์ก์ฑ์ ์ ์ดํ ์ ์๋ ๋ค์ํ ์ฅ์น๋ค์ ์ ๊ณตํ๋ค.
- ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ๋ฐ์ดํฐ๋ฅผ ์ ์ ๊ทํํด์ ๋ณด๊ดํ๋ ๊ฒ์ด ๋ชฉํ
๐ฑ JPA
JPA๋ Java Persistence API์ ์ฝ์๋ก, ์๋ฐ ORM ๊ธฐ์ ์ ๋ํ API ํ์ค ๋ช ์ธ์ด๋ค. ์ฆ, ์ธํฐํ์ด์ค์ ๋ชจ์์ด๋ค. ์ด๋ฌํ JPA ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ํ์ ์ธ ํ๋ ์์ํฌ๊ฐ ํ์ด๋ฒ๋ค์ดํธ(Hibernate)์ด๋ค.JPA๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ JDBC ์ฌ์ด์์ ๋์ํ๋ค. ๊ฐ๋ฐ์๊ฐ JPA๋ฅผ ์ฌ์ฉํ๋ฉด, JPA ๋ด๋ถ์์ JDBC API๋ฅผ ์ฌ์ฉํ์ฌ SQL์ ํธ์ถํ์ฌ DB์ ํต์ ํ๋ค. ์ฆ, ๊ฐ๋ฐ์๊ฐ ์ง์ JDBC API๋ฅผ ์ธ ํ์๊ฐ ์๋ค.
๐ฑ Hibernate
JPA๋ฅผ ๊ตฌํํ ํ๋ ์์ํฌ ์ค ์ฌ์ค์ ํ์ค์ด๋ค. ์คํ์์ค ์ํํธ์จ์ด์ด๋ค. ์ฌ๊ธฐ์ ์ฃผ๋ชฉํด์ผํ ์ ์ JPA๋ ๊ธฐ์ ์คํ์ด๊ณ ํ์ด๋ฒ๋ค์ดํธ๋ ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ์ฌ ๊ณต๊ธํด์ฃผ๋ ์ญํ ์ด๋ค.
๐ฑ Spring Data JPA
Spring framework์์ JPA๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํ๋ ํ๋ก์ ํธ(๋ชจ๋)์ด๋ค. Spring Data JPA์ ๋ชฉ์ ์ JPA๋ฅผ ์ฌ์ฉํ ๋ ํ์์ ์ผ๋ก ์์ฑํด์ผํ๋, ์์๊ฐ๋ฅํ๊ณ ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ค์ ๋์ ์์ฑํด์ค์ ์ฝ๋๋ฅผ ์ค์ฌ์ฃผ๋ ๊ฒ์ด๋ค. ์ด๋ JPA๋ฅผ ํ ๋จ๊ณ ์ถ์ํ์ํจ Repository๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ์ด๋ฃจ์ด์ง๋ค.
Spring Data JPA๋ JPA Provider์ด ์๋๋ค. ๋จ์ง ๋ฐ์ดํฐ ๊ณ์ธต์ ์ ๊ทผํ๊ธฐ ์ํด ํ์ํ ๋ปํ ์ฝ๋๋ค์ ์ฌ์ฉ์ ์ค์ฌ์ฃผ๋๋ก ํ๋ ์ธํฐํ์ด์ค์ด๋ค. ์ฌ๊ธฐ์ ๋ฐ๋์ ๊ธฐ์ตํด์ผํ ์ ์ Spring Data JPA๋ ํญ์ ํ์ด๋ฒ๋ค์ดํธ์ ๊ฐ์ JPA provider๊ฐ ํ์ํ๋ค๋ ๊ฒ์ด๋ค.
๐ฑ Spring Data JPA ์์ ์ฝ๋
* Entity ์์ฑ
@Entity
public class Product extends Timestamped {
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private Long id;
private Long userId;
private String title;
private String image;
private String link;
private int lprice;
private int myprice;
}
* Spring Data JPA) Repository ์์ฑ
public interface ProductRepository extends JpaRepository<Product, Long> {
}
* Spring Data JPA) Repository ๊ธฐ๋ณธ ์ ๊ณต ๊ธฐ๋ฅ
// 1. ์ํ ์์ฑ
Product product = new Product(...);
productRepository.save(product);
// 2. ์ํ ์ ์ฒด ์กฐํ
List<Product> products = productRepository.findAll();
// 3. ์ํ ์ ์ฒด ๊ฐ์ ์กฐํ
long count = productRepository.count();
// 4. ์ํ ์ญ์
productRepository.delete(product);
* Spring Data JPA) ์ถ๊ฐ๊ธฐ๋ฅ์ interface ๋ง ์ ์ธํด ์ฃผ๋ฉด, ๊ตฌํ์ Spring Data JPA ๊ฐ ๋์ ํ๋ค.
public interface ProductRepository extends JpaRepository<Product, Long> {
// (1) ํ์ ID ๋ก ๋ฑ๋ก๋ ์ํ๋ค ์กฐํ
List<Product> findAllByUserId(Long userId);
// (2) ์ํ๋ช
์ด title ์ธ ๊ด์ฌ์ํ 1๊ฐ ์กฐํ
Product findByTitle(String title);
// (3) ์ํ๋ช
์ word ๊ฐ ํฌํจ๋ ๋ชจ๋ ์ํ๋ค ์กฐํ
List<Product> findAllByTitleContaining(String word);
// (4) ์ต์ ๊ฐ๊ฐ fromPrice ~ toPrice ์ธ ๋ชจ๋ ์ํ๋ค์ ์กฐํ
List<Product> findAllByLpriceBetween(int fromPrice, int toPrice);
}
Spring Data JPA ์ถ๊ฐ๊ธฐ๋ฅ ๊ตฌํ๋ฐฉ๋ฒ์ ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ค.
์ด์ธ์ ๋ณต์กํ ์ฟผ๋ฆฌ๋ ์ง์ ์งค ์๋ ์๋ค.
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] Request๋ฅผ ์ด๋ป๊ฒ ๊ฒ์ฆํ ๊ฒ์ธ๊ฐ? (0) | 2021.09.13 |
---|---|
ํ ์คํธ์ ์ค์์ฑ๊ณผ ์ข ๋ฅ (0) | 2021.07.03 |
[Spring] POJO๋? (1) | 2021.05.29 |
[Spring] Spring Framework์ ์ ์์ ๋ชฉ์ (0) | 2021.05.29 |
Domain, Entity, Value(Object) (3) | 2021.05.27 |