Page 처리 ( PageResultDTO 구조)
목적: repository의 JPQL이 select한 정보 <페이지 처리> Service
이 가운데 페이지 처리를 2개의 Page관련 DTO로 처리한다!
다양한 domain, Service 존재하고, 다양한 JPQL 존재.
다양한 JPQL에서 select된 정보들은 Object[] 타입에 저장한다.
>> 다양한 JPQL에 따른 다양한 Object[] 구조
Ex: Long, String 이 select되면 이 두개 저장, Member, Board 객체를 select시 Board, Member 객체가 저장, …….
>> 유동적인 JPQL 결과값들
Domain or Entity: 각 Entity는 계층간 이동할 때, Entity 채로 움직이지 않고, 필요한 정보만 담은 DTO로 이동. 다양한 DTO가 존재한다.
유동적인 JPQL 결과 값들을, 다양한 DTO 에서 사용+ Page 처리를
PageRequestDTO
PageResultDTO
두개에서 처리.
이후 각 Service 계층에서 적절하게 사용하면된다. ( PageResultDTO의 생성자에 파라미터로
유동적인 JPQL 결과타입들(Object[]) 와 원하는 DTO로 변환하는 함수를 줘서 한번에 처리.
BoardServiceImpl 내의 메소드
![](https://blog.kakaocdn.net/dn/uTBr0/btrVQO5qrro/q3VQsY2UvBKhHsIhFvhRJk/img.png)
JPQL의 결과인 Page<Object[]> 를 적절한 DTO로 변환.
가변적인 Sort를 적용하여 0째부터 size만큼을 가져오는 Pageable 객체를 리턴
![](https://blog.kakaocdn.net/dn/csvA6a/btrVTlBEmC0/kvcdtf2VQGE0zIl84yf1rk/img.png)
Result에 정보를 담는 Query
![](https://blog.kakaocdn.net/dn/ci5oyS/btrVPGmdWu8/GZx42uINoK6KhDxHxaQkU1/img.png)
PageResultDTO의 생성자. 2개의 파라미터
- 변화시킬 Object[] ( 쿼리 결과에 따라 조정 가능 >> 확장성!)
- 그리고 그 Object를 DTO로 변환시키는 함수
이 두가지를 동적으로 받아서, 모든 Entity들의 Service 계층에서
가변적인 Query의 결과 값을, 가변적인 DTO 타입으로 유동적이게 변환할 수 있게 만듬.
![](https://blog.kakaocdn.net/dn/dhneKr/btrVPGmdWuE/a1Mfz1m6KVqM8wuQjscp7k/img.png)
![](https://blog.kakaocdn.net/dn/bM0teA/btrVQnUhw3G/g3abAOwZG0WzYfSq3QmUs0/img.png)
구해진 DTO 리스트를 내부에 저장.
사용 예시 (Test)
![](https://blog.kakaocdn.net/dn/bwl3Sb/btrVVeVMIWV/c8TDKVuBCcMnK5o6gKKq8K/img.png)
Bno로 1개 BoardDTO 가져오기.
Object로 3가지 select된 객체 리턴받음>> Object[] 로 type cast하여 3개 추출.
![](https://blog.kakaocdn.net/dn/dExTb3/btrVRDJkT11/vkVAMcwcu6PCZa1NiCPRh0/img.png)
자신의 PK를 통한 삭제 (deleteById) 등은 기본 정의 되어있다.
그 외 특수한 케이스는 @modifying 어노테이션으로 Modify query 사용.
특정 bno( 게시물 번호) 가진 댓글 삭제하기
![](https://blog.kakaocdn.net/dn/cm0Qag/btrVPGfs0nu/eE9BxrGdCDLDvNksaZ4sKK/img.png)
만약 게시물 삭제 후 해당 게시물에 달린 reply 자동 삭제 하고 싶을 때.
ReplyRepository에 Bno를 통해 해당 게시물에 대한 reply만 제거하는 modify 쿼리 작성
![](https://blog.kakaocdn.net/dn/boksyS/btrVWfzYLEv/g2cUdkacXhvlX1uJVEVk50/img.png)
BoardService영역에 특정 게시물 삭제 요청시, 해당 게시물에 대한 reply도 같이 삭제.
+ 둘을 한 개의 transactoin으로 묶어야한다!
![](https://blog.kakaocdn.net/dn/dm0Ekz/btrVT8WqoBN/rwkFy5Y4magJ6xeRhBquQk/img.png)
게시물 수정
Board: content, title만 수정가능, 나머진 불가능!!! 따라서 애초에 change메소드도 title, content에 대하여 각각 만든다. + DTO 전체를 받아서, 수정할 때는 변경될 수 있는 내용만 수정!
![](https://blog.kakaocdn.net/dn/5zz1v/btrVWzym6Tb/qEnmOxwiA8CiHaENtQlXwK/img.png)
기본 findById >> Optional. 따라서 Optinal <Board> 받아서 추후 검증하거나, orelse로 검증 후 Board 객체로.
만약 존재하지 않는 객체>> IllegalArg 에러로( dto argu에 문제> 적절히 classify해서 설정하자)
![](https://blog.kakaocdn.net/dn/3yqki/btrVTUqyImS/jV4WP5s47Cuuegfqi4m50k/img.png)
![](https://blog.kakaocdn.net/dn/bTGWjk/btrVSsujYwM/blA1I6anH9ARDAVsbTtsak/img.png)
* 인텔리제이 팁
Ctrl f>> 단어 찾기
ctrl r >> 단어 검색 후 단어 바꾸기
Controller
'Spring boot' 카테고리의 다른 글
Spring security란? (0) | 2023.01.25 |
---|---|
자바 Stream 정리 [Stream, Map, Filtering, Sorted, Collect] (0) | 2023.01.15 |
[toyProject] 게시물 사이트 Part 3 (0) | 2023.01.10 |
[toyProject] 게시물 사이트 Part 1 (0) | 2023.01.10 |
[김영한 스프링 입문] 주요 이론 정리 (0) | 2023.01.10 |