Spring/초기 setting

4) Querydsl 설정

쿠카이든 2023. 3. 20. 18:32
728x90
Querydsl 설정

QueryDsl 서브파티 라이브러리의 장점


아래 내용은 https://github.com/beaver84/setting-test 에서 실제 소스를 확인할 수 있습니다.

  • JPA 설정에 이어서 편리한 기능을 제공하는 Querydsl 설정을 추가한다.
  • 우선, build.gradle 에 라이브러리를 추가 후, gradle을 새로고침을 한다.
//Querydsl 버전 관련
buildscript {
    ext {
        queryDslVersion = "5.0.0"
    }
}

plugins {
    ...
    //Querydsl 관련 추가
    id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
    ...
}

dependencies {

    ...

    //Querydsl 관련 실제 lib 추가
    implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
    implementation "com.querydsl:querydsl-apt:${queryDslVersion}"
    
    ...
}

//querydsl QClass 저장 위치 관련 추가
def querydslDir = "$buildDir/generated/querydsl"

querydsl {
    jpa = true
    querydslSourcesDir = querydslDir
}
sourceSets {
    main.java.srcDir querydslDir
}
compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
    querydsl.extendsFrom compileClasspath
}

 

  • 다음은 config 패키지 아래 QueryDslConfig.java 파일을 추가한다.
@Configuration
@RequiredArgsConstructor
public class QueryDslConfig {

    @PersistenceContext(unitName="[엔티티 매니저 팩토리의 빈이름 예) exampleEntityManagerFactory]")
    private final EntityManager em;

    @Bean(name="appQueryDslFactory")
    public JPAQueryFactory queryFactory() {
        return new JPAQueryFactory(em);
    }

}
728x90

추가할 위치 :

 

  • 마지막으로 페이징 처리를 편리하게 쓰기 위해 AbstractQueryDslRepositorySupport.java 파일을 추가한다.
public abstract class AbstractQueryDslRepositorySupport extends QuerydslRepositorySupport{

	public AbstractQueryDslRepositorySupport(Class<?> domainClass) {
		super(domainClass);
	}

}

dslRepositorySupport 파일 생성할 위치


  • Querydsl 테스트
    • 우선, Client.java entity를 생성한다.
@Data
@Entity
@Table(name = "client")
public class Client {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "supplier_id")
    private int supplierId;

    @Column(name = "use_yn")
    private String useYn;

    @Column(name = "register")
    private String register;

    @Column(name = "modifier")
    private String modifier;

    @Column(name = "register_date")
    private LocalDateTime registerDate;

    @Column(name = "modifier_date")
    private LocalDateTime modifierDate;

    @Column(name = "name")
    private String name;

    @Column(name = "ceo_name")
    private String ceoName;

    @Column(name = "business_number")
    private String businessNumber;

    @Column(name = "email")
    private String email;

    @Column(name = "telephone_number")
    private String telephoneNumber;

    @Column(name = "phone_number")
    private String phoneNumber;

    @Column(name = "person_charge")
    private String personCharge;

    @Column(name = "address")
    private String address;

    @Column(name = "business_type")
    private String businessType;

    @Column(name = "business_state")
    private String businessState;

    @Column(name = "week_day_closing_time")
    private int weekDayClosingTime;

    @Column(name = "weekend_closing_time")
    private int weekendClosingTime;

    @Column(name = "type")
    private String type;

    @Column(name = "start_date")
    private LocalDate startDate;

    @Column(name = "remark")
    private String remark;

    @Column(name = "reference_client_id")
    private int referenceClientId;
}

 

  • repository 패키지 하위에 ClientDslRepository.java 와 ClientDslRepositoryImpl.java 파일을 생성한다.
  • 인터페이스 ClientDslRepository.java 의 내용
@Repository
public interface ClientDslRepository {
    List<Client> findByName(String name);
}

 

  • 이를 구현한 ClientDslRepositoryImpl.java 의 내용
@Repository
public class ClientDslRepositoryImpl extends AbstractQueryDslRepositorySupport implements ClientDslRepository {

    @Autowired
    public ClientDslRepositoryImpl() {
        super(Client.class);
    }

    @Autowired
    @Override
    public void setEntityManager(@Qualifier("teamfleshEntityManagerFactory") EntityManager entityManager) {
        super.setEntityManager(entityManager);
    }

    @Override
    public List<Client> findByName(String name) {
        JPAQueryFactory query = new JPAQueryFactory(super.getEntityManager());

        QClient qClient = QClient.client;

        return query
                .selectFrom(qClient)
                .where(qClient.name.eq(name))
                .orderBy(qClient.startDate.desc())
                .fetch();
    }
}

 

  • 테스트 파일을 작성 후, class 우측에 초록색 화살표를 클릭하여 실행한 후, 결과를 확인한다.
import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
@Transactional
class ClientDslRepositoryImplTest {

    @Autowired
    ClientDslRepository clientDslRepository;

    @Autowired
    ClientJpaRepository clientJpaRepository;

    @BeforeEach
    public void setUp() {
        //setup before testing
        clientJpaRepository.deleteAll();
    }

    @Test
    @DisplayName("매출처 조회 QueryDsl 테스트")
    void findByName() {

        //given
        Client client = new Client();
        client.setName("배아무개");
        client.setAddress("서울시");
        client.setPhoneNumber("01000000000");
        client.setRegister("admin");
        client.setType("매니저");
        client.setUseYn("Y");
        client.setRegisterDate(LocalDateTime.now());

        clientJpaRepository.save(client);

        //when
        List<Client> clientList = clientDslRepository.findByName("배아무개");

        //then
        assertThat(clientList.get(0).getName()).isEqualTo("배아무개");
        assertThat(clientList.get(0).getAddress()).isEqualTo("서울시");
        assertThat(clientList.get(0).getPhoneNumber()).isEqualTo("01000000000");
    }
}

 

  • Querydsl 설정이 완료되어 테스트가 정상적으로 통과함을 확인한다.
728x90