
๐ก 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.Pageof(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 ์ปจํธ๋กค์ด ๊ฐ๋ฅํ๊ฒ ํฐ ์ฅ์ ์ด๋ค.
- ์ฐธ๊ณ ๋ด์ฉ
๐ ์ฝ๋๋ก ๋ฐฐ์ฐ๋ ์คํ๋ง ๋ถํธ ์นํ๋ก์ ํธ