반응형 Spring 사전 준비/JPA Hibernate28 [JPA] 웹 애플리케이션에서의 영속성 관리 1. 트랜잭션 범위의 영속성 컨텍스트 - 트랜잭션의 범위와 영속성 컨텍스트의 생존 범위가 같다. - 트랜잭션이 종료되면 영속성 컨텍스트에 있던 엔티티들은 더 이상 영속 상태가 아니게 된다. - 서로 다른 EntityManager를 사용하더라도 같은 트랜잭션 범위 안에 있다면 같은 영속성 컨텍스트를 사용한다. - 같은 EntityManager를 사용하더라도 트랜잭션 범위가 다르다면 다른 영속성 컨텍스트를 사용한다. Spring 컨테이너는 스레드마다 각각 다른 트랜잭션을 할당하기 때문인데, 이 덕분에 멀티스레드 상황에도 안전하다. 2. 준영속 상태의 지연 로딩 문제 - 트랜잭션이 없는 프레젠테이션 계층에서 엔티티는 준영속 상태가 되기 때문에, 변경 감지와 지연 로딩이 동작하지 않는다. ※ 영속성 컨텍스트가 .. 2022. 8. 22. [JPA] Spring Data JPA(2) 1. 사용자 정의 리포지토리 - Repository의 메소드를 직접 구현해야 할 경우에는 사용자 정의 리포지토리를 추가하면 된다. - 아래 3가지 절차를 걸쳐서 적용하면 된다. i) 사용자 정의 리포지토리 생성 public interface CustomMemberRepository { // 메소드 정의 } ii) 구현체 생성 - 사용자 정의 리포지토리 이름 뒤에 Impl가 붙은 구현체를 생성한다. Impl를 붙이지 않으면 Spring Data JPA가 인식하지 못한다. public class CustomMemberRepositoryImpl implements CustomMemberRepository { // 메소드 구현 } - 만약 Impl가 아닌 다른 키워드를 사용하고 싶다면 @Configuration.. 2022. 8. 20. [JPA] Spring Data JPA(1) 1. Spring Data JPA 소개 - 데이터를 다루는 동작으로는 JPA에서도 마찬가지로 CRUD(Create Read Update Delete)가 있다. JpaRepository 인터페이스는 기본적인 CRUD 메소드들(save, findOne, getOne, findAll, delete, count 등)을 제공해주기 때문에, 레포지토리마다 일일이 CRUD 메소드를 작성할 필요 없이 JpaRepository를 상속한 인터페이스만 만들면 된다. - 특정 동작에 대한 메소드는 Spring Data JPA가 해석할 수 있는 규칙으로 메소드 이름을 지어 추가하면 된다. 놀랍게도, 메소드 이름으로 적절한 JPQL 쿼리가 자동으로 생성되어 실행된다. 메소드 이름 규칙은 [3. 메소드 작명 양식]에서 설명한다. .. 2022. 8. 19. [JPA] JPQL 최적화 1. 벌크 연산 1) 벌크 연산이란? - 성능을 위해 엔티티를 한 번에 수정하거나 삭제하는 연산을 의미한다. - UPDATE와 DELETE 모두 executeUpdate() 메소드를 사용하면 된다. INSERT 벌크 연산은 JPA 표준은 아니지만 Hibernate에서는 지원한다. int resultCount = em.createQuery("[UPDATE/DELETE SQL]") .setParameter("price", 200) .executeUpdate(); // 영향 받은 엔티티의 건수를 반환 - QueryDSL을 이용하는 방법은 https://kimcoder.tistory.com/495의 [11.배치 쿼리]를 참고하자. - 벌크 연산은 영속성 컨텍스트를 무시하고 DB에 직접 쿼리한다. 2) 일관성 문.. 2022. 8. 14. [JPA] 스토어드 프로시저 - 스토어드 프로시저는 JPA 2.1부터 지원되며, 아래와 같이 DB에 저장되어 있는 프로시저를 JPA에서 사용할 수 있다. # inParam 값에 3을 곱해서 반환하는 프로시저 CREATE OR REPLACE RPOCEDURE proc_multiply(IN inParam INT, OUT outParam INT) BEGIN SET outParam = inParam * 3; END - JPA에서 제공하는 ParameterMode는 다음과 같다. ParameterMode.IN : INPUT 파라미터 ParameterMode.OUT : OUTPUT 파라미터 ParameterMode.INOUT : INPUT, OUTPUT 파라미터 ParameterMode.REF_CURSOR : CURSOR 파라미터 1. 스토어.. 2022. 8. 14. [JPA] 네이티브 SQL 1. 네이티브 SQL의 소개와 필요성 - 다양한 이유로 JPQL을 사용할 수 없는 상황에서 특정 DB에 종속적인 SQL을 직접 사용할 수 있도록 하는 기능이다. - JPQL이 아닌 SQL을 이용해도 영속성 컨텍스트에 접근할 수 있는 방법을 제공한다.★ - 특정 DB에 종속적인 기능을 JPA가 해결하는 예로는 다음과 같은 것들이 있다. 특정 DB에서만 사용하는 함수 : 네이티브 SQL 함수를 사용하는 방법, Hibernate가 방언에 정의해둔 함수를 사용하는 방법, 함수를 직접 정의하는 방법이 있다. 특정 DB에서만 지원하는 SQL 쿼리 힌트 : Hibernate를 포함한 몇몇 JPA 구현체들이 지원한다. 특정 DB에서만 지원하는 문법 : 너무 종속적인 SQL 문법은 지원하지 않으므로 네이티브 SQL를 사.. 2022. 8. 11. [JPA] QueryDSL 1. QueryDSL 소개 - SQL, JPQL을 코드로 작성할 수 있도록 도와주는 오픈소스 빌더 API - 컴파일 시점에 문법 오류를 발견할 수 있음 - IDE의 도움을 받아 코드 자동완성 기능을 이용할 수 있음 - 엔티티를 기반으로 생성한 쿼리 타입이라는 쿼리용 클래스를 사용한다. 2. 환경 설정 - pom.xml에 querydsl-jpa, querydsl-apt 라이브러리를 추가하자. querydsl-apt 라이브러리는 쿼리 타입을 생성할 때 필요하다. com.mysema.querydsl querydsl-jpa 3.6.3 com.mysema.querydsl querydsl-apt 3.6.3 provided - pom.xml에 쿼리 타입 생성용 플러그인도 추가하자. com.mysema.maven ap.. 2022. 8. 10. [JPA] JPQL의 작성 1. JPQL 소개 - JPQL(Java Persistence Query Language)은 객체지향 SQL이다. - SQL이 DB 테이블을 대상으로 하는 데이터 중심의 쿼리라면, JPQL은 엔티티 객체를 대상으로 하는 객체지향 쿼리다. JPA는 JPQL을 분석해서 적절한 SQL을 만들어서 DB를 조회하고, 그 결과로 엔티티 객체를 반환한다. - JPQL은 SQL을 추상화해서 특정 DB에 의존하지 않는다. 심지어, SQL 함수도 표준화되어 있다. - JPQL은 엔티티 직접 조회, 묵시적 조인, 다형성을 지원하기 때문에 SQL보다 간결하다. - JPA가 JPQL을 분석해서 SQL을 생성할 때는 즉시 로딩과 지연 로딩을 구분하지 않고 JPQL 자체에만 충실하다. - Criteria, QueryDSL은 JPQ.. 2022. 8. 4. [JPA] 값 타입 컬렉션 엔티티가 아닌 값 타입에 대한 컬렉션을 데이터베이스에 저장하는 방법을 알아볼 것이다. 1. 값 타입 컬렉션 매핑 - 값 타입 컬렉션 필드에 @ElementCollection, @CollectionTable 어노테이션을 추가해서 사용하면 된다. - DB 테이블은 컬럼 값으로 컬렉션을 가질 수 없기 때문에 별도의 테이블을 만들어야 한다. 예시 - Member.class의 일부 필드다. @ElementCollection @CollectionTable(name="FAVORITE_ANIMALS", joinColumns=@Joincolumn(name="MEMBER_ID")) @Column(name="ANIMAL_NAME") // 동물 정보 필드의 이름을 결정 private Set favoriteAnimals = n.. 2022. 8. 3. 이전 1 2 3 4 다음