본문 바로가기

Spring/jpa

[spring data jpa] spring data - jpa2

Projection

엔티티의 일부 데이터만 가져올때 사용된다.

지금까진 모든 컬럼을 가져왔다.

 

인터페이스 기반과 클래스 기반이 있다.

 

인터페이스 기반

 

Closed 프로젝션과 Open 프로젝션으로 나눌 수 있다.

 

Closed 프로젝션은 밑 예제처럼

한정적인 것만 가져온다.

 

Comment 객체에서 가져올 것들만 interface  로 만든다

리턴 타입을 바꿔준다.

Sql 도 최적화가 된다 . 필요한 컬럼들만 select 를 함

 

 

Open 프로젝션은

사실상 다 가져온담에 조합을해서

내가 보고싶은것만 보는것.

연산도 가능함. 하지만 쿼리 최적화 안됨

 

@Value 로 설정을 한다.

 

이렇게 쓰면 쿼리도 최적화하고

커스텀하게 연산도 가능해진다.

 

 

클래스 기반도 똑같다.

 

하지만 코드만 더 많아짐

 

 

Specifications

쿼리DSL 과 흡사하다

Predicate 를 이용해서 쿼리 코드를 간단하게 만들 수 있는데,

이건 나중에 필요해지면 다시 보도록하자

 

 

spring data JPA - 트랜잭션

스프링 프레임워크의 트랜잭션과 거의 동일하다

기본적으로 모든 레포지토리들은 @Transactional 이 다 들어가잇다.

 

트랜잭션이 언제 발생하냐 하면

RuntimeException 과 Error 가 발생하면 트랜잭션을 롤백시킨다.

checked Exception 은 롤백시키지 않는다.

 

checkedException 이지만 롤백시키고 싶다 할때는,

rollbackFor ,이나 rollbackForclassName 로 붙여준다.

 

기본적으로는 JpaTransactionManager 를 사용한다.

 

readOnly 를 써서 최적화 시킬 수 있어서 데이터 변경이 없으면

readOnly 를 주면 좋다

 

Isolation 설정이 있다.

여러개의 트랜잭션이 동시에 DB에 접근 했을때

트랜잭션을 어떻게 처리할것인지 제어설정이다.

 

non-repeatable 다시 조회했는데 똑같은 같이 안나온다던가

phantom read - 값이 사라졌다든가

하는 현상이 발생할 수 있다.

 

READ_UNCOMMITTED 가 성능은 좋지만,

데이터가 사라질지 안사라질지 모른다.

다른 트랜잭션이 읽어 갈 여지가 생긴다.

 

기본값은 DB 의 기본값을 따른다

H2 의 경우엔응 READ_COMMITED 가 기본값으로 되어있다.