0516 ~ 0529


# 0516 ~ 0529

# 0519 - Querydsl 튜플이나 DTO로 결과 반환하기

# 튜플

List<Tuple> result = queryFactory
                        .select(member.username, member.age)
                        .from(member)
                        .fetch();

for (Tuple tuple : result) {
    String username = tuple.get(member.username);
    Integer age = tuple.get(member.age);
    
    System.out.println("username=" + username);
    System.out.println("age=" + age);
}

# DTO 사용하기

# Bean() : getter, setter, default constructor 필요

List<MemberDto> result = queryFactory
                          .select(Projections.bean(MemberDto.class,
                                        member.username,
                                        member.age))
                          .from(member)
                          .fetch();

# 필드 직접 접근 : getter, setter 필요 없음, 바로주입

List<MemberDto> result = queryFactory
                        .select(Projections.fields(MemberDto.class,
                                    member.username,
                                    member.age))
                        .from(member)
                        .fetch();

# 생성자 사용

List<MemberDto> result = queryFactory
                            .select(Projections.constructor(MemberDto.class,
                                      member.username,
                                      member.age))
                            .from(member)
                            .fetch();

DTO의 필드명이 다를경우 ExpressionUtils.as(source,alias) -> 필드나, 서브 쿼리에 별칭 적용

List<UserDto> fetch = queryFactory
                        .select(Projections.fields(UserDto.class,
                                member.username.as("name"),
                                ExpressionUtils.as(
                                    JPAExpressions
                                    .select(memberSub.age.max())
                                    .from(memberSub), "age")
                                ))
                        .from(member)
                        .fetch();

# @QueryProjection

import com.querydsl.core.annotations.QueryProjection;

public class MemberDto {

    private String username;

    private int age;

    public MemberDto() {
    }

    @QueryProjection
    public MemberDto(String username, int age) {
        this.username = username;
        this.age = age;
    }
}
queryFactory
    .select(new QMemberDto(member.username, member.age))
    .from(member)
    .fetch();

특징


# 0520 - [Spring Data Common] Repository, @NoRepositoryBean

# Spring Data

Spring Data는 Spring에서 SQL & NoSQL 저장소 지원 프로젝트의 묶음이다.
Spring에서 제공하는 여러 저장소 지원 프로젝트의 공통 프로젝트가 바로 Spring Data Common이다. image

# Spring Data Common

image JpaRepository 인터페이스는 Spring Data Jpa에서 제공하는 인터페이스이다.

JpaRepository가 상속받는 PagingAndSortingRepository는 Spring Data Common에서 제공하는 인터페이스이다.(PagingAndSortingRepository는부터는 Spring Data Common단의 인터페이스)

# @NoRepositoryBean

JpaRepository, PagingAndSortingRepository, CurdRepository의 중간단계 Repository를 보면 @NoRepositoryBean 어노테이션이 선언되어있다.

package org.springframework.data.jpa.repository;

/**
 * JPA specific extension of {@link org.springframework.data.repository.Repository}.
 *
 * @author Oliver Gierke
 * @author Christoph Strobl
 * @author Mark Paluch
 */
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
    ...
}

중간 Repository에 @NoRepositoryBean 어노테이션이 붙어있는 이유는 다음과 같다.


# 0522 - isEqualTo vs isSameTo(isInstanceOf)