# [Spring Data JPA] ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA
Study Repository

[Spring Data JPA] ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA

by rlaehddnd0422

Spring Data JPA๋ž€?

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ JPA๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

 

์ฃผ ๊ธฐ๋Šฅ

- CRUD ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณต

- Repository ๊ณ„์ธต์— ๊ตฌํ˜„ ํด๋ž˜์Šค ์—†์ด ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ž‘์„ฑํ•˜๋ฉด  ์‹คํ–‰ ์‹œ์ ์— ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๊ฐ€ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑ ๋ฐ ์ฃผ์ž…

- ๊ณตํ†ต ๋ฉ”์†Œ๋“œ๋Š” ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๊ฐ€ ์ œ๊ณตํ•˜๋Š”  org.springframework.date.jpa.repository.JpaRepository ์ธํ„ฐํŽ˜์ด์Šค์—

  count, delete, deleteAll, deleteAll, deleteById, existsById, findById, save ๋“ฑ์ด ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

build.gradle์— ์˜์กด๊ด€๊ณ„ ์ถ”๊ฐ€ 

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ณ„์ธต์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์„ ์–ธํ•˜๊ณ  JpaRepository๋ฅผ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค.

 

- JpaRepository.interface

public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {

    @Override
    List<T> findAll();

    @Override
    List<T> findAll(Sort sort);

    @Override
    List<T> findAllById(Iterable<ID> ids);

    @Override
    <S extends T> List<S> saveAll(Iterable<S> entities);

    void flush();

    <S extends T> S saveAndFlush(S entity);

    <S extends T> List<S> saveAllAndFlush(Iterable<S> entities);

    @Deprecated
    default void deleteInBatch(Iterable<T> entities){deleteAllInBatch(entities);}

    void deleteAllInBatch(Iterable<T> entities);

    void deleteAllByIdInBatch(Iterable<ID> ids);

    void deleteAllInBatch();

    @Deprecated
    T getOne(ID id);

    T getById(ID id);

    @Override
    <S extends T> List<S> findAll(Example<S> example);

    @Override
    <S extends T> List<S> findAll(Example<S> example, Sort sort);
}

 

- JpaRepository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๊ณ , ์ œ๋„ค๋ฆญ์— ๊ด€๋ฆฌํ•  <์—”ํ‹ฐํ‹ฐ, ์—”ํ‹ฐํ‹ฐID>๋ฅผ ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 


๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋Šฅ

public interface SpringDataJpaItemRepository extends JpaRepository<Item,Long> {

    List<Item> findByItemNameLike(String itemName);

    List<Item> findByPriceLessThanEqual(Integer price);

    // ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ ( ์•„๋ž˜ ๋ฉ”์†Œ๋“œ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰ )
    List<Item> findByItemNameLikeAndPriceLessThanEqual(String itemName, Integer price);


    // ์ฟผ๋ฆฌ ์ง์ ‘์‹คํ–‰
    @Query("select i from Item i where i.itemName like :itemName and i.price <= :price")
    List<Item> findItems(@Param("itemName") String itemName, @Param("price") Integer price);
    
}

์ด๋ ‡๊ฒŒ JpaRepository ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ƒ์†๋ฐ›์•„๋„ Spring Data JPA๊ฐ€ ํ”„๋ก์‹œ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋Š” ๊ตฌํ˜„ ํด๋ž˜์Šค ์—†์ด ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๋งŒ๋“ค๋ฉด ๊ธฐ๋ณธ CRUD ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ ๊ธฐ๋Šฅ 

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฉ”์†Œ๋“œ ์ด๋ฆ„๋งŒ ์ ์–ด๋‘๋ฉด, ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์„ ๋ถ„์„ํ•ด์„œ ์ฟผ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹คํ–‰ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

// ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ
List<Item> findByItemNameLikeAndPriceLessThanEqual(String itemName, Integer price);

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ ๊ทœ์น™ 

- ์กฐํšŒ : find..By, read..By, query..By, get..By

- Row ์ˆ˜ COUNT : count..By ( return type : long )

- ์กด์žฌ ์—ฌ๋ถ€ : Exist : exists...By ( return type : boolean )

- ์‚ญ์ œ : delete...By, remove...By ( return type : boolean - ์‚ญ์ œ๋œ row ์ˆ˜ )

- ์ค‘๋ณต์—†๋Š” Row ์ˆ˜ Distinct : ex) findDistinct, findMemberDistinctBy 

-LIMIT : findFirst3, findFirst, findTop, findTop3

 

๊ณต์‹ ๋ฌธ์„œ ์ฐธ์กฐ

 

Spring Data JPA - Reference Documentation

Example 119. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

Distinct findDistinctByLastnameAndFirstname select distinct …โ€‹ where x.lastname = ?1 and x.firstname = ?2
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is, Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age <= ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull, Null findByAge(Is)Null … where x.age is null
IsNotNull, NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection<Age> ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection<Age> ages) … where x.age not in ?1
True findByActiveTrue() … where x.active = true
False findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstname) = UPPER(?1)

 

์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ JPQL์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” @Query ์— ์ง์ ‘ JPQL์„ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

// ์ฟผ๋ฆฌ ์ง์ ‘์‹คํ–‰
@Query("select i from Item i where i.itemName like :itemName and i.price <= :price")
List<Item> findItems(@Param("itemName") String itemName, @Param("price") Integer price);

@Query ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ทœ์น™์ด ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

JPQL์ด ์•„๋‹Œ SQL์„ ์ž‘์„ฑํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ฟผ๋ฆฌ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด nativeQuery = true ์˜ต์…˜ ์ถ”๊ฐ€ (@Param ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋ฐ”์ธ๋”ฉ์ด 0๋ถ€ํ„ฐ ์‹œ์ž‘)

 


ํŽ˜์ด์ง• ๊ธฐ๋Šฅ

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋Š” ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ์— ํŽ˜์ด์ง•๊ณผ ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

- org.springframework.data.domain.Sort : ์ •๋ ฌ ๊ธฐ๋Šฅ

- org.springframework.data.domain.Pageable : ํŽ˜์ด์ง• ๊ธฐ๋Šฅ(๋‚ด๋ถ€์— Sort ํฌํ•จ)

 

public interface SpringDataJpaItemRepository extends JpaRepository<Item,Long> {
	List<Item> findByItemNameStartingWith(String itemName, Pageable pageable);

ํŒŒ๋ผ๋ฏธํ„ฐ์— Pageable์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜ํ™˜ํƒ€์ž…์œผ๋กœ List๋‚˜ Page๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

> ๋ฐ˜ํ™˜ ํƒ€์ž…์ด Page์ธ ๊ฒฝ์šฐ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋Š” ํŽ˜์ด์ง• ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ฒ€์ƒ‰๋œ ์ „์ฒด ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜๋ฅผ ์กฐํšŒํ•˜๋Š” count์ฟผ๋ฆฌ๋ฅผ  ์ถ”๊ฐ€๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

> ๋ฐ˜ํ™˜ ํƒ€์ž…์ด List์ธ ๊ฒฝ์šฐ์—๋Š” count ์ฟผ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

ํŽ˜์ด์ง• ์กฐ๊ฑด, ์ •๋ ฌ ์กฐ๊ฑด์€ PageRequest๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

public List<Item> findByItemNameStartingWithName01(String itemName)
{
    Sort sort = Sort.by("itemName").descending();
    PageRequest pageable = PageRequest.of(0,10, sort);
    List<Item> result = repository.findByItemNameStartingWith("Name01", (Pageable) pageable);
    return result;
}

Spring Data JPA ์ ์šฉ

JpaRepository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉด ๊ธฐ๋ณธ์ ์ธ CRUD ๊ธฐ๋Šฅ๋“ค์€ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ์ž๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด๋ฉ๋‹ˆ๋‹ค.

 

1. findByItemNameLike(String itemName) : itemName๋งŒ์„ ์‚ฌ์šฉํ•ด ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ

List<Item> findByItemNameLike(String itemName);

์‹คํ–‰๋˜๋Š” JPQL ์ฟผ๋ฆฌ 

select i from Item i where i.name like itemName

2. findByPriceLessThanEqual() : price๋งŒ์„ ์‚ฌ์šฉํ•ด ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ

List<Item> findByPriceLessThanEqual(Integer price);

์‹คํ–‰๋˜๋Š” JPQL ์ฟผ๋ฆฌ

select i from Item i where i.pice <= price

 

3. findByItemNameLikeAndPriceLessThanEqual() : itemName๊ณผ price๋ฅผ ์‚ฌ์šฉํ•ด ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ

// ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ ( ์•„๋ž˜ ๋ฉ”์†Œ๋“œ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰ )
List<Item> findByItemNameLikeAndPriceLessThanEqual(String itemName, Integer price);

์กฐ๊ฑด์ด ๋งŽ์œผ๋ฉด ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์ด ๊ธธ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•ด์ง€๋Š” ๊ฒฝ์šฐ ์ง์ ‘ JPQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@Query(value = "select i from Item i where i.itemName like :itemName and i.price <= :price")
List<Item> findItems(@Param("itemName") String itemName, @Param("price") Integer price);

@Param์„ ํ†ตํ•ด ์ด๋ฆ„ ๊ธฐ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ ์‚ฌ์šฉ

@Param์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์œ„์น˜ ๊ธฐ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ์ด ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ์ด๋ฆ„ ๊ธฐ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค.

 

JpaItemRepositoryV2

@Slf4j
@Repository
@Transactional
@RequiredArgsConstructor
public class JpaItemRepositoryV2 implements ItemRepository {

    // ํ”„๋ก์‹œ๋กœ ์ž๋™์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค.
    private final SpringDataJpaItemRepository repository;

    @Override
    public Item save(Item item) {
        return repository.save(item);
    }

 

ํด๋ž˜์Šค ์˜์กด๊ด€๊ณ„

 

    @Override
    public Item save(Item item) {
        return repository.save(item);
    }

    @Override
    public void update(Long itemId, ItemUpdateDto updateParam) {
        Item findItem = repository.findById(itemId).orElseThrow();
        findItem.setItemName(updateParam.getItemName());
        findItem.setPrice(updateParam.getPrice());
        findItem.setQuantity(updateParam.getQuantity());
    }

    @Override
    public Optional<Item> findById(Long id) {
        return repository.findById(id);
    }

    @Override
    public List<Item> findAll(ItemSearchCond cond) {
        String itemName = cond.getItemName();
        Integer maxPrice = cond.getMaxPrice();

        if (StringUtils.hasText(itemName) && maxPrice != null) {
//            return repository.findByItemNameLikeAndPriceLessThanEqual(itemName, maxPrice);
            return repository.findItems("%" + itemName + "%", maxPrice);
        } else if (StringUtils.hasText(itemName)) {
            return repository.findByItemNameLike("%" + itemName + "%");
        } else if (maxPrice != null) {
            return repository.findByPriceLessThanEqual(maxPrice);
        } else {
            return repository.findAll();
        }
    }
  • JpaRepository ์— ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” CRUD ๊ธฐ๋Šฅ๊ณผ ๋ฉ”์†Œ๋“œ ์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ณ„์ธต ๊ตฌํ˜„

findAll() ๋ฉ”์†Œ๋“œ์˜ ๋™์  ์ฟผ๋ฆฌ ๋ถ€๋ถ„์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ฐ๊ฐ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ƒ๋‹นํžˆ ๋น„ํšจ์œจ์ ์ธ๋ฐ, ์ด ํ›„ Querydsl์„ ์‚ฌ์šฉํ•˜๋ฉด ๊น”๋”ํ•˜๊ฒŒ ๊ฐœ์„ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ์ดํ›„์— Querydsl์„ ์ด์šฉํ•ด ๊ฐœ์„ ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

+ Config ์„ค์ •

@Configuration
@RequiredArgsConstructor
public class SpringDataJpaConfig {
    private final SpringDataJpaItemRepository springDataJpaItemRepository;

    @Bean
    public ItemService itemService()
    {
        return new ItemServiceV1(itemRepository());
    }

    @Bean
    public ItemRepository itemRepository()
    {
        return new JpaItemRepositoryV2(springDataJpaItemRepository);
    }
}

 

+ ์˜ˆ์™ธ ๋ณ€ํ™˜

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋„ ์˜ˆ์™ธ ์ถ”์ƒํ™” ๋ณ€ํ™˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋Š” ํ”„๋ก์‹œ์—์„œ ์˜ˆ์™ธ๋ณ€ํ™˜์„ ์ฒ˜๋ฆฌํ•ด์ฃผ์–ด @Repository์— ๊ด€๊ณ„์—†์ด ์˜ˆ์™ธ๊ฐ€ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

 

<์ •๋ฆฌ>

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋Š” Querydsl๊ณผ ๋”๋ถˆ์–ด ์‹ค๋ฌด์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์„ ํƒํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. JPA์™€ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋Š” ๊ณต๋ถ€ํ•  ์–‘์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋Œ€๋žต์ ์ธ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ณด์•˜๊ณ , ์ด ์ดํ›„์— ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


<์ฐธ๊ณ ์ž๋ฃŒ>

 

Spring Data JPA - Reference Documentation

Example 119. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

 

 

์Šคํ”„๋ง DB 2ํŽธ - ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ํ™œ์šฉ ๊ธฐ์ˆ  - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ DB ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜๊ณ , ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ ์˜ ์›๋ฆฌ์™€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋” ๊นŠ์ด์žˆ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธ

www.inflearn.com

 

 

[Spring + JPA] Spring Data JPA ๋ž€? (1)

| ์†Œ๊ฐœ-- spring framework์—์„œ JPA๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ํ”„๋กœ์ ํŠธ - CRUD ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต - repository ๊ฐœ๋ฐœ ์‹œ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ž‘์„ฑํ•˜๋ฉด ์‹คํ–‰ ์‹œ์ ์— ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA

data-make.tistory.com

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ