오늘은 부트캠프 67일차이다. 오늘도 JPA 심화에 대해서 공부를 하였고, JPA 쿼리가 응답해주는 Page, Slice에 대한 설명과 Projection의 기능과 필드 사용방법, 구현체 정의방법,Transcation 의 Isolation 과 propagation 종류 및 차이점에 대해 공부를 해보았고 점점 공부를 하면 할 수록 더 많이 공부를 해야겠다라는 생각이 들었다. 일단 얇고 넓게 알아가고 내가 사용할 때 좀 더 깊이 찾아보고 알아가는 방법이 지금으로서 좋은 방법인 것 같다. 오후에는 복습을 하는 시간을 가졌다.
오늘 배운 것
1. JPA 쿼리가 응답해주는 Page, Slice에 대한 설명
1-1. Page는 기본적인 게시판에서 페이지 번호를 출력하고 다음으로 넘길 떄 사용
1-2. Slice는 스크롤을 아래로 내릴때 더보기 버튼을 누르거나 자동으로 게시글을 불러오고 싶을 때
- slice는 카운트 쿼리가 나가지 않고 다음 slice가 존재하는지 여부만 확인할 수 있기 때문에, 데이터 양이 많으면 많을수록 slice를 사용하는 것이 성능상 유리하다.
2. Entity 의 일부필드만으로 생성 또는 업데이트 하는 방법
2-1. Projection의 기능
- 원하는 필드만 지정해서 조회 가능
- 여러필드 합쳐서 재정의 필드(Alias) 조회 가능(Nested 프로젝션)
- 조회 필드 그룹을 인터페이스 또는 클래스로 만들어놓고 재사용 가능
2-2. Projection 필드 사용방법
2-2-1. get필드 () 메소드로 정의
- 정의한 필드만 조회하기 때문에 Closed 프로젝션이라고 한다.
- 쿼리를 줄이므로 최적화 할 수 있다.
- 메소드 형태이기 때문에 Java 8의 메소드를 사용해서 연산을 할 수 있다.
2-2-2. @Value로 정의
- 전체 필드를 조회할 수 밖에 없어서 Open 프로젝션이라고한다.
- @Value(SpEL)을 사용해서 연산을 할 수 있다.
- 스프링 빈 들의 메소드도 호출 가능하다.
- 쿼리 최적화를 할 수 없다. SpEL을 엔티티 대상으로 사용하기 때문에
2-2-3. Projection 구현체 정의방법
- 인터페이스 기반 Projection : Projection을 Interface 처럼 사용하는 방법
- 클래스 기반 Projection : Projection을 DTO 클래스 처럼 사용하는 방법
- 다이나믹 Projection : Projection 클래스를 동적으로 지정해서 사용하는 방법
3. Transcation 의 Isolation 과 propagation 종류 및 차이점에 대해 설명
3-1. @Transactional의 propagation 속성
- REQUIRED : default propagation, 트랜잭션이 없으면 새로 생성하고, 이미 시작된 트랜잭션이 있으면 해당 트랜잭션을 사용함.
- REQUIRES_NEW : 항상 새로운 트랜잭션을 시작, 즉, 이전에 시작되어 실행중인 트랜잭션에 상관없이 항상 트랜잭션을 만들어 시작시킴.
- NOT_SUPPORTED : 현재 진행중인 트랜잭션이 있어도 사용 X, 무시함, 트랜잭션이 없으면 그냥 진행, 새로 생성 X.(여러 메서드 동작 시 특정 메서드만 트랜잭션 적용을 제외시키기 위함)
3-2. @Transaction의 isolation Level
- READ_UNCOMMITED : 해당 트랜잭션에서 커밋되지 않은 데이터를 다른 트랜잭션이 접근할 수 있도록 허용함
- READ_COMMITED : 해당 트랜잭션으로부터 커밋된 확장 데이터만 다른 트랜잭션에서 접근 허용(외부 트랜잭션에서 해당 데이터를 삭제, 수정할 경우 Non-Repeatable-Read를 막을 수 없음)
- REPEATABLE_READ : 한 트랜잭션 내에서 실행되는 모든 같은 SELECT문의 결과가 같도록 조회할 수 있는 격리수준
- SERIALIZABLE : 가장 엄격한 격리수준, 트랜잭션의 동시성이 떨어져 성능에 치명적일 수 있음
- 격리 수준이 높을수록 성능은 떨어짐
3-3. 차이점
- propagation은 로직 처리를 수행할 때 트랜잭션이 어떻게 수행되어야할지에 대한 설정이다. 이 설정을 통해서 트랜잭션을 필요에 따라 구분되어 사용할 수 있게 된다.
- isolation level은 DBMS 데이터에 대해서 동시성 처리가 일어날 때 어떠한 전략을 사용할지 레벨을 설정하는 것이며, 다른 트랜잭션 하에서 데이터를 읽을 때 어떻게 데이터가 보이는지에 대한 설정이다.
- 위와 같이 두 옵션을 적절히 이용하여 트랜잭션을 사용할 필요가 있다.