JPA 트러블 슈팅(오류)

Lumi·2021년 8월 6일
0

JPA

목록 보기
11/11
post-thumbnail

오류에 대해서 배운다기 보다는 이떄까지 배운것중 헷갈린 부분에 대해서 다시 학습하는 시간을 가진거 같다.


-> 학습에 활용한 DB값이다.

->
fetch = FetchType.EAGER 와
fetch = FetchType.LAZY 의 차이점이다.

윗 사진이 EAGER타입이며 아래 사진이 LAZY타입이다.

EAGER타입의 경우에는 쿼리를 전체적으로 모두 실행시킨뒤에 코드의 출력값을 가져오지만

LAZY타입인 경우에는 쿼리 + 코드 의 순서로 값이 출력이 된다.

==>
이 두타입은 쿼리의 실행순서? 방법? 에 대한 내용이지
쿼리의 종류를 줄여주거나 늘리지 않기 떄문에 시스템의 성능에 영향을 주지는 않는다.

만약 쿼리를 줄이고자 한다면 이처럼 @Query를 사용 하면 된다.

코드를 간단하게 설명하자면
Review에 있는 comments의 값들을 가져오는 내용이다.

여기서 distinct의 역할은 중복을 허용하지 않는다 라는 내용이다.
==>
DB를 보면 하나의 review에 2개의 comment가 달려 있는 경우가 있다.
만약 distinct를 사용하지 않는다면
이처럼 3개의 Review가 출력이 된다.(안보이려나;;)

하지만 distinct를 사용하면
이처럼 두개의 Review가 생성이 된다.

  • 총 리뷰의 갯수는 2개이다.

시스템의 쿼리를 줄일수있는 2번쨰 3번쨰 방법이다.
첫번째 방법과 같은 결과를 볼수가 있다.

  • 쿼리를 줄이는 것이 무조건 좋은것은 아니다.
    작은 데이터를 자주 반복하는 시스템의 경우에는 한번 호출할떄
    많은 값으 처리하면 좋지만

  • 거대한 데이터를 한번에 불러오게 된다면 시스템에 부하를 주게 된다.
    그러기 떄문에 상황에 맞춰서 알맞게 사용 해야 한다.

========================================

다음은 어떻게 설명을 해야 할지 잘 모르겠지만 DB와 새로운 생성자를 통한 값에 대한 설정?? 처리?? 차이 이다.

Review class에 자체적으로 이처럼 변수를 입력해 주었다.

이렇게 된다면 default 값이 현재 시간의 값이 되기 떄문에
DB에 값을 따로 입력하지 않아도 자동으로 reviewcreatedAt의 값이 출력이 된다.


하지만 이처럼 생성자를 통해서 만들어진 값에는 따로 값을 입력해주지 않는다면 reviewcreatedAt의 값이 출력이 되지 않는다.

========================================

다음은 @DynamicInsert, @DynamicUpdate
에 관한 내용이다.

class에 선언을 하는 어노테이션으로 영향을 받은 변수 들만은 쿼리에 출력을 해준다.
-> 후에 쿼리를 참고하여 점검을 할떄에 어떤 변수가 영향을 받아 바뀌었는지 알아보기 쉽다.

사용 전 사진과 사용후 사진이다.
쿼리의 내용은 update에 대한 내용으로 comment만을 수정하였다.

하지만 사용전에는 모든 변수들을 출력하지만
사용 후 사진에서는 단순히 comment만을 출력한다는 것을 알수가 있다.

========================================
마지막으로 가장 헷갈려 하는 부분에 대한 내용이다.

@Transaction에 관한 내용이다.

@Transaction을 사용하게 되면 영속성으로 관리된다는 가정하에서는 자동으로 dirtycheck가 되어서 save를 따로 출력을 하지 않아도 값이 저장이 되지만

@Transaction(readOnly = true)
를 사용하게 된다면 dirtycheck를 하지 않아서 save가 없다면 값이 저장이 되지 않는다.

profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글