마지막 미션 요구사항 중 @DynamicUpdate라는 어노테이션을 설정하는 요구사항이 주어졌다.
@DynamicUpdate
변경이 일어난 컬럼에 대해서만 update 쿼리를 발생하는 어노테이션이다.
우리 도메인 중 하나인 템플릿에는 반정규화를 통해 좋아요 컬럼을 가지고 있다.
좋아요 요청이 오게 될 경우 더티 체킹을 통해 좋아요 컬럼을 업데이트 하는데, 만약 @DynamicUpdate가 없다면 전체 필드에 대해 업데이트 컬럼을 날리게 된다.
하지만 @DynamicUpdate를 추가하게 된다면 변경이 발생한 컬럼에 대해서만 업데이트 쿼리가 발생하여 다음과 같이 쿼리가 나간다.
그렇다면 불필요한 컬럼에 대해 업데이트를 하지 않으면 좋을 것 같다고 생각이 드는데, 과연 어떨까?
성능 측면에서 고민할 것
스프링의 아버지인 김영한님의 인프런 답변(실무에서 @DynamicInsert, @DynamicUpdate 사용하나요?)을 인용하면 @DynamicUpdate가 성능 측면에서 고려해야 할 것들이 있다.
JPA는 애플리케이션 로딩 시점에 PrepareStatement로 해당 엔티티의 UPDATE 쿼리를 만들어 둔다.
따라서 성능에서 오히려 컬럼에 전체 값을 넘기는 것과 동적으로 변경이 일어난 값만 넘기는 것을 고려했을 때 전자가 더 좋을 수도 있다는 의견이셨다.
생각해보니,,,, HikariCP cache도 걸리네?
이 의견을 보고 생각난 점은, HikariCP에서 MySQL 사용 시 권장한 Configuration 값 중 statment 캐싱에 대한 것이 있었다.자주 사용하는 Statement들에 대해 캐싱을 해놓는 것인데, 우리 서버는 해당 설정을 적용했다.
Statement에 대해 캐싱 사이즈를 지정했는데, 이것 역시도 동일한 Statement가 아닌 매번 다른 Statement를 사용하게 된다면 큰 장점을 누리지 못할 것이라고 생각이 든다.
'우아한테크코스 6기 > 4단계' 카테고리의 다른 글
우아한테크코스 6기 백엔드 과정을 마치며 적는 회고 (8) | 2024.12.08 |
---|---|
다양한 캐시 전략에 대해 알아보자 (2) | 2024.10.27 |
Grafana, Prometheus로 TPS 측정 및 시각화하기 (0) | 2024.10.14 |
Connection Pool과 HikariCP에 대해 알아보자 (0) | 2024.10.09 |
고가용성과 SPOF (0) | 2024.10.01 |