JPA
Java Persistence API์ฝ์๋ก ๊ฐ์ฒด์ RDB๊ฐ์ ๋งตํ ์์ผ์ฃผ๋ ์ธํฐํ์ด์ค
์ ๋ชจ์์ด๋ค. ์ฆ, ํน์ ๊ธฐ๋ฅ์ ์ํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋ผ ๋ช
์ธ์ด๋ค.
Hibernate
JPA์ ๊ตฌํ์ฒด๋ก, ์ธํฐํ์ด์ค์ธ JPA๋ฅผ ๊ตฌํํ class๊ฐ์ ๊ฒ.
JPA๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ฐ๋์ Hibernate๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๊ณ ๋ค๋ฅธ JPA๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํด๋ ๋๋ฉฐ, ์ง์ JPA๋ฅผ ๊ตฌํํ์ ์ฌ์ฉํ ์๋ ์๋ค.
Spring Data JPA
Spring์์ ์ ๊ณตํ๋ ๋ชจ๋ ์ค ํ๋๋ก ๊ฐ๋ฐ์๊ฐ JPA๋ฅผ ์ข๋ ํธํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ฃผ๊ธฐ ์ํด Repository๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณต (JPA๋ฅผ ์ถ์ํ ์ํจ๊ฒ)
Repository์ธํฐํ์ด์ค ๊ท์น๋๋ก ๋ฉ์๋๋ฅผ ์์ฑํ๋ฉด Spring์ด ์์์ JPA๋ฅผ ์ด์ฉํ์ฌ ์ ํฉํ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค์ด BEAN์ผ๋ก ๋ฑ๋ก ํด์ฃผ๋ ๊ฒ. (์ ํํ๋ ๋ฉ์๋๋ช ๊ฐ์ง๊ณ ์ ํฉํ JPQL์ ์์ฑํด์ค๋ค.)
๊ณตํต ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ SimpleJpaRepository
์ด๋ค.
๋์๊ณผ์
์ฑ๊ณผ JDBC ์ฌ์ด์์ ๋์ํ๋ฉฐ, JPA๋ฅผ ์ฌ์ฉ์ JPA๋ด๋ถ์์ JDBC API๋ฅผ ์ฌ์ฉํด DB์ ํต์ ์ ํ๋ค.
์ธํฐํ์ด์ค๋ง ๋ง๋ค์ด๋ ์คํํ ๋ ์ธํฐํ์ด์ค๋ค์ ์ฐพ์์ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค๊ณ ๋น์ผ๋ก ๋ฑ๋กํด์ค๋ค.
์ ์ฅ/์กฐํ ๊ณผ์
JPA์๊ฒ ๊ฐ์ฒด๋ฅผ ๋๊ธฐ๋ฉด JPA๋ ์ํฐํฐ๋ฅผ ๋ถ์ํ์ฌ, SQL๋ฌธ์ ์์ฑํ๊ณ ์ด๋ฅผ JDBC API๊ฐ DB์ ๋ ๋ฆฌ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด์ ๋งคํ์ํจ๋ค.
์ฅ์
SQL์ ์ฝ๋ ๋ฐ๋ณต์ ์ค์ฌ์ฃผ๊ณ , CRUD๋ฅผ ๊ฐ๋จํ๊ฒ ํ ์ ์์ด ์์ฐ์ฑ๊ณผ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ค.
๊ฐ์ฒด์ RDB๊ฐ์ ๋ชจ๋ธ๋ง์ด ๋ฌ๋ผ ๋ฐ์ํ๋ ํจ๋ฌ๋ค์ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
(๊ฐ์ฒด๋ ๋จ๋ฐฉํฅ์ ์์๊ด๊ณ์ ์ฐธ์กฐ๋ฅผ ํตํ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ๊ณ RDB๋ ์์๊ด๊ณ๊ฐ ์์ด ํ ์ด๋ธ๊ฐ์ ์ํผ-์๋ธ ํ์ ๊ด๊ณ์ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ๋๋ค.)
๋์ผํ ํธ๋์ญ์ ์์์๋ ๊ฐ์ ์ํฐํฐ๋ฅผ ๋ฐํํ์ฌ ์บ์ฑ๊ธฐ๋ฅ๊ณผ ๋์ผ์ฑ์ ๋ณด์ฅํ๋ค.
ํธ๋์ญ์ ์ commitํ ๋๊น์ง ์ฐ๊ธฐ ์ง์ฐ(๋ฒํผ๋ง)์ ์ง์ํ์ฌ ํ๋ฒ์ SQL๋ฌธ์ ๋ณด๋ผ ์ ์๋ค.
๊ฐ์ฒด๊ฐ ์ค์ ๋ก ์ฌ์ฉ๋ ๋ ๋ก๋ฉํ๋ ์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํ ์ ์๋ค.
์ฌ์ฉ๋ฒ
Repository ๋ฐฉ์์ Entity์์ Spring Data JPA์์ ์ ๊ณตํ๋ JpaRepository์ธํฐํ์ด์ค๋ฅผ ์์ํ๊ธฐ๋ง ํด๋ ๋์ด, ์ธํฐํ์ด์ค์ ๋ฐ๋ก @Repository๋ฅผ ์ถ๊ฐํ ํ์๊ฐ ์๋ค.
์์๋ฐ์ ๋๋ JpaRepository<T,ID>์ ํํ๋ก Entity์ ํด๋์ค์ ID๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
๊ธฐ๋ฅ
save() : ๋ ์ฝ๋ ์ ์ฅ (INSERT, UPDATE)
findOne() : primary key๋ก ๋ ์ฝ๋ ์ฐพ๊ธฐ
findAll() : ์ ์ฒด ๋ ์ฝ๋ ๋ถ๋ฌ์ค๊ธฐ ( sort, pageable )
count() : ๋ ์ฝ๋ ๊ฐฏ์
delete() : ๋ ์ฝ๋ ์ญ์
์์ ๊ธฐ๋ฅ์ ์ ์ธํ ๊ธฐ๋ฅ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ์ฉ ํ ์ ์์ผ๋ฉฐ, ๋ช ๋ช ๊ท์น์ Refernece๋ฅผ ์ฐธ์กฐํ์.
findBy~ : ์ฟผ๋ฆฌ๋ฅผ ์์ฒญํ๋ ๋ฉ์๋
countBy~ : ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋ ์ฝ๋ ์๋ฅผ ์์ฒญํ๋ ๋ฉ์๋
๋ฉ์๋์ ๋ฐํํ์ด Entity๊ฐ์ฒด์ด๋ฉด ํ๋์ ๊ฒฐ๊ณผ, List์ด๋ฉด ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ ๋ฌ
JPA NamedQuery
@Entity
@NamedQuery(
name = "Member.findByUsername",
query = "select m from Member m where m.username = :username")
public class Member{
//...
}
<named-query name="Member.findByUsername">
<query><CDATA[
select m
from Member m
where m.username = :username]>
</query>
</named-query>
Entity์ ์ด๋ ธํ ์ด์ ์ด๋ xmlํ์ผ์ ์ด์ฉํด์ ์ ์ํ ๋ด์ฉ์ ๊ฐ์ง๊ณ Repository์ ํด๋น ์ด๋ฆ์ผ๋ก ๋ฉ์๋๋ฅผ ๋ง๋ค๋ฉด NamedQuery์ ๋งค์นญ์์ผ ์์ฑํด์ฃผ๊ณ ๋ง์ฝ NamedQuery๊ฐ ์๋ค๋ฉด ๋ฉ์๋๋ช ์ ๋ง๋ JPQL์ ์๋์ผ๋ก ์์ฑํด์ค๋ค.
@Query
public interface MemberRepository extends JpaRepository<Memeber,Long>{
@Query("select m from Memeber m where m.username = :username")
Member findByusername(@Param("username") String username);
}
@Query ์ด๋
ธํ
์ด์
์ ์ด์ฉํด ์ธํฐํ์ด์ค ๋ด์์ ์ง์ JPQL์ ์์ฑํ ์๋ ์๊ณ , ์ต์
์ผ๋ก natvieQuery = true
์ต์
์ ์ด์ฉํ๋ฉด SQL๋ฌธ์ผ๋ก ์์ฑํ ์๋ ์๋ค.
@Modifying
๋ฒํฌ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆด ๋ ์ฌ์ฉํ๋ ์ด๋ ธํ ์ด์ ์ด๋ค.
@Modifying(clearAutomatically = true)
@Query("update Product p set p.price = p.price * 1.1 where p.stockAmount < :stockAmount")
int bulkPriceUp(@Param("stockAmount") String stockAmount);
clearAutomatically์ต์ ์ผ๋ก ์ฟผ๋ฆฌ ํ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ด๊ธฐํ ํ๋ ์ต์ ์ ์ค ์ ์๋ค.
Reference
https://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html/#jpa.sample-app.finders.strategies
https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html
Last updated