[toyProject] 게시물 사이트 Part 2
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 내의 메소드

JPQL의 결과인 Page<Object[]> 를 적절한 DTO로 변환.
가변적인 Sort를 적용하여 0째부터 size만큼을 가져오는 Pageable 객체를 리턴

Result에 정보를 담는 Query

PageResultDTO의 생성자. 2개의 파라미터
- 변화시킬 Object[] ( 쿼리 결과에 따라 조정 가능 >> 확장성!)
- 그리고 그 Object를 DTO로 변환시키는 함수
이 두가지를 동적으로 받아서, 모든 Entity들의 Service 계층에서
가변적인 Query의 결과 값을, 가변적인 DTO 타입으로 유동적이게 변환할 수 있게 만듬.


구해진 DTO 리스트를 내부에 저장.
사용 예시 (Test)

Bno로 1개 BoardDTO 가져오기.
Object로 3가지 select된 객체 리턴받음>> Object[] 로 type cast하여 3개 추출.

자신의 PK를 통한 삭제 (deleteById) 등은 기본 정의 되어있다.
그 외 특수한 케이스는 @modifying 어노테이션으로 Modify query 사용.
특정 bno( 게시물 번호) 가진 댓글 삭제하기

만약 게시물 삭제 후 해당 게시물에 달린 reply 자동 삭제 하고 싶을 때.
ReplyRepository에 Bno를 통해 해당 게시물에 대한 reply만 제거하는 modify 쿼리 작성

BoardService영역에 특정 게시물 삭제 요청시, 해당 게시물에 대한 reply도 같이 삭제.
+ 둘을 한 개의 transactoin으로 묶어야한다!

게시물 수정
Board: content, title만 수정가능, 나머진 불가능!!! 따라서 애초에 change메소드도 title, content에 대하여 각각 만든다. + DTO 전체를 받아서, 수정할 때는 변경될 수 있는 내용만 수정!

기본 findById >> Optional. 따라서 Optinal <Board> 받아서 추후 검증하거나, orelse로 검증 후 Board 객체로.
만약 존재하지 않는 객체>> IllegalArg 에러로( dto argu에 문제> 적절히 classify해서 설정하자)


* 인텔리제이 팁
Ctrl f>> 단어 찾기
ctrl r >> 단어 검색 후 단어 바꾸기
Controller