이번 글도 역시 생각없이 공부했던 나에게 반성하는 의미가 있다. 생각 없이 쇼핑몰 게시판을 만들다가 문뜩 Page라는 것에 대한 찜찜한이 생겼다. Page, 맨 처음에 공부했을 때 그냥 데이터 잘라서 보낼 때 사용하는 것 정도만 이해했다. 이렇게만 생각하고 공부하다가 문뜩 누가 나한테 Spring에서 page, pageable클래스가 뭐에요? 라고 물어보면 머릿속이 하얗게 될 것이 분명했다. 과연 이 Page라는 녀석은 왜 무엇일까?
Spring data와 domain
우리가 page를 import시켜서 사용할 때
이런 식으로 사용하게 된다. 그럼 Page를 이해하기 위해서는 spring의 data가 무엇인지 부터 알아야할 것이다.
Spring데이터는 여러 데이터 베이스에 접근을 할 때 spring에서 사용하기 위한 툴을 만드는 프로젝트이다. 내가 많이 사용하고 있는 JPA의 경우 Spring.data.jpa로 가져오는 것이고 이 외에도 database랑 통신을 하기 위한 여러 모듈들이 있는 것으로 볼 수 있다. 즉, spring에서는 db에 대한 접근을 spring기반으로 프로그래밍 모델을 만들 수 있게 spring data를 만든 것으로 이해 했다.
그럼 spring.data.domain은 무엇일까?
직역을 하자면 Repository 추상화와 같이 쓰이는 domain 추상화 라는 거다. 이 말을 이해하려면 추상화를 먼저 좀 더 이해해야한다.
추상화란?
추상화란 모듈의 중요한 특성이 무엇인지, 무엇을 하는지 파악하는 것으로 전체 프로그램에서 어떤 모듈이 무엇을 하는지를 이야기하는 것을 추상화라고 합니다.
그럼 도메인 추상화라는게 뭘까? 아니 그 전에 도메인이라는게 뭘까?
도메인?
도메인이란 사용자가 프로그램을 사용하는 대상 분야라고 한다. 즉, 사용자가 사용하는 모든 것이라는 의미로 해석될 수 있다.
그럼 도메인 추상화는 사용자가 내 프로그램에서 사용하는 모든 대상 분야라는 거다. 너무 넓다고 생각이 들었는데 단순히 생각해보면 서버를 만들 때 도메인 추상화라는 거는 내가 사용자한테 어떤 서비스를 줘야하는지에 대한 이야기를 하는 것으로 이해된다. 그럼 Spring.data.domain은 아까 위에서도 말했듯이 repository 추상화와 관련된 일을 하니깐 사용자에게 넘겨줄 데이터와 관련된 추상화라는 이야기일 것이다.
Page의 정의
먼저 spring docs에서 page에 대한 설명 글을 보겠다.
object의 리스트의 서브리스트로 전체 리스트에서 위치에 대한 정보를 얻을 수 있게 해준다고 한다.
생각해보자, page는 spring.data.domain에 속해있다. 여기서는 사용자가 요청하는 데이터에 대한 처리를 하는 애들이다. 그럼 여기서 말하는 object 리스트는 db에서 사용자의 요청에 따라 추출한 데이터 리스트일것이고 이 중 일부분을 이야기 하는 것이 page라고 이해할 수 있다.
일단 여기까지 이해하고 소스코드를 까보자
모든 추상 클래스의 역할을 알려면 일단 역시 상속 받는 추상 클래스가 뭔지부터 알아야하는건 국룰인거 같다.
Slice는
데이터의 slice이다. 대신 해당 데이터가 다음 slice도 존재하는지 이야기하는 역할을 한다고 한다.
그럼 page는 이걸 상속 받았으니 전체 데이터에서 일단 다음 slice가 존재하는지 알 수 있는 존재다. 이걸 page관점에서 이야기해보면 page객체는 다음 page가 존재하는지 알 수 있는 데이터의 조각이다.
근데 중요한 점은 slice는 다음 혹은 이전 slice에 대한 정보만 가져올 수 있지만 page 인터페이스에 구현 목록에는 전체 page에 대한 조회가 있다. 이건 추후에 시험해 볼만 하겠지만 page로 만든 객체에 대한 jpa쿼리는 필요 이상으로 나갈 수 있을 것이라는 추측이 가능하다.
자 이제까지 Page에 대한 공부를 해 본 결과 page는 사용자에게 건네줄 데이터를 여러개의 sublist로 나누는데 사용되는 모듈인 것을 알 수 있었다. 또한 page는 기본적으로 전체 데이터의 sublist중 자신의 index를 가지고 있고 slice와 달리 전체 리스트에 대한 정보도 가져올 수 있는 모듈임을 알 수 있었다.
아직 끝나지 않았다. page로 어떻게 db와 관련있게 되는데? 라는 질문에 대답을 못한다. page는 db쿼리에 대한 결과를담는 객체이지 그걸 이용해서 query어떤 식으로 날라가는지에 대한 답은 하지 못한다.
2편이 기대되는 부분이다.
긴 글 읽어주셔서 감사합니다.
틀린 부분이 있으면 댓글을 달아주시면 감사하겠습니다.
📧 : may3210@g.skku.edu
'개발 > Spring' 카테고리의 다른 글
[Spring]JUnit에서 Async메소드의 비정상적인 종료 - 1편 (0) | 2022.02.10 |
---|---|
[Spring] Rest Docs 빌드 부터 사용까지 (2) | 2022.01.24 |
[Spring] Spring Security의 이해 (0) | 2022.01.19 |
[Spring] Spring 을 이용한 웹 서비스 구조 (0) | 2022.01.12 |
[Spring]@Transactional과 JUnit Test (2) | 2022.01.11 |