이번 포스팅에서는 데이터를 조회하는 방법에 대해 알아볼 것이다. 대략적으로 5가지 방법이 있다.

findAll

작성한 테스트 코드를 다음처럼 수정해 보자.

question 테이블에 저장된 모든 데이터를 조회하기 위해서 리포지터리의 findAll 메서드를 사용했다.

findAll은 데이터를 조회할때 사용하는 메서드이다.

총 2건의 데이터를 저장했기 때문에 데이터의 사이즈는 2가 되어야 한다. 데이터 사이즈가 2인지 확인하기 위해 JUnit의 assertEquals 메서드를 사용했다. assertEquals는 assertEquals(기대값, 실제값)와 같이 사용하고 기대값과 실제값이 동일한지를 조사한다. 만약 기대값과 실제값이 동일하지 않다면 테스트는 실패로 처리된다. 그리고 저장한 첫번째 데이터의 제목이 "sbb가 무엇인가요?"와 일치하는지도 테스트했다.

 

테스트를 위해서는 로컬 서버를 중지하고 다시한번 테스트 서버를 실행하면 된다. 테스트는 잘 통과될 것이다.

...인 줄 알았는데??

왠걸, 실패가 떠버렸다. 왜 그런가 하고 콘솔을 봤더니, 나도 모르는 사이에 데이터가 2개가 더 추가되어 총 데이터가 4개가 되어버렸던 것이다. 데이터의 사이즈를 2로 맞춰 놨는데, 실제 데이터가 4개이니 당연히 테스트에 통과되지 못하고 오류가 나버린 것이다. 데이터가 왜 추가되었는지는 의문이지만(나중에 조사해보는걸로...) 일단 2개를 지우고 2개로 맞춰서 다시 테스트를 실행해보았다.

 

다행히도 무사히 통과하였다! 역시 데이터의 사이즈 문제가 맞았다.

findById

이번에는 Question 엔티티의 Id값으로 데이터를 조회해 보자. 테스트 코드를 다음과 같이 수정하자.

id 값으로 데이터를 조회하기 위해서는 리포지터리의 findById 메서드를 사용해야 한다. 하지만 findById의 리턴 타입은 Question이 아닌 Optional임에 주의하자. Optional은 null 처리를 유연하게 처리하기 위해 사용하는 클래스로 위와 같이 isPresent로 null이 아닌지를 확인한 후에 get으로 실제 Question 객체 값을 얻어야 한다.

findBySubject

이번에는 Question 엔티티의 subject 값으로 데이터를 조회해 보자.

하지만 아쉽게도 Question 리포지터리는 findBySubject와 같은 메서드를 기본적으로 제공하지는 않는다. findBySubject 메서드를 사용하려면 다음처럼 QuestionRepository 인터페이스를 변경해야 한다.

그리고 테스트 코드를 다음과 같이 수정해준다.

이제 제목으로 테이블 데이터를 조회할 수 있게 되었다!

인터페이스에 findBySubject 라는 메서드를 선언만 하고 구현은 하지 않았는데 실행이 되는 이유는, DI에 의해 스프링이 자동으로 JpaRepository를 상속한 QuestionRepository 객체를 생성한다. 이 때 프록시 패턴이 사용된다고 한다.

리포지터리 객체의 메서드가 실행될때 JPA가 해당 메서드명을 분석하여 쿼리를 만들고 실행한다.

즉, findBy + 엔티티의 속성명(예:findBySubject)과 같은 리포지터리 메서드를 작성하면 해당 속성의 값으로 데이터를 조회할수 있다.

 

findBySubject 메서드를 호출할때 실제 어떤 쿼리가 실행되는지 살펴보자. 실행되는 쿼리를 로그에서 보려면 application.properties 파일을 다음과 같이 수정해야 한다.

형광펜 그어진 맨 밑 두 줄 코드를 추가해준다. 그러면 테스트 코드를 실행했을 때,

이와 같이 방금 전까지는 보이지 않던 콘솔로그에서 실행된 쿼리가 나타나는데, 이 쿼리문의 where 조건에서 subject가 포함된 것을 확인할 수 있다.

 

findBySubjectAndContent

이번에는 제목과 내용을 함께 조회해 보자. 두 개의 속성을 And 조건으로 조회할때는 리포지터리에 다음과 같은 메서드를 추가해야 한다.

테스트 코드는 아래와 같이 수정한다.

이제 테스트 코드를 실행해보면

subject, content 컬럼이 and 조건으로 where문에 사용되었다.

이렇듯 리포지터리의 메서드명은 데이터를 조회하는 쿼리문의 where 조건을 결정하는 역할을 한다. 여기서는 findBySubject, findBySubjectAndContent 두 개만 알아봤지만 상당히 많은 조합을 사용할 수 있다.

 

findBySubjectLike

이번에는 제목에 특정 문자열이 포함되어 있는 데이터를 조회해 보자. Question 리포지터리를 다음과 같이 수정하자.

테스트 코드는 다음과 같이 수정하자.

테스트는 잘 통과될 것이다. Like 검색을 위해서는 findBySubjectLike 메서드의 입력 문자열로 "sbb%"와 같이 "%"를 적어주어야 한다. % 표기는 다음과 같은 의미를 갖는다.

  • sbb%: "sbb"로 시작하는 문자열
  • %sbb: "sbb"로 끝나는 문자열
  • %sbb%: "sbb"를 포함하는 문자열

마지막으로, 질문 데이터 수정, 삭제와 답변 데이터 생성, 저장, 조회 등에 대해서 다음 포스팅에 적도록 하겠다.

'백엔드 > Springboot' 카테고리의 다른 글

<번외> 프로젝트 github 등록 삽질기  (2) 2023.11.09
리포지터리(Repository) -3-  (0) 2023.09.18
리포지터리(Repository) -1-  (0) 2023.09.18
엔티티(Entity) -2-  (0) 2023.09.17
엔티티(Entity) -1-  (0) 2023.09.17

+ Recent posts