스프링 부트로 게시판 만들기 -4

BRINCE·2022년 10월 10일
0

Querydsl 로 필터링 기능 구현하기

저번 글에서 Mockmvc 를 이용한 data rest test 코드 작성까지 해보았다면 이번엔 컨트롤러 테스트를 해줄 차례다.

querydsl 디펜던시 추가

상세 검색 기능을 구현하기 위해 querydsl 디펜던시를 추가해주자.


저기 중간에 있는 $dependncyManagement 는 쿼리 dsl 버전을 한 버전으로 자동으로 맞춰주는 문구라고 한다. 저거 추가 안하면 갑자기 엔티티 어노테이션 다 충돌나서 에러가 난다. 저 밑에 jakarta 어노테이션 api 랑 충돌이 나니 문구 꼭 추가해주기

querydsl을 추가하고 gradle 탭에서 build 를 하면 자동으로 q클래스가 생성된다.

이렇게 대충 기존에 설정했던 엔티티 테이블에 소스를 추가한 듯한 클래스가 생긴다. (이건 원래 자동으로 숨겨진 폴더에 생성되어서 이게 뭘 뜻하고 하는건지는 크게 신경 안써도 되는것 같다.)

querydsl 적용 시키기

그리고 Q클래스가 생성되었으면 , 각각 리포지토리 인터페이스에 큐클래스 관련 문구를 추가해준다.

이렇게 상속 부분에 QuerydslPredicateExecutor<클래스> 와 QuerydslBindrCustomizer<q클래스> 를 추가해주면 된다.

여기서 뜻하는거는
QuerydslPredicateExecutor 는 간단한 필터 기능을 구현하게 해준다.

예를들면 제목에서 "아" 를 검색한다면, 아 가 제목에 포함된 게시물을 긁어오는게 아닌 아 로만 이루어진 게시물을 가져온다.

그래서 필요한게 QuerydslBinderCustomizer 이다. 이 인터페이스가 필터 상세 설정을 도와준다.

querydsl 에서 제공하는 메소드 이용해서 상세 필터링 조건 설정하기

이렇게 querydsl 이 제공하는 customize 를 오버라이딩 해서 설정을 해줄 수 있다.

매개값으로는 querydslBindings 객체와 큐클래스가 들어간다.

메소드를 하나하나 살펴보자.

  • ExcludeunlistedProperties : 해당 커스터마이즈 메소드 오버라이딩으로 필터를 설정하지 않은 것들을 필터링에서 제외할지 설정하는 메소드이다. true 를 고르면 설정한것 외에는 검색이 안된다.
  • including : 큐클래스에 선언된 컬럼중에 필터링을 설정할것들을 리스트에 포함시킨다.
  • bind() : 필터링할 컬럼을 매개값으로 넣어준다.
  • first((StringExpression :: containsIgnoreCase)) : 문자열로 필터를 했을때 대소문자를 구별하지않고 찾는다는 메소드이다.

이런식으로 Querydsl 라이브러리를 이용해 필터 검색 기능을 구현할 수 있다 .

테스트코드 작성해보기

이제 필터링 기능까지 추가해줬다면 , MVC 테스트코드를 작성해볼 차례이다.

Controller 클래스를 생성후 테스트클래스를 같이 생성해주자.

저번 datarest 테스트와 마찬가지로 Mockmvc 를 이용하여 테스트를 진행한다.
어노테이션으로는 똑같이 @AutoConfigureMockMvc 와 @WebMvcTest 를 사용한다. (컨트롤러 클래스를 생성하고 집어넣어주지 않으면 파라미터 예외가 발생한다.)

마찬가지로 테스트 클래스에서는 @Autowired 어노테이션을 생성자에 붙여주어야 한다.

그리고 Controller 클래스에 @Controller 어노테이션과 리퀘스트 맵핑 어노테이션을 붙여준다.

ModelMap 객체를 매개값으로 넣어준후에 modelmap addAttribute 로 articles 라는 키를 가진 데이터를 임시로 저장해주고, /articles 로 접속했을때 인덱스 페이지를 리턴해주게 한다.

그리고 given when then 방식으로, 게시글 페이지를 요청했을때 페이지를 리턴할 수 있느냐를 검사할 테스트코드를 작성한다.

마찬가지로 perform 메소드로 get 메소드안에 매개값으로 출력 받을 url을 집어넣는다. 그리고 상태가 200(OK)이고, 컨텐트 타입이 Text_Html 이고 (TypeCompatibleWith 같은 경우는 그 뒤에 잡다하게 붙은거는 포함시키지 않고 일치 하는지 아닌지를 리턴해준다) , view 의 이름이 출력된 페이지 이름이 맞는지, 그리고 아까 저장한 모델 데이터가 존재하는지를 테스트 해준다.

해당 테스트가 통과한다면 , 기본적인 인덱스 페이지를 대충 작성해준다.

타임리프 디펜던시를 추가해주면 헤더와 푸터를 한 파일에 작성하지 않고 따로 작성후에 연결시키는게 가능하다.

profile
자스코드훔쳐보는변태

0개의 댓글