Spring boot

[toyProject] 게시물 사이트 Part 2

코앤미 2023. 1. 10. 22:31

Page 처리 ( PageResultDTO 구조) 

 

목적: repositoryJPQLselect한 정보 <페이지 처리>  Service 

이 가운데 페이지 처리를 2개의 Page관련 DTO로 처리한다! 

 

다양한 domain, Service 존재하고, 다양한 JPQL 존재. 

다양한 JPQL에서 select된 정보들은 Object[] 타입에 저장한다. 

>> 다양한 JPQL에 따른 다양한 Object[] 구조 

Ex: Long, String select되면 이 두개 저장, Member, Board 객체를 selectBoard, 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개의 파라미터 

  1. 변화시킬 Object[] ( 쿼리 결과에 따라 조정 가능 >> 확장성!) 
  1. 그리고 그 Object DTO로 변환시키는 함수 

이 두가지를 동적으로 받아서, 모든 Entity들의 Service 계층에서 

가변적인 Query의 결과 값을, 가변적인 DTO 타입으로 유동적이게 변환할 수 있게 만듬. 

 

 

구해진 DTO 리스트를 내부에 저장. 

 

사용 예시 (Test) 

 

 

Bno1BoardDTO 가져오기. 

Object3가지 select된 객체 리턴받음>> Object[] type cast하여 3개 추출. 

 

자신의 PK 통한 삭제 (deleteById) 등은 기본 정의 되어있다. 

그 외 특수한 케이스는 @modifying 어노테이션으로 Modify query 사용.  

 

특정 bno( 게시물 번호) 가진 댓글 삭제하기 

 

 

 

만약 게시물 삭제 후 해당 게시물에 달린 reply 자동 삭제 하고 싶을 때. 

 

ReplyRepositoryBno 통해 해당 게시물에 대한 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