본문 바로가기
관리자

Programming-[Backend]/JPA

(37)
[spring data JPA] 2. 페이징과 정렬, 벌크 연산 @EntityGraph, JPA Hint Lock 1. 순수 JPA 페이징 JPA만 사용해서 페이징을 하는 방법은, JPQL문을 작성해서 setFirstResult, setMaxResults를 넣어주면 된다. Repository 파일에 다음과 같이 작성한다. 이미 API 상 setFirstResult, setMaxResults가 주어져서 상당히 편하다. setFirstResult는 어디부터 시작할지 결정하는, 말 그대로 offset이고, limit은 offset부터 몇개까지 결과를 반환할지를 결정한다. totalCount 메서드로 총 갯수를 구해서 구 메서드의 합계 결과를 바탕으로 Page 결과를 도출할 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 public List findByPage(int age, int offset, int ..
[spring data JPA] 1. 초기 설정 및 Data Jpa 기본 1. 초기 세팅 이전 강의와 거의 동일하게 프로젝트를 만들고 환경 설정을 해준다. application.yml 파일은 다음과 같다. 환경 설정에서 띄어쓰기, 오타 등의 실수는 치명적이다. 정확히 써야한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 spring: datasource: url: jdbc:h2:tcp://localhost/~/datajpa username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show-sql: true format_sql: true logging.level: org.hibernate.S..
[JPA활용-1] 3. 도메인 개발 : Unique 제약 조건, main/test 환경 설정 분리, JPQL 동적 쿼리 등 스프링의 @Repository에 JPA의 @PersistenceContext 추가 그냥 스프링만 이용할 때는 @Repository 어노테이션을 추가하여 @Component 로서 Component Scan이 되게 하였다. 여기에 @PersistenceContext 어노테이션으로 EntityManager를 불러오면, 스프링이 EntityManager를 만들어서 Repository에 주입해주게 된다. Member 객체와 관련한 기본적인 기능을 갖는 MemberRepository를 보면, EntityManager를 @PersistenceContext 어노테이션과 함께 작성한 것을 확인할 수 있다. 추가로, 엔티티 자체를 들고 와야하거나 특정 파라미터를 추가해야된다면, 기본편에서 배운 JPQL 문법을 사용해야 한..
[JPA활용-1] 2. 엔티티 작성 : 계층구조 연관관계 매핑 등 활용편은 대부분 아는 내용이라, 차례대로 모두 정리하지 않고 새롭게 알게된 내용들만 일부 참조하여 작성한다. 테이블명 단수형, 복수형 문제 복잡한 문제로 논란이 많지만, 테이블의 레코드 1개가 가지는 의미를 생각하여 단수로 작성한다. 테이블명이 명확한 단어로 작성되는 경우도 있지만, H1KQLW와 같은 코드로 작성되는 경우도 있다고 한다. 이런 경우에는 복수형으로 만들기가 곤란하다. 다만, order와 같은 일부 예약어는 단수로 작성 시 문제가 되므로 복수로 작성하여 혼용되기도 한다. 사용하는 DB의 종류, 프로그래밍 언어, 상황에 따라 다르겠지만 강의에서는 결국 프로젝트나 회사 단위에서 지정하기 나름이라고 한다. 일관성이 중요하다. Getter는 열되, Setter는 무조건 열지는 않는다. Entity..
[JPA활용-1] 1. 프로젝트 생성 및 기초: .yml, @PersistenceContext, @Transactional, jar 빌드 등 활용편은 대부분 아는 내용이라, 차례대로 모두 정리하지 않고 새롭게 알게된 내용들만 일부 참조하여 작성한다. devtools 라이브러리 gradle 라이브러리에 devtools 라이브러리를 import 한다. build.gradle 파일 1 2 3 4 5 6 7 8 9 10 dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org...
[JPA기본] 13. 객체지향 쿼리 언어 : JPQL-중급문법 1. 경로 표현식 경로 표현식이란 점(.)을 이용하여 객체를 탐색하는 경로를 표현하는 식을 말한다. 경로 표현식으로는 다음 세 가지 경로를 표현할 수 있다. 1 2 3 4 5 select m.username -- 상태 필드 from Member m join m.team t -- 단일 값 연관 필드 join m.orders o -- 컬렉션 값 연관 필드 where t.name = '팀A' cs 상태필드 : 탐색 종료 상태 필드는 어떤 객체의 단순 필드값을 조회하는 것이다. 상태만을 표현하므로 더 이상 경로 표현식을 통해 추가적인 탐색을 할 수 없다. 단일 값 연관 필드 : 탐색 계속, 묵시적 내부 조인 단일값 연관필드는 연관관계를 갖는 필드이므로 추가적인 탐색이 가능하다. 예를 들어 m.team.teamN..
[JPA기본] 12. 객체지향 쿼리 언어 : JPQL-기본문법 1. JPA에서 제공하는 SQL 방식 소개 JPA는 JPQL, JPA Criteria, QueryDSL, 네이티브 SQL, JDBC API 직접 사용 등의 여러 쿼리 방법을 지원한다. JPQL JPQL은 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다. 다만 SQL은 DB 테이블을 대상으로 쿼리하는데, JPQL은 엔티티를 대상으로 쿼리한다는 차이가 있다. select * 이 아니라 select m from Member m 이라고 사용하는 점에서도 이를 유추할 수 있다. 그리고 SQL을 추상화했으므로 특정 데이터베이스 vendor에 의존하지 않는다는 장점이 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 tx.begin(); try { Member m..
[JPA기본] 11. 값 타입 1. 값 타입 기본 엔티티 타입과 값 타입의 차이 이제껏 공부해온 엔티티 타입은 식별자(보통 id값)를 통해서 지속적으로 값을 추적할 수 있다. 어떤 엔티티의 특정 필드값이 setter 등으로 변경되면 JPA에서 식별자값을 통해 이를 감지하고 값을 변경해준다. 그러나 값 타입은 변경 시 추적이 불가하다. 그래서 유의해야될 점들이 있는데, 이 글에서는 여러 값 타입들의 종류와 사용법, 유의점에 대해서 알아본다. 사실, 추적이 안되는 값이기 때문에 결론적으로 값 타입을 잘 사용하지 않기에 JPA에서 사용하는 값 타입이라는 것이 있다는 정도만 알아도 될 것 같다. 2. 값 타입의 종류 값 타입은 다음의 3가지가 존재한다. 기본 값 타입 : int, Integer 등 자바 기본 타입이나 객체 임베디드 타입 컬렉..