2021-07-30

0730 api 조회 쿼리 성능 최적화하기 & 그외 jpa배운것들 정리

 <성능최적화 순서>

1. DTO클래스를 만든다(필수!!!! entity 와 api 스펙을 분리하여 유연한 설계를 하기위함!)

2. fetch join을 이용한다 

3. 필요하다면 dto직접반환쿼리를 짜본다 (단, 이 경우 - 따로 Repository를 작성하길 권장함. 프레젠테이션레이어의 로직이 들어가기 때문에)

-> 이 방법 - 과연 어느정도까지 성능최적화가 되는가?? 에 대해서는 테스트해보아야 한다. 컬럼 몇개 select에서 뺀다고 그렇게까지 급격한 성능최적화가 되지는 않음. 결국엔 조인을 하는 거 자체에서 성능이~~~!! 


<join fetch와 join차이>

1. join fetch : 순수한 엔티티 그대로 가져온다. 

2. join : 필요한 특정 컬럼만 뽑을 때 사용한다. 


<스프링 data JPA의 @Modifying 어노테이션?>

엔티티매니저가 쿼리를 땡겨올때 select해서 결과값 가져오는 게 있고. update나 delete처럼 단순히 실행한 결과의 갯수를 가져오는 것이 있다( 결국엔 executeQuery랑 executeUpdate 인 것) - 이에 따라 . @Modifying 어노테이션을 붙여서 - 이것은 조회가 아니라 업데이트용입니다. 라고 명시해주는 것이다.


<@Transactional 어노테이션>

나는 스프링 data JPA를 사용하면서 이 어노테이션을 사용한 적이 손에 꼽는다 ( 여러 트랜잭션을 하나로 묶어야 하는 상황제외) - 왜 였냐면!! 알고보니 이미 JpaRepository구현체가 @Transactional어노테이션을 전부 걸어주었었던 것이다!!! 

참고로 - 기본값은 @Transactional(readOnly = True) 로 되어있고. save같이 영속성컨텍스트랑 비교해야하는 경우에는 다시 @Transactional 덮어쓰기 해두었더라.

readOnly = True일 경우, 영속성컨텍스트에 초기화한 객체 넣어두고 비교하는 과정을 거치지 않기 때문에 약간의 성능최적화가 있다고 한다. 


<JPA에서 상속관계를 풀어내는 법>

1. 일반상속 : 

1) 테이블 하나에 전체 컬럼 때려박기(Single table전략)

2) 각각의 테이블로 만들고 - join해서 가져오는 방식 (Joined 전략) 

이때에는 abstract 클래스로 부모 클래스 만들고 - extends해서 하위클래스들 각각 만들고. 

@Inheritance관련 어노테이션을 활용하면 된다.

DTYPE이라는 컬럼이 자동적으로 추가된다. 옵션으로 컬럼명 바꾸거나 DTYPE안에 들어가는 변수 명 바꿀 수 있음. 

https://ict-nroo.tistory.com/128


2. 공통 컬럼 상속 :

이 경우에는. 상속 이라는 특성을 이용하기는 하지만 - 도메인 내용과는 관계 없고. 그냥 중복코드를 제거하는 의미에서의 상속. 

이를 테면 createdDate , updateDate같은 컬럼은 대개 모든 엔티티에 포함되므로 - 이러한 엔티티를 abstract클래스인 BaseEntity로 만들고, 상속하게 하는 방식. 

@EnableJpaAuditing 이용. 스프링 data JPA를 사용하면 어노테이션만으로 createdDate랑 @updateDate만들수있음. 

@MappedBySuperClass어노테이션 : 나는 실제테이블이 아니얌~~ 만들지 마시오! 라는 뜻. 


댓글 없음:

댓글 쓰기

0328 fdisk, mkfs, mount, fstab

 1. 하드디스크를 붙인다. 2. fdisk -l로 하드디스크를 확인한다.  - interactiive한 커맨드모드 사용하여 (m) 붙인 하드디스크의 파티셔닝을 한다.  - 마지막에 w를 해야 실제로 반영이 된다.  3. mkfs를 하여 어떤 파일시스...