๐ก 1์ฅ ๋ณต์ต ์ดํ์ ๋ด์ฉ์ ๋๋ค.
1์ฅ ๋ณต์ต์์ ์ธ๊ธํ Spring Data JPA๋ JPA์ ๊ตฌํ์ฒด์ธ Hibernate๋ฅผ ์ด์ฉํ๊ธฐ ์ํ API๋ค์ ์ ๊ณตํ๋ค. ์ด ์ค ๋ง์ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํ๋ ๊ฒ์ด JpaRepository ๋ผ๋ ์ธํฐํ์ด์ค์ด๋ค.
Spring Data JPA์์๋ ์ฌ๋ฌ ํ์ ์ ์ธํฐํ์ด์ค ๊ธฐ๋ฅ์ ํตํด JPA ์์ ์ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ง์ํด์ค๋ค.
โ
CRUD ๊ธฐ๋ฅ
โ
ํ์ด์ง ์ฒ๋ฆฌ
โ
์ ๋ ฌ ๊ธฐ๋ฅ
์ด๋ ๊ฒ ์ข์ ๊ธฐ๋ฅ๋ค์ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ค์ ํธ์ถํ๋ ํํ๋ก ์์ผ๋ฉฐ ์ํ๋ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ์์์ผ๋ก ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํด์ฃผ๊ณ ์๋ค.
์ด๋ ๋ฏ JpaRepository๋ ์์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ธ๋ง ํด์ฃผ๋ ๊ฒ์ผ๋ก ๊ตฌํ์ด ๋๋๋ค.
BookRepository Interface
package springbootstudy.ch1.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import springbootstudy.ch1.entity.BookMarket;
/* JpaRepository ์ธํฐํ์ด์ค๋ฅผ ์์ */
public interface BookRepository extends JpaRepository<BookMarket, Long> {
}
์ด์ฒ๋ผ JpaRepository๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ํฐํฐ์ ์ ๋ณด์ @Id์ ํ์
์ ์ง์ ํ๋ค.
์ด๋ ๊ฒ ๋๋ฉด ์คํ๋ง์ด ๋ด๋ถ์ ์ผ๋ก ์ธํฐํ์ด์ค ํ์
์ ๋ง๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์คํ๋ง์ ๋น(Bean)์ผ๋ก ๋ฑ๋ก์ด ๋๋ค!
์์์ ๊ตฌํํ ์ธํฐํ์ด์ค๋ฅผ ํตํด SQL๋ฌธ ์์ด ์๋์ ๋ฉ์๋๋ค์ ํตํด CRUD ์์ ์ด ๊ฐ๋ฅํ๋ค.
save(Entity)
findById(Key)
, getOne(Key)
save(Entity)
DeleteById(Key)
, Delete(Entity)
โ ๏ธ : ์ฌ๊ธฐ์
Insert
์Updata
์์ ์ ์ฌ์ฉํ๋ ๋ฉ์๋๊ฐsave()
๋ก ๋์ผํ๋ฐ, ์ด๋ JPA ๊ตฌํ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ ํ ๊ฐ์ด ์์ ๊ฒฝ์ฐInsert
, ์กด์ฌํ ๊ฒฝ์ฐUpdate
๋ฅผ ๋์์ํค๋ ๋ฐฉ์์ด๋ค.
ํ
์คํธ ์ฝ๋์ธ BookRepoTest.java
package springbootstudy.ch1.repository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/* ํ
์คํธ ์ ์ ์์กด์ฑ ์ฃผ์
ํ์ธ */
@SpringBootTest
public class BookRepoTest {
@Autowired
BookRepository bookRepository;
@Test
public void testClass() {
// ์ธํฐํ์ด์ค ํ์
์ ์ค์ ๊ฐ์ฒด ํ์ธ
System.out.println(bookRepository.getClass().getName());
}
}
โ ํ ์คํธ ์ ์ BookRepository์ ์์กด์ฑ ์ฃผ์ ์ด ๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํ๋ ๊ฒ์ด ์ข๋ค.
๊ฒฐ๊ณผ
ํด๋น ํด๋์ค๊ฐ ๋์ ํ๋ก์๋ผ๋ ๋ฐฉ์์ผ๋ก ๋ง๋ค์ด์ ธ ์ถ๋ ฅ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Insert
ํ
์คํธ
Insert
์์ ์ ๋ค์๊ณผ ๊ฐ์ด ์ ๊ณต๋๋ ๋ฉ์๋๋ฅผ ํตํด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
save()
๋ฑ๋ก ํ ์คํธ๋ ํ๊บผ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ ์ฅํ๋๋ก ์์ฑํด๋ดค๋ค.
package springbootstudy.ch1.repository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import springbootstudy.ch1.entity.BookMarket;
import java.util.stream.IntStream;
@SpringBootTest
public class BookRepoTest {
@Autowired
BookRepository bookRepository;
@Test
public void testInsert() {
IntStream.rangeClosed(1,50).forEach(i -> {
BookMarket bookMarket = BookMarket.builder().bookName("์ฑ
์ํ ๋ฒํธ : " + i).build();
bookRepository.save(bookMarket);
});
}
}
testInsert()
๋ฉ์๋ ๋ด๋ถ ๋ด์ฉ์, BookMarket
๊ฐ์ฒด๋ฅผ ์์ฑํด์ฃผ๊ณ ์ธํฐํ์ด์ค ์์ ๋ฐ์ ๊ฐ์ฒด bookRepository
๋ฅผ ํตํด 50๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์คฌ๋ค.
โ
ํ์ฌ BookMarket
๊ฐ์ฒด์bookName
์ ์กฐ๊ฑด์ด Not Null ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋์ ๋ฃ์ด์ค์ผ ํ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด๋ถ ํ์ธ ๊ฒฐ๊ณผ
SELECT
ํ
์คํธ์กฐํ ์์ ์ ํ ์คํธ๋ ๋ค์์ ๋ฉ์๋๋ค์ ํตํด ๊ฐ์ฒด ์กฐํ๊ฐ ๊ฐ๋ฅํ๋ค.
findById()
getOne()
์๋ก ๋์ ๋ฐฉ์์ด ์กฐ๊ธ์ฉ ๋ค๋ฅด๋ค.
findByID()
@Test
public void selectTest() {
int bookNumber = 180; // ์์ ์กฐํ ๋ฒํธ
Optional<BookMarket> result = bookRepository.findById(bookNumber);
System.out.println("=========== Hibernate ์ฒดํฌ ===========");
System.out.println(result);
}
}
findById
์ ๊ฒฝ์ฐ Optional
ํ์
์ผ๋ก ๋ณํ๋๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋์ง ์ฒดํฌํ๋ ํํ๋ก ์์ฑํ๊ฒ ๋ผ์ ์๋์ ๊ฐ์ ๋ก๊ทธ๊ฐ ํฐ๋ฏธ๋์ ๊ธฐ๋ก๋๋ค.
๊ฒฐ๊ณผ
getOne()
๋ฉ์๋์ ๊ฒฝ์ฐ Transactional
์ด๋
ธํ
์ด์
์ด ์ถ๊ฐ์ ์ผ๋ก ํ์ํ๋ค.
getOne()
@Transactional
@Test
public void selectGetOneTest() {
int bookNumber = 190; // ์์ ์กฐํ ๋ฒํธ
BookMarket bookMarket = bookRepository.getOne(bookNumber);
System.out.println("=========== Hibernate ์ฒดํฌ ===========");
System.out.println(bookMarket);
}
getOne
์ ๊ฒฝ์ฐ ๋ฆฌํด ๊ฐ์ ํ๋ผ๋ฏธํฐ ๊ฐ์ฒด์ด์ง๋ง, SQL์ ๋ฐ๋ก ์คํํ์ง ์๋๋ค.
์์ ํฐ๋ฏธ๋ ๊ฒฐ๊ณผ์ฒ๋ผ ์ถ๋ ฅ์ด ๋จผ์ ๋๊ณ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์๊ฐ์ SQL๋ฌธ์ด ์คํ๋๋ค.
UPDATE
ํ
์คํธ
Update
๋Insert
์ ๋์ผํ๊ฒsave()
๋ฉ์๋๋ฅผ ์ด์ฉํด ์ฒ๋ฆฌํ๋ค.
๋ฉ์๋ ์๋ ์ ๋ด๋ถ์์๋ ํด๋น Entity
์ ๊ฐ์ด ์ผ์นํ๋์ง ํ์ธ ํ
Insert
๋๋ Update
์ฒ๋ฆฌํ๋ค.
@Test
public void updateTest() {
/* ๋ฉค๋ฒ ๋ฒํธ 50 ์
๋ฐ์ดํธ
* ์ฑ
์ด๋ฆ ์
๋ฐ์ดํธ : ๋๋ ๊ณ ์์ด๋ก์์ด๋ค */
BookMarket bookMarket = BookMarket.builder().memberNo(200).bookName("๋๋ ๊ณ ์์ด๋ก์์ด๋ค").build();
System.out.println(bookRepository.save(bookMarket));
}
๊ฒฐ๊ณผ
ํฐ๋ฏธ๋ ๋ด๋ถ์์ ํ์ธํ ์ ์๋ฏ์ดJPA๊ฐ ์ง์ ํ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ์ง
Select
๋ก ๊ฒ์ ํ Update
๋๋ Insert
์์
ํ ์ง ์ ํ๋ค.
DELETE
ํ
์คํธ
์ญ์
๋ํ ๋์ผํ๊ฒ ์์ ์ผ ํ ๊ฐ์ฒด๊ฐ ์กด์ฌํ ์ง ํ์ธ ํ ์์ ์ ์คํํ๋ค.
deleteById()
์ฝ๋
@Test
public void deleteTest() {
// ๋ฒํธ 51 - 200๋ฒ ๊น์ง์ ๋ฐ์ดํฐ ์ญ์ .
int deleteMemberNum;
for(deleteMemberNum = 51; deleteMemberNum < 201; deleteMemberNum++) {
bookRepository.deleteById(deleteMemberNum);
}
}
๊ฒฐ๊ณผ
Hibernate:
select
b1_0.member_no,
b1_0.book_name
from
table_book_market b1_0
where
b1_0.member_no=?
Hibernate:
delete
from
table_book_market
where
member_no=?
ํฐ๋ฏธ๋ ๋ด๋ถ ๋ชจ์ต์ด๋ค. select
์์
ํ delete
๊ฐ ์คํ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ฐ์ดํฐ๊ฐ ๋ง๋ํ ์ฌ๋ผ์ก๋ค!
Paging
์ฒ๋ฆฌ
- ํ์ด์ง(Paging) : ๋ง์ ๋ฐ์ดํฐ๋ค ์ค ํ์ํ ๋ฐ์ดํฐ๋ค๋ง์ ๋ณด์ฌ์ฃผ๋ ์ฒ๋ฆฌ ๋ฐฉ์์ด๋ค.
Spring Data JPA
์์๋ ํ์ด์ง ์ฒ๋ฆฌ ๋ฐ ์ ๋ ฌ์ findAll()
๋ฉ์๋๋ฅผ ํตํด ์์
ํ๋ค.
โ ๏ธ ์ฃผ์ํ ์ฌํญ !
Pageable
์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ํ๋ผ๋ฏธํฐ ํ์
์ Pageable
๋ก ์ง์ ํด์ค์ผ ํ๋ค.ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ์ํด์๋ Pageable
์ธํฐํ์ด์ค๊ฐ ๋ฐ๋์ ํ์ํ๋ค.
new
๊ฐ ์๋ static
ํ์
of()
๋ฉ์๋๋ฅผ ํตํด ์ฒ๋ฆฌํ๋ค.org.springframework.data.domain.Page
of(int page, int size)
- 0๋ถํฐ ์์ํ๋ ํ์ด์ง ๋ฒํธ์ ๊ฐ์
of(int page, int size, Sort.Direction direction, String props)
- 0๋ถํฐ ์์ํ๋ ํ์ด์ง ๋ฒํธ์ ๊ฐ์ & ์ ๋ ฌ ๋ฐฉํฅ ๋ฐ ์ ๋ ฌ ๊ธฐ์ค ํ๋
of(int page, int size, Sort sort)
- ํ์ด์ง ๋ฒํธ์ ๊ฐ์ & ์ ๋ ฌ ์ ๋ณด
์ด๋ฅผ ์ฐธ๊ณ ํด์ ํ ์คํธ๋ฅผ ํด๋ดค๋ค.
ํ ์คํธ ์ฝ๋
@Test
public void PagingTest() {
Pageable pageable = PageRequest.of(0,10);
Page<BookMarket> pageResult = bookRepository.findAll(pageable);
System.out.println("ํ์ด์ง ์ฒ๋ฆฌ ๊ฒฐ๊ณผ : " + pageResult);
System.out.println("์ด ํ์ด์ง ๊ฐ์ : " + pageResult.getTotalPages());
System.out.println("์ ์ฒด ๊ฐ์ : " + pageResult.getTotalElements()); // ํ์ด์ง ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ์ ๊ฐ์
System.out.println("ํ์ฌ ํ์ด์ง์ ๋ฒํธ : " + pageResult.getNumber());
System.out.println("ํ ํ์ด์ง์ ๋ฐ์ดํฐ ๊ฐ์ : " + pageResult.getSize());
System.out.println("๋ค์ ํ์ด์ง์ ์กด์ฌ ์ฌ๋ถ(T/F) : " + pageResult.hasNext());
System.out.println("ํ์ฌ ํ์ด์ง์ ์ฒซ ๋ฒ์งธ ์ฌ๋ถ(T/F) : " + pageResult.isFirst());
}
๊ฒฐ๊ณผ
ํ์ด์ง ์ฒ๋ฆฌ ๊ฒฐ๊ณผ : Page 1 of 6 containing
springbootstudy.ch1.entity.BookMarket instances
์ด ํ์ด์ง ๊ฐ์ : 6
์ ์ฒด ๊ฐ์ : 51
ํ์ฌ ํ์ด์ง์ ๋ฒํธ : 0
ํ ํ์ด์ง์ ๋ฐ์ดํฐ ๊ฐ์ : 10
๋ค์ ํ์ด์ง์ ์กด์ฌ ์ฌ๋ถ(T/F) : true
ํ์ฌ ํ์ด์ง์ ์ฒซ ๋ฒ์งธ ์ฌ๋ถ(T/F) : true
ํ์ฌ ๋ฐ์ดํฐ๊ฐ 51๊ฐ์ด๊ณ , 10๊ฐ์ ๋ฐ์ดํฐ์ฉ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ์ฌ 6๊ฐ์ ํ์ด์ง๊ฐ ์กด์ฌํ๋ค.
getContent()
๋ฉ์๋๋ฅผ ํตํด ํ์ด์ง ๋ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๋ค.
for(BookMarket bm : pageResult.getContent()) {
System.out.println(bm);
}
BookMarket(memberNo=202, bookName=์ฑ
์ํ ๋ฒํธ : 202)
BookMarket(memberNo=203, bookName=์ฑ
์ํ ๋ฒํธ : 203)
BookMarket(memberNo=204, bookName=์ฑ
์ํ ๋ฒํธ : 204)
BookMarket(memberNo=205, bookName=์ฑ
์ํ ๋ฒํธ : 205)
BookMarket(memberNo=206, bookName=์ฑ
์ํ ๋ฒํธ : 206)
BookMarket(memberNo=207, bookName=์ฑ
์ํ ๋ฒํธ : 207)
BookMarket(memberNo=208, bookName=์ฑ
์ํ ๋ฒํธ : 208)
BookMarket(memberNo=209, bookName=์ฑ
์ํ ๋ฒํธ : 209)
BookMarket(memberNo=210, bookName=์ฑ
์ํ ๋ฒํธ : 210)
BookMarket(memberNo=211, bookName=์ฑ
์ํ ๋ฒํธ : 211)
Query Methods
๐ก ์ฟผ๋ฆฌ ๋ฉ์๋
๋ฉ์๋์ ์ด๋ฆ ์์ฒด๊ฐ ์ฟผ๋ฆฌ์ ๊ตฌ๋ฌธ์ผ๋ก์ ์ฒ๋ฆฌ๋๋ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์๋ ๋ฉ์๋
์ฟผ๋ฆฌ ๋ฉ์๋๋ ์ฌ์ฉํ๋ ํค์๋์ ๋ฐ๋ผ ํ๋ผ๋ฏธํฐ์ ๊ฐ์๊ฐ ๊ฒฐ์ ๋๋ค.
ํ๋ผ๋ฏธํฐ ํ์
์ง์ ์ ์ค์ํ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ๋ค.
Select
: List
ํ์
์ด๋ Array
๋ฑ์ ๋ฐฐ์ด์ ์ฌ์ฉํ ์ ์๋ค.Pageable
: ๋ฌด์กฐ๊ฑด Page<E>
ํ์
์ผ๋ก ์ง์ ํด์ค์ผํ๋ค.ํ ์คํธ
๋จผ์ JPARepository
๋ฅผ ์์๋ฐ์ ์ธํฐํ์ด์ค์ ์ฟผ๋ฆฌ ๋ฉ์๋๋ฅผ ์์ฑํ๋ค.
package springbootstudy.ch1.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import springbootstudy.ch1.entity.BookMarket;
import java.util.List;
public interface BookRepository extends JpaRepository<BookMarket, Integer> {
List<BookMarket> findByMemberNoBetweenOrderByMemberNoDesc(Integer from, Integer to);
}
๋ฉ์๋ ์ด๋ฆ์ ๊ฐ๋
์ฑ์ด ๋ฎ์ง๋ง.. ํด์ํด๋ณด๋ฉด memberNo
๋ฅผ ๊ธฐ์ค์ผ๋ก Between
๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ OrderBy
๋ฅผ ์ ์ฉํ๊ณ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ ์ง์๋ฌธ์ด๋ผ๊ณ ๋ณผ ์์๋ค.
@Test
public void queryMethodsTest() {
List<BookMarket> list = bookRepository.findByMemberNoBetweenOrderByMemberNoDesc(210,220);
for(BookMarket bm : list) {
System.out.println("์ฟผ๋ฆฌ ๋ฉ์๋ ์ ์ฉ ๊ฒฐ๊ณผ : " + bm);
}
}
Hibernate:
select
b1_0.member_no,
b1_0.book_name
from
table_book_market b1_0
where
b1_0.member_no between ? and ?
order by
b1_0.member_no desc
์ฟผ๋ฆฌ ๋ฉ์๋ ์ ์ฉ ๊ฒฐ๊ณผ : BookMarket(memberNo=220, bookName=์ฑ
์ํ ๋ฒํธ : 220)
์ฟผ๋ฆฌ ๋ฉ์๋ ์ ์ฉ ๊ฒฐ๊ณผ : BookMarket(memberNo=219, bookName=์ฑ
์ํ ๋ฒํธ : 219)
์ฟผ๋ฆฌ ๋ฉ์๋ ์ ์ฉ ๊ฒฐ๊ณผ : BookMarket(memberNo=218, bookName=์ฑ
์ํ ๋ฒํธ : 218)
์ฟผ๋ฆฌ ๋ฉ์๋ ์ ์ฉ ๊ฒฐ๊ณผ : BookMarket(memberNo=217, bookName=์ฑ
์ํ ๋ฒํธ : 217)
์ฟผ๋ฆฌ ๋ฉ์๋ ์ ์ฉ ๊ฒฐ๊ณผ : BookMarket(memberNo=216, bookName=์ฑ
์ํ ๋ฒํธ : 216)
์ฟผ๋ฆฌ ๋ฉ์๋ ์ ์ฉ ๊ฒฐ๊ณผ : BookMarket(memberNo=215, bookName=์ฑ
์ํ ๋ฒํธ : 215)
์ฟผ๋ฆฌ ๋ฉ์๋ ์ ์ฉ ๊ฒฐ๊ณผ : BookMarket(memberNo=214, bookName=์ฑ
์ํ ๋ฒํธ : 214)
์ฟผ๋ฆฌ ๋ฉ์๋ ์ ์ฉ ๊ฒฐ๊ณผ : BookMarket(memberNo=213, bookName=์ฑ
์ํ ๋ฒํธ : 213)
์ฟผ๋ฆฌ ๋ฉ์๋ ์ ์ฉ ๊ฒฐ๊ณผ : BookMarket(memberNo=212, bookName=์ฑ
์ํ ๋ฒํธ : 212)
์ฟผ๋ฆฌ ๋ฉ์๋ ์ ์ฉ ๊ฒฐ๊ณผ : BookMarket(memberNo=211, bookName=์ฑ
์ํ ๋ฒํธ : 211)
์ฟผ๋ฆฌ ๋ฉ์๋ ์ ์ฉ ๊ฒฐ๊ณผ : BookMarket(memberNo=210, bookName=์ฑ
์ํ ๋ฒํธ : 210)
Pageable
ํ์ฉ๋ฐฉ๊ธ๊ณผ ๊ฐ์ด OrderBy
๋ฑ์ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌ ๋ฉ์๋์ ์ด๋ฆ์ด ๊ธธ์ด์ง๊ธฐ ๋๋ฌธ์ Pageable
์ ์ด์ฉํด ์ ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด ๊ฐ๋จํ๊ฒ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
ํ ์คํธ
Page<BookMarket> findByMemberNoBetween(Integer from, Integer to, Pageable pageable);
@Test
public void pageableQueryMethodsTest() {
/* ์ค๋ฆ์ฐจ์ ์ ๋ ฌ */
Pageable pageable = PageRequest.of(0,10, Sort.by("memberNo").ascending());
Page<BookMarket> result = bookRepository.findByMemberNoBetween(240,250,pageable);
result.get().forEach(bookMarket -> System.out.println(bookMarket));
}
๊ฒฐ๊ณผ
Hibernate:
select
count(b1_0.member_no)
from
table_book_market b1_0
where
b1_0.member_no between ? and ?
BookMarket(memberNo=240, bookName=์ฑ
์ํ ๋ฒํธ : 240)
BookMarket(memberNo=241, bookName=์ฑ
์ํ ๋ฒํธ : 241)
BookMarket(memberNo=242, bookName=์ฑ
์ํ ๋ฒํธ : 242)
BookMarket(memberNo=243, bookName=์ฑ
์ํ ๋ฒํธ : 243)
BookMarket(memberNo=244, bookName=์ฑ
์ํ ๋ฒํธ : 244)
BookMarket(memberNo=245, bookName=์ฑ
์ํ ๋ฒํธ : 245)
BookMarket(memberNo=246, bookName=์ฑ
์ํ ๋ฒํธ : 246)
BookMarket(memberNo=247, bookName=์ฑ
์ํ ๋ฒํธ : 247)
BookMarket(memberNo=248, bookName=์ฑ
์ํ ๋ฒํธ : 248)
BookMarket(memberNo=249, bookName=์ฑ
์ํ ๋ฒํธ : 249)
deleteBy
์ฟผ๋ฆฌ ๋ฉ์๋๋ฅผ
deleteBy
๋ก ์์ํ์ฌ ์์ฑํ๋ฉด ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ ์ญ์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
ํ ์คํธ
public interface BookRepository extends JpaRepository<BookMarket, Integer> {
void deleteBookMarketByMemberNoLessThan(Integer number);
}
@Commit
@Transactional
@Test
public void deleteQueryMethodsTest() {
/* ๋ฉค๋ฒ ๋ฒํธ๊ฐ 230 ์ดํ์ธ ๋ฐ์ดํฐ ์ญ์ . */
bookRepository.deleteBookMarketByMemberNoLessThan(230);
}
๊ฒฐ๊ณผ
Commit
์ด๋
ธํ
์ด์
: ์ต์ข
๊ฒฐ๊ณผ๋ฅผ ์ปค๋ฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ด๋
ธํ
์ด์
Transactional
์ด๋
ธํ
์ด์
: select
๋ฌธ์ผ๋ก ์ํฐํฐ ๊ฐ์ฒด๋ค์ ๊ฐ์ ธ์ค๋ ์์
& ์ํฐํฐ๋ฅผ ์ญ์ ํ๋ ์์
์ ๊ฐ์ด ํ๊ธฐ ์ํ ์ด๋
ธํ
์ด์
Query
์ด๋
ธํ
์ด์
๐ก
@Query
SQL
๊ณผ ์ ์ฌํ ์ํฐํฐ ํด๋์ค์ ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์๋ ์ด๋ ธํ ์ด์
์ฟผ๋ฆฌ ๋ฉ์๋๋ ๋ณต์กํ ์กฐ๊ฑด์ ์ฒ๋ฆฌํด์ผ ํ ๊ฒฝ์ฐ ๋ฉ์๋ ์ด๋ฆ์ด ๊ธธ์ด์ง๋ ๋ฑ,
๋ถํธํ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ ์ด๋
ธํ
์ด์
์ ์ด์ฉํ ์ ์๋ค.
์ฟผ๋ฆฌ ์ด๋ ธํ ์ด์ ์ ํตํด ๋ค์๊ณผ ๊ฐ์ ์์ ์ด ๊ฐ๋ฅํ๋ค.
โ
ํ์ํ ๋ฐ์ดํฐ๋ง ์ ๋ณ์ ์ผ๋ก ์ถ์ถ ํ๋ ์์
๊ธฐ๋ฅ
โ
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ง๋ ์์ํ SQL(Native SQL)
์์ฑ ๊ธฐ๋ฅ
โ
Insert
, Update
, Delete
์ ๊ฐ์ DML
์ฒ๋ฆฌ ๊ธฐ๋ฅ
๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ๋ ํ
์ด๋ธ ๋์ Entity
ํด๋์ค๋ฅผ ์ด์ฉํ๋ฉฐ ํด๋์ค ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ด์ฉํด ์์ฑํ๋ค.
@Query("select m fro BookMarket m order by m.meberNo desc")
List<BookMarket> getListDesc();
์ฟผ๋ฆฌ ์ด๋
ธํ
์ด์
์ ๊ฒฝ์ฐ SQL
๋ฌธ๊ณผ ์ ์ฌํ๊ธฐ ๋๋ฌธ์ where
๋ฌธ๊ณผ ๊ฐ์ ํ๋ผ๋ฏธํฐ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋๊ฐ ๋ง๋ค. ์ด ๋ ์์ฑ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
ํ๋ผ๋ฏธํฐ
์์๋ฅผ ์ด์ฉํ ๋ฐฉ์':xxx'
์ ๊ฐ์ด ':ํ๋ผ๋ฏธํฐ ์ด๋ฆ'
์ ์ฌ์ฉํ๋ ๋ฐฉ์:#{}
์ ์ด์ฉํ๋ ์๋ฐ ๋น ์คํ์ผ์ ์์ฑ ๋ฐฉ์๋ ๋ฒ์งธ ๋ฐฉ์์ ์ด์ฉํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
@Transactional
@Modifying
@Query("update BookMarket m set m.bookName = :bookName where m.memberNo = :memberNo")
int updateBookName(@Param("memberNo") int memberNo, @Param("bookName") String bookName);
์ฌ๊ธฐ์ ํ๋ผ๋ฏธํฐ ์ ๋ฌ์ ์ฌ๋ฌ ๊ฐ ํด์ผํ๋ค๋ฉด :#
์ ์ด์ฉํด ๊ฐ์ฒด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์ํฐํฐ ๊ฐ์ฒด ์์ฒด๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํด์ฃผ๋ฉด ๋๋ค.
@Transactional
@Modifying
@Query("update BookMarket m set m.bookName = :#{#param.bookName} where m.memberNo = :#{#param.memberNo}")
int updateBookName(@Param("param") BookMarket bookMarket); // ํ๋ผ๋ฏธํฐ๋ฅผ ์ํฐํฐ ๊ฐ์ฒด ์์ฒด๋ก ์ ์ฉํ๋ค.
Native SQL
๐ก Native SQL์ ์ฟผ๋ฆฌ ์ด๋ ธํ ์ด์ ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ค ํ๋๋ค.
๋ฐ์ดํฐ ๋ฒ ์ด์ค์SQL
๊ตฌ๋ฌธ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
/* Native SQL */
@Query(value = "select * from BookMarket where memberNo > 50" , nativeQuery = true)
List<Object[]> nativeSQLSelect();
์คํ๋ง ๋ถํธ๋ ๊ฐ๋ฐ์๊ฐ ์ข์ํ ๋งํ ์์๋ ๋ค ๋ฃ์๋ฏ ํ๋ค! ๐ค
ํนํ ๊ท์ฐฎ๊ฒ ์๋ค๊ฐ๋ค ํ ์ผ ์์ด ์คํ๋ง ๋ถํธ ๋ด๋ถ์์๋ DB ์ปจํธ๋กค์ด ๊ฐ๋ฅํ๊ฒ ํฐ ์ฅ์ ์ด๋ค.
- ์ฐธ๊ณ ๋ด์ฉ
๐ ์ฝ๋๋ก ๋ฐฐ์ฐ๋ ์คํ๋ง ๋ถํธ ์นํ๋ก์ ํธ