데이터 접근 기술 - 스프링 데이터 JPA

동동주·2024년 6월 3일
0

인프런_스프링 DB

목록 보기
3/3

JpaRepository

🔊기본 인터페이스

  • save(S entity) : 데이터 저장시에 사용, id를 기준으로 하여 해당 데이터가 없는 경우에는 새롭게 데이터를 생성하고, 해당 id에 해당하는 데이터가 존재하는 경우에는 기존의 데이터를 업데이트 한다.
  • findById([id타입] id) : 해당 id의 데이터 조회
  • findAll() : 모든 데이터 조회
  • deleteById() : 해당 id에 해당하는 데이터를 삭제한다.
  • deleteAll() : 테이블의 모든 데이터를 삭제한다.

🔊메서드 이름으로 쿼리 생성

Spring Data JPA는 메소드 이름을 분석하여 JPQL을 생성하고 실행한다.

  • 순수 JPA 코드
	//순수 JPA- 메소드 이름으로 쿼리 생성
    public List<Member> findByUsernameAndAgeGreaterThan(String username, int age){
        return em.createQuery("select m from Member m where m.username=:username and m.age>:age")
                .setParameter("username", username)
                .setParameter("age",age)
                .getResultList();
    }
  • Spring Data JPA
	//Spring Data JPA- 메소드 이름으로 쿼리 생성
    List<Member> findByUsernameAndAgeGreaterThan(String username, int age);

🔊메서드 생성 규칙

  • findBy~ : 조회 시 사용하며 findBy로 시작하며, 그 뒤에 조건이 온다.
    - ex) findByName, findByRole
  • And, Or, Like, NotLike, GreaterThan, LessThan, IsNull, IsNotNull, Between, In, NotIn 등의 조건 연산자 : 요구되는 조회 조건에 따라 조건 연산자가 함께 사용된다.
    - ex) findByRoleAndName name과 role이 조건인, findByNameLike name이 부분적으로 일치하는 데이터 조회 등...
  • 파라미터 : 인자에는 조회 조건과 같은 타입이 속성명을 넣어준다.
    - ex) findByName(String name);

💡ex)

findAll()

  • 코드에는 보이지 않지만 JpaRepository 공통 인터페이스가 제공하는 기능이다.
    모든 Item 을 조회한다.
    다음과 같은 JPQL이 실행된다.
    select i from Item i

findByItemNameLike()

  • 이름 조건만 검색했을 때 사용하는 쿼리 메서드이다.
    다음과 같은 JPQL이 실행된다.
    select i from Item i where i.name like ?

findByPriceLessThanEqual()

  • 가격 조건만 검색했을 때 사용하는 쿼리 메서드이다.
    다음과 같은 JPQL이 실행된다.
    select i from Item i where i.price <= ?

findByItemNameLikeAndPriceLessThanEqual()

  • 이름과 가격 조건을 검색했을 때 사용하는 쿼리 메서드이다.
    다음과 같은 JPQL이 실행된다.
    select i from Item i where i.itemName like ? and i.price <= ?

findItems()
메서드 이름으로 쿼리를 실행하는 기능은 다음과 같은 단점이 있다.
1. 조건이 많으면 메서드 이름이 너무 길어진다.
2. 조건이 같은 복잡한 조건을 사용할 수 없다.

  • 📌 메서드 이름으로 쿼리를 실행하는 기능은 간단할 경우에는 매우 유용하지만, 복잡해지면 직접 JPQL 쿼리를 작성하는 것이 좋다.

🔊JPA NamedQuery

이 방식은 @NamedQuery 어노테이션을 사용하여 쿼리를 미리 정의해논후 이름을 할당해 해당 이름을 호출하여 사용하는 방식이다.

  • Member.Entity
...
@NamedQuery( //Named 쿼리
        name = "Member.findByUsername",
        query = "select m from Member m where m.username = :username"
)
public class Member {
	...
}

Entity에 @NamedQuery를 사용하여 쿼리의 이름과 JPQL을 미리 선언하게 된다.

  • 순수 JPA 코드
	 //순수 JPA - Named 쿼리 호출
    public List<Member> findByUsername(String username){
        return em.createNamedQuery("Member.findByUsername")
                .setParameter("username", username)
                .getResultList();
    }

createNamedQuery를 사용하여 미리 정의해논 쿼리이름을 호출한 후,
필요한 파라미터를 세팅해주는 방식으로 사용할 수 있다.

  • Spring Data JPA
	//Spring Data JPA - Named 쿼리 호출
    @Query(name = "Member.findByUsername") //생략 가능
    List<Member> findByUsername(@Param("username")String username);

@Query 어노테이션을 사용하여 쿼리문 이름을 호출할수 있게 된다.


🔊JpaRepository 사용법

public interface ItemRepository extends JpaRepository<Item, Long> {
}
  • JpaRepository 인터페이스를 인터페이스 상속 받고, 제네릭에 관리할 <엔티티, 엔티티ID>를 주면 된다.
  • 그러면 JpaRepository가 제공하는 기본 CRUD 기능을 모두 사용할 수 있다.


출처:

0개의 댓글