spring data jpa에서 Repository에서 Entity로 반환받는 이유가 궁금했다.
나는
MyEntity가 Entity이고,
아래와 같이 특정 컬럼만 조회해오기 위해서 인터페이스를 만들고 Repository에서 이 인터페이스로 응답을 받았다.
public interface MySpecificColumn {
String getUserName();
String getUserImg();
}
public interface MyRepository extends JpaRepository<MyEntity, Long> {
List<MySpecificColumn> findTop10ByOrderByUserIdAsc();
}
그런데 다른 사람들의 코드를 보니, 다들 Repository에서 List<MyEntity> findTop10ByOrderByUserIdAsc(); 이런식으로 받아서
서비스 단에서 Dto로 변환해서 처리하더라...
만약 그렇게 하면 모든 컬럼을 다 가져오기 때문에 낭비가 아닌가?? 라는게 내 궁금증이었다.
김영한님의 답변을 발견했다.
TLDR
- 컬럼을 하나하나 찍는 것이 데이터 전송량이 줄어들기 때문에 성능상 더 유리합니다.
- 다만 이렇게 원하는 컬럼만 찍어서 조회하게 되면 재사용성이 떨어집니다.
- 결국 성능과 범용성의 트레이드 오프가 발생합니다.
- 성능을 최적화 할 수록 범용성이 줄어드는 것이지요.
- 그렇다면 어떤 선택이 좋은 선택일까요?
- 일반적으로 필드 몇 개가 더 추가된다고 해서 조회 성능이 급격하게 떨어지거나 하지는 않습니다.
- 트래픽이 매우 많은 서비스에서 수십개의 데이터 목록을 한번에 보여주어야 할 때는 최적화가 의미가 있습니다.
- 제가 추천하는 방법은 유지보수를 위해 범용성을 먼저 생각해서 개발하고, 이후 성능 테스트나 서비스 지표등을 보고 필요한 부분을 점진적으로 최적화 하는 것입니다.
select 조회 성능 관련 질문 - 인프런 | 질문 & 답변
1. 일반 db에서 select * from 보다 select 칼럼명 from보통 후자의 방법으로 원하는 칼럼들만 부르는 게 성능 면에서 더 뛰어난 게 아닌지 궁금합니다.2. 복잡한 테이블에서 전체 칼럼의 갯수가 20~30개가
www.inflearn.com
'개발 > Spring' 카테고리의 다른 글
QueryDsl을 이용한 No offset 구현하기 (0) | 2023.08.06 |
---|---|
싱글톤 LazyHolder 적용해보기 (0) | 2023.08.03 |
Entity와 DTO (0) | 2023.08.02 |
@Transactional 동작원리와 public method calls private method에서의 트랜잭션 적용 여부 (0) | 2023.08.02 |
연관관계 매핑된 Entity 생성하기 (0) | 2023.08.01 |
댓글