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?