고민
기존 구현 사항
Reply객체를 생성하기 위해 필요한 외래키는 User, Quiz이다.
User : @AuthenticationPrincipal 을 통해 이미 가져온 User객체를 바로 활용 가능하다.
Quiz : PathVariable을 통해 Id값은 이미 알고 있는 상황.
고민점
위 코드처럼 퀴즈 객체를 불러와서 Reply에 넣어줘야 연관관계가 적용이 될텐데, 이후 Quiz객체는 사용되는 곳이 없다.
실제로 위 코드대로 Reply를 Create하는 api를 실행해보면 실행된 쿼리는 아래와 같다.
이는 이미 알고있는 id값을 이용해 굳이 퀴즈 객체를 가져와 id 값만 쓰는 느낌이다.
Quiz객체가 존재하는 지 체크를 해주는 의미가 있다한들, Select 쿼리가 낭비되는 느낌이다.
개선 점
getOne메소드(Deprecated)
getReferenceById( ) 메소드를 통해 Quiz 객체를 가져온다.
이는 지연로딩을 통해 Proxy객체만을 갖고 있다가 실제 값이 필요할 때 Select가 일어난다.
지금과 같은 상황에서는 id값을 조회하기 위해서는 Select쿼리를 날릴 필요가 없다.
이렇게 코드를 변경한 후 다시 동작시켜 보았다.
위처럼 Select 쿼리 없이 Insert쿼리문이 발생한 것을 확인할 수 있다.
보완해야할 점
getReferenceById를 통해 가져온 프록시 객체가 존재하지 않는 경우에 대한 예외처리가 필요해 보인다.
(24/06/17 추가)
임의로 존재하지 않는 ID값을 넣어줬다.
아래와 같은 예외를 발생시키며 트랜잭션은 종료된다.
참고링크
'Back-End > Spring' 카테고리의 다른 글
TIL 230802 : QueryDsl 사용하기 (JPAQueryFactory) (0) | 2023.08.03 |
---|---|
TIL 230801 : QueryDSL 쓰려고 정리하는 배경지식들 (Predicate) (0) | 2023.08.02 |
TIL 230731 : QueryDSL 어렵진 않은데 너무 복잡해 (1. ORM 발전 흐름) (0) | 2023.08.01 |
WIL 230730 : JPA 왕초보단계를 아주 살짝 벗어나기 (0) | 2023.07.30 |
TIL 230728 : pageable 기능 활용 하기. (+sortBy) (0) | 2023.07.28 |