배포

[Spring Data JPA] 사용법

옴악핫세 2023. 5. 9. 13:47

환경 설정

1) h2 DB

2) 스프링 데이터 JPA 설정

#application.yml

spring :
  datasource: #연결할 디비의 이름
    url: jdbc:h2:tcp://localhost/~/datajpa
    username: sa
    password:
    driver-class-name : org.h2.Driver #디비 종류

  jpa : #jpa 종류
    hibernate:
      ddl-auto : create #app 로딩 시점에 테이블 다 드랍하고 새로시작, 끝나도 그대로 남아있음  
    properties:
      hibernate :
        #show_sql : true #콘솔에 로그가 나옴
        format_sql : true #이쁘게 해줌

logging.level:
  org.hibernate.SQL: debug #콘솔에 남기는게 아니라 로그로 남음.
  org.hibernate.type : trace #바인딩된 파라미터까지 볼 수 있

3) 쿼리 파라미터 남기기

implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.7'
개발 단계에서는 편리하게 사용하되, 운영 시스템에 적용하기 위해서는 성능 테스트를 하고 사용하자.

 

 

쿼리 메소드 기능

Spring Jpa가 제공하는 어메이징한 기능…

쿼리 메소드 기능 3가지

1) 메소드 이름으로 쿼리 생성
2) 메소드 이름으로 JPA NamedQuery 호출
3) @Query 어노테이션을 사용해서 레퍼지토리 인터페이스에 쿼리 직접 정의하기!

1. 메소드 이름으로 쿼리 생성하기.

이름과 나이를 기준으로 회원을 조회해보자

 

 

JPA와 Spring  Data JPA 비교

- JPA Repository 메소드

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 Repository 메소드

public interface MemberRepository extends JpaRepository<Member,Long> {
	
	List<Member> findByUsernameAndAgeGreaterThan(String username, int age);	
}

Spring Data JPA가 메서드의 이름을 분석해서 대응되는 쿼리를 실행해줌  

 

Spring Data JPA와 JPA에서 쿼리문 직접 정의해서 사용하기

1) @Quaery 를 이용하여 메소드에 쿼리문을 직접 작성하여 사용

@Query("select m from Member m where m.username= :username and m.age = :age")
List<Member> findUser(@Param("username") String username,@Param("age") int age);

 

 

2) @NamedQuery 로 쿼리문 선언

 

@Entity
@Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of={"id","username","age","team"}) 

@NamedQuery(
        name = "Member.findByUsername",
        query = "select m from Member m where m.username =:username"
)

@NamedEntityGraph(name = "Member.all", attributeNodes = @NamedAttributeNode("team"))
public class Member extends BaseEntity {
		...
}
// JPA
List<Member> resultList = 
	em.createNamedQuery("Member.findByUsername", Member.class)
		.setParameter("username", username)
		.getResultList();

// Spring Data JPA
@Query(name = "Member.findByUsername")
List<Member> findByUsername(@Param("username") String username);

 

 

 

https://ojt90902.tistory.com/722

 

JPA : 읽기 전용 성능 최적화

이 글은 자바 표준 ORM JPA를 읽고 정리한 글입니다. JPA 쿼리 성능 최적화 JPA는 읽기 전용 쿼리를 생성해서 조회 시, 쿼리를 좀 더 최적화 할 수 있다. 이 때의 가장 주된 효과는 1) 스냅샷을 만들지

ojt90902.tistory.com

 

 

https://jddng.tistory.com/322

 

Spring Data JPA - 쿼리 메서드 사용과 @Query

Spring Data JPA에서 제공하는 공통 인터페이스는 우리가 기본적으로 사용하는 CRUD를 제공해준다. 즉, 순수하게 JPA를 이용한 Repository 클래스를 생성하여 CRUD 메서드들을 작성해왔던 번거로운 작업들

jddng.tistory.com