Spring Data JPA
JDBC โ Hibernate โ JPA โ Spring Data JPA
์ฐ๋ฆฌ๋ Spring Data JPA์ ์ฌ์ฉํ๋๋ฐ ์ด๊ฑด repository๋ฅผ ํ์ฉํด์ ์ฌ์ฉ
DAO(Data Access Object)
๋ง์ฝ ๋ค๋ฅธ entity์ ๋ํด์ ๋ DAOํจ์๋ค์ ๋ง๋ค์ด์ผํ๋ค๋ฉด ์ด๊ฑด ์ค๋ณต์ด๋ผ์ ๋งค์ฐ ๊ท์ฐฎ๊ฒ ๋๋ค..
ํญ์ ๊ฒฐ๊ณผ์ ์ผ๋ก๋ entity type๊ณผ primary key ์ด 2๊ฐ๋ง ๋ฐ๋๊ฒ๋๋ ๋ถ๋ถ์ด๊ณ ๋๋จธ์ง๋ ๋ค ๋น์ทํ๋ค.
๊ทธ๋ฌ๋ฉด Spring์๊ฒ entity type๊ณผ primary key์ ์ฃผ๊ณ , DAO์ ๋ง๋ค๋ผ๊ณ ์ํค์!!
โ ๊ฒฐ๊ณผ์ ์ผ๋ก DAO์ ๋ฐ๋ก ๋ง๋ค ํ์๊ฐ ์๋ค!
Spring Data JPA
๋ค์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํด์ฃผ๋ ๋ฐฉ์
public interface ProductRepository extends CrudRepository<Entity Type, Primary Key type>{}
primarykey๋ฅผ ์ฃผ๋๊ฒ์๋๋ผ primarykey์ ํ์ ์ ์ฃผ๋๊ฑฐ๋ค!!!!!!!!!!!!!!
์ด๋ฐ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๊ณ ์ด๊ฑธ ์๋์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
findAll()
findById()
save()
deleteById()
JpaRepository<T, ID> โ PagingAndSortingRepository<T, ID> โ CrudRepository<T, ID>
(๊ฐ์ฅ ํ๋จ)
PagingAndSortingRepository์์๋
Pageable paging = PageRequest.of(pageNo, pageSize, Sort.by(""));
์ด๋ ๊ฒ ๋ง๋ค์ด์ ์ฌ์ฉํ๊ณ ์ธ์๋ก๋ ํ์ด์ง๋ฒํธ, ํ์ด์ง์ ๋ช๊ฐ ๋ค์ด๊ฐ ๊ฒ์ธ๊ฐ , ๋ญ๋ก ์ ๋ฆฌํ ๊ฒ์ธ์ง
Test๊ณผ์ ์์ @Test๋ผ๋ ์ ๋ ธํ ์ด์ ์ ํด๋์ค์ ๋ถํ๋ค.
ํด๋์ค ์์์ assertNotNull() ์ธ์๋ก ๋ค์ด๊ฐ๊ฒ์ด null์ด ๋๋ฉด ์๋๋ค, assertEquals(๋น๊ต1, ๋น๊ต2)์ ๋ง๋์ง ํ์ธ
Query Method
์๋๋ CrudRepository์์ ์ ๊ณตํด์ฃผ๋ ํจ์๋ค๋ง ์ฌ์ฉ์ ํ์๋๋ฐ , ๋ค๋ฅธ ํ์ํ ์ฟผ๋ฆฌ๊ฐ ์๊ธธ์๋ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค!!! ๊ทธ๋์ ์ด๋ฐ ๋ถ๋ถ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ฐ๋ฆฌ๋ง์ custom ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑ
method์ด๋ฆ๋ง ์ฃผ๋ฉด dynamic query generation์ ๊ธฐ๋ฐํด์ ๋ง๋ ๋ค.
= ๋ฉ์๋๋ง ๋ง๋ค์ด์ฃผ๋ฉด ๋ฉ์๋ ์ด๋ฆ์ ๋ณด๊ณ ์๋์ผ๋ก sql๋ฌธ์ ๊ตฌํํด์ค๋ค.
๋์ ๋ง๋๋ ๋ฉ์๋๋ find + By + ๋ณ์์ด๋ฆ ๋ฐฉ์์ผ๋ก ๋ง๋ค์ด์ผ๋ง ํ๋ค!!
And, Or, LessThan, GreaderThan, IsNull, Null, IsNotNull, NotNull, Like, NotLike, StartingWith, EndingWith, Containing ๋ฑ์ ํค์๋๋ค์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค
findByTitleContainingOrContentContaining(String title, String content);
= ์ ๋ชฉ์ 17์ด ํฌํจ๋์ด์๊ฑฐ๋ ๋ด์ฉ์ 17์ด ํฌํจ๋์ด์๋ ํญ๋ชฉ์ ์ฐพ๋๋ค.
ํ์ด์ง๋จ์๋ก ์กฐํํ๊ณ ์ถ๋ค๋ฉด
Pageable paging = PageRequest(0,5); โ ํ์ด์ง๋ฒํธ(0๋ถํฐ์์), ํ์ด์ง์ฌ์ด์ฆ(ํ์ด์ง์ ๋ช๊ฐ๋ฅผ ๋ด์ ๊ฒ์ธ์ง)
findByTitleContaining(String keyword, paging); ์๋ ๊ฒ ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค
@Query Annotation : JPQL
๋๋ฌด ๋ณต์กํ ์ฟผ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋
@Query("์ฟผ๋ฆฌ๋ฌธ~")
ํจ์
์ด๋ฐ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
Positional parameter binding ๋ฐฉ์
์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ ๋ ?์ซ์์์น์ ์ง์ด๋ฃ์ด๋๊ณ ๋ฐ์ ํจ์์์ ๋งค๊ฐ๋ณ์์์ ?์ ๋ค์ด๊ฐ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด binding๋์ด์ ์คํ๋๋ค
Name parameter binding ๋ฐฉ์
์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ ๋ :๋ณ์์ด๋ฆ ์ด๋ ๊ฒ ์ง์ด๋ฃ์ด๋๊ณ ๋ฐ์ ํจ์์์ ๋งค๊ฐ๋ณ์ ์์ @Param("๋ณ์์ด๋ฆ") ์ด๋ ๊ฒ ๊ฐ์ ์ง์ ํด์ฃผ๋ฉด ์์์ binding ๋์ด์ ์คํ๋๋ค
์๋๋ JPQL๋ฐฉ์์ผ๋ก ์์ฑ์ํ์ง๋ง ๋ง์ฝ native SQL์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด native๋ก ์์ฑํ์ ,nativeQuery=true์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค
href="/new"
vs th:href ="/new"
context-path : helloSpring
href โ localhost:8080/new
th:href โ localhost:8080/helloSpring/new
schema.sql์ด๋ผ๋ ํ์ผ์ ๋ง๋ค์ด์ ์๋์ผ๋ก ํ ์ด๋ธ์ ๋ง๋๋๊ฒ๋ ๊ฐ๋ฅํ๊ณ , ์๋๋ฉด ๊ตณ์ด schema.sqlํ์ผ์ ๋ง๋ค์ง ์๊ณ , application.properties์์
spring.jpa.generate-ddl = true , spring.jpa.hibernate.ddl-auto=create๋ผ๋ ์ค์ ๊ฐ์ ์ค์ ์๋์ผ๋ก ๊ฐ์ด ๋ค์ด๊ฐ๋๋กํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค
spring.jpa.hibernate.ddel-auto=create์ ์ฃผ๊ฒ ๋๋ฉด ์๋์ผ๋ก ํ ์ด๋ธ์ ๋ง๋ค์ด์ค๋ค!
Last updated
Was this helpful?