728x90
    
    
  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);
    }
}추가할 위치 :

- 마지막으로 페이징 처리를 편리하게 쓰기 위해 AbstractQueryDslRepositorySupport.java 파일을 추가한다.
public abstract class AbstractQueryDslRepositorySupport extends QuerydslRepositorySupport{
	public AbstractQueryDslRepositorySupport(Class<?> domainClass) {
		super(domainClass);
	}
}
- 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
    
    
  'Spring > 초기 setting' 카테고리의 다른 글
| 6) 스프링 시큐리티(spring-security) 적용 (0) | 2023.04.05 | 
|---|---|
| 5) 스프링 시큐리티(spring-security) 개요 (0) | 2023.04.05 | 
| 3) JPA 다중 스키마 설정 (0) | 2023.03.19 | 
| 2) MyBatis 3.0 다중 스키마 설정 (0) | 2023.03.19 | 
| 1) 스프링 부트 프로젝트 생성 (0) | 2023.03.19 |