본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


반응형

JPA

(55)
SPRING DATA JPA 공부 2- JPA 메서드 살펴보기 JPA의 기본적인 메서드들을 살펴보자 먼저 테스트하기 위해 entity객체를 하나 만들었다 User @NoArgsConstructor @AllArgsConstructor @RequiredArgsConstructor @Data @Builder //위에 까지는 롬복의 어노테이션이다 //@Entity 는 해당 객체가 JPA에서 관리할 엔티티 타입임을 알려준다. @Entity public class User { @Id @GeneratedValue private Long id; @NonNull private String name; @NonNull private String email; private LocalDateTime createdAt; private LocalDateTime updatedAt; } @Id ..
SPRING DATA JPA 공부 1 - JPA 란? 백엔드 개발에서 주된 일이라고하면 객체화된 데이터를 데이터베이스에 넣거나 반대로 데이터베이스에서 데이터를 꺼내와 객체화하여 응답해주는 일이다. 데이터를 저장하기 위해 데이터베이스를 사용한고 , 객체지향에서 사용하는기본 단위는 오브젝트를 기본 단위로 사용한다. ORM은 객체와 데이터베이스간의 연결을 담당하며 어플리케이션 과 JDBC 사이에서 동작한다. ORM Object Relational Mapping의 약자이다. JPA는 Java Persitance Api의 약자이다. 현재 자바에서 표준으로 채택된 ORM이다. 스프링에서 JPA를 주입받아 Jar파일을 확인해보면 Jacarta.Persistence.Api 라는 이름으로 되어 있는데 2019년 부터 Java Persitance Api에서 Jacarta...
Spring boot -QueryDSL 과 JPQL 차이점 제목엔 차이점이라 적혀있지만 결국 QueryDsl은 JPQL bulider 역할을 한다. (결국엔 jpql로 변환된다) 샘플데이터 팀A.B와 멤버 1234가 persist 되었다 Test 코드에서 @BeforeEach를 사용하면 각 단위별 테스트가 실행되기 전에 @BeforeEach가 붙은 메서드를 먼저 실행한다. 이름이 memberA 인 회원을 JPQL과 queryDsl 로 찾아보았다 1. JPQL createQuery로 jpql을 생성하고 username을 파라미터 바인딩하였다 2.QueryDSL QueryDSL은 queryFactory와 Q-TYPE 객체를 사용하여 쿼리를 생성한다. queryFactory는 엔티티매니저를 파라미터로 받아야 하고 멀티쓰레드에 맞게 설계가 되어있어 필드레벨로 빼서 사용..
Spring boot 프로젝트에 QueryDSL 설정 및 검증 build.gradle로 가서 1.plugin에 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" 입력 2.dependencies에 implementation 'com.querydsl:querydsl-jpa' 입력 3.맨아래에 아래코드 입력 -Q파일 자동 생성하는 코드 def querydslDir = "$buildDir/generated/querydsl" querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } configurations { querydsl.extendsFrom compileClasspath } compileQuery..
Springboot- JPA 페이징처리 위 메서드에서는 입력받은 나이를 갖는 유저의 리스트를 가져오는 쿼리이고 setFirstResult를 통해 시작점 setMaxResults로는 마지막을 지정해 페이징을 한다. 설정만 해주면 JPA에서 매우 편하게 SQL을 통한 페이징과 똑같은 쿼리를 날려준다.ㄴ 위 메서드에 age = 10 offset = 0 limit =3 을 임의로 지정하여 실행한 후 생성된 쿼리이다 *offset이 0이면 JPA는 따로 쿼리에 offsett을 넣지 않는다. *JPA는 지정해놓은 방언(Dialect)을 통해 쿼리를 생성하기 때문에 DB에 영향을 받지않고 쿼리가 생성된다.
Spring Data JPA 반환타입 컬랙션 , 단건 , Optional 등등 여러가지를 반환 받을수있다 자세한내용은 아래 링크에서 docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-return-types Table 9. Query return types검색 주의할 점은 JPASpring Data JPA에서는 조회되는 값이 없더라도 Exception이 터지지않게 내부적으로 Try Catch문을 구현해 놨기떄문에 컬랙션일 경우 빈 컬랙션을 반환하고 단건일 경우 null을 반환해준다. 데이터가 있을지 없을지 모르면 Optional을 사용하여 분기해준다. 반환 타입은 하나인데 결과가 2개이상이라면 예외가 터진다.
Spring Data JPA @Query -컬렉션 파라미터 바인딩 파라미터를 컬렉션으로 넘겨서 조회할 수도 있다 위 코드의 쿼리를 보면 in 절을 이용하여 names에 들어 있는 값을 모두 조회 하였다. 위의 메서드를 통해 나온 쿼리 이다 List에 담겨있던 username이 in절에 바인딩 되었다.
Spring Data JPA @Query-엔티티 조회 @Query Repository 메서드에 쿼리 정의하기 리파지토리 메서드에 @Query를 통해 바로 쿼리를 작성해놨고 메서드에서는 @Param을 통해 파라미터를 가져왔다. 위의 메서드를 통해 생성된 쿼리 username과 age가 where 절에 들어 갔다. 장점 -애플리케이션 로딩시점에 지정된 쿼리를 SQL로 파싱해보고 문제가 있으면 오류를 낸다.

반응형