[spring] Repository에서 Entity 대신 DTO로 조회

구동현·2024년 7월 15일

그동안에는 Repository에서 Entity를 가져온 후,
Entity를 DTO로 변환해서 DTO를 응답에 사용했습니다.
만약, Entity의 Column이 많아지고
DTO에서는 적은 필드만을 가질 경우에는
Repository에서 직접 DTO를 받는게 좋지 않을까요?

[Before] Entity를 직접 받기

	@Override
    public List<Auction> findAllByFilters(
        List<Long> neighbor,
        StatusEnum status,
        String title
    ) {
        return queryFactory.selectFrom(auction)
            .where(auction.townId.in(neighbor),
                eqStatusAndContainsTitle(status, title))
            .orderBy(auction.createdAt.desc())
            .fetch();

    }
  • QueryDSL을 사용해서 Entity를 받아왔습니다.
  • 48.4TPS의 처리량을 가졌습니다.
  • 하지만 저희의 Auction Entity는 Column의 양은 많습니다.
  • 또한 Entity리스트를 서비스 레이어에서 DTO로 변환해주는 작업또한 있어야 합니다.

[After] DTO 받기

    @Override
    public List<AuctionListResponseDto> findAllByFilters(
        List<Long> neighbor,
        StatusEnum status,
        String title
    ) {
        return queryFactory.select(Projections.fields(AuctionListResponseDto.class,
                auction.id.as("auctionId"),
                auction.title,
                auction.status,
                auction.user.nickname,
                auction.finishedAt,
                auction.file.filePath,
                auction.price
            ))
            .from(auction)
            .where(auction.townId.in(neighbor),
                eqStatusAndContainsTitle(status, title))
            .orderBy(auction.createdAt.desc())
            .fetch();
    }
  • QueryDSL의 프로젝션을 사용해서 직접 DTO를 받아옵니다.
  • DTO로 변환하는 작업이 생략되고 DB에서 받아오는 쿼리의 양이 줄어들기 때문에, 처리량이 3787TPS로 향상되었습니다.
profile
개발합시다

0개의 댓글