미니 프로젝트/게시판

[Java] 게시판 ⑤ Repository(service) ⓑ

웹개발자(진) 2024. 5. 24. 14:24
반응형
잡담

앞서 JPARepository를 이용해서 CRUD 형태의 기본적인 메서드를 만들어봤습니다. 이번에는 메인화면에서 게시글을 출력할 때 전체 출력 및 검색한 내용에 대해서만 출력할 수 있도록 메서드를 작성해 보았습니다. 


 

1. 출력(list)

list 메서드에서는 매개변수로 pageRequestDTO를 받아서 BoardDTO클래스를 가지는 PageResponseDTO리스트를 return 합니다. pageRequestDTO는 기본 페이지 정보를 가지고 있습니다. 예를 들어서 첫 페이지 번호, 페이지 사이즈, 검색조건도 받아오고, 입력받은 키워드값도 받아옵니다. list메서드를 이용해서 Controller에서 메인화면을 출력하고 검색한 조건을 활용한 출력도 가능해집니다.

@Override
    public PageResponseDTO<BoardDTO> list(PageRequestDTO pageRequestDTO){
        String[] types = pageRequestDTO.getTypes();
        String keyword = pageRequestDTO.getKeyword();
        Pageable pageable = pageRequestDTO.getPageable("bno");

        Page<Board> result = boardRepository.searchAll(types, keyword, pageable);

        List<BoardDTO> dtoList = result.getContent().stream()
                .map(board -> modelMapper.map(board, BoardDTO.class))
                .collect(Collectors.toList());

        return PageResponseDTO.<BoardDTO>withAll()
                              .pageRequestDTO(pageRequestDTO)
                              .dtoList(dtoList)
                              .total((int)result.getTotalElements())
                              .build();
    }

2024.05.22 - [미니 프로젝트/게시판] - [Java] 게시판 ④ Repository(search)

 

[Java] 게시판 ④ Repository(search)

다형성 예시운송 수단 클래스와 하위 클래스들:상위 클래스: 운송 수단(Vehicle)하위 클래스: 자동차(Car), 자전거(Bicycle), 비행기(Airplane)운송 수단(Vehicle) 클래스는 이동하기(move)라는 메서드를 갖고

gustjr7532.tistory.com


 

String[] types = pageRequestDTO.getTypes();
String keyword = pageRequestDTO.getKeyword();
Pageable pageable = pageRequestDTO.getPageable("bno");

Page<Board> result = boardRepository.searchAll(types, keyword, pageable);

pageRequestDTO에 담겨있던 types(검색조건), keyword(검색어), 그리고 앞서 pageRequestDTO에서 정의한 메서드인 getPageable메서드를 활용한 페이지네이션정보등을 변수로 담아 앞서 BoardSearch interface에 있고

BoardSearchImpl에서 QueryDsl을 통해 구현한 searchAll 메서드에 해당 변수들을 담아 Board형태의 Page리스트 변수에 입력받습니다.


 

List<BoardDTO> dtoList = result.getContent().stream()
                .map(board -> modelMapper.map(board, BoardDTO.class))
                .collect(Collectors.toList());

return PageResponseDTO.<BoardDTO>withAll()
                      .pageRequestDTO(pageRequestDTO)
                      .dtoList(dtoList)
                      .total((int)result.getTotalElements())
                      .build();

PageResponseDTO<BoardDTO> 형태로 리턴해주어야 합니다. PageResponseDTO클래스에서 생성자를 통해서 해당 형태로 주어야 하는데. 매개변수를 보시면 List형태의 dtoList 데이터 값을 가지고 있습니다.

public PageResponseDTO(PageRequestDTO pageRequestDTO,List<E> dtoList, int total)

 

  • result.getContent(): Page<Board> 객체에서 Board 엔티티 리스트를 가져옵니다.
  • .stream(): 리스트를 스트림으로 변환합니다.
  • .map(board -> modelMapper.map(board, BoardDTO.class)): 각 Board 엔티티 객체를 BoardDTO 객체로 매핑합니다. ModelMapper 라이브러리를 사용하여 매핑을 수행합니다.
  • .collect(Collectors.toList()): 매핑된 BoardDTO 객체들을 리스트로 수집합니다.

 

ModelMapper 라이브러리 같은경우는 다음시간에 다시 정의하도록 하겠습니다.

이런 식으로 Mapping 된 dtoList를 매개변수로 받아서 withAll을 사용해서 초기화시켜 주는데요,  withAll 메서드는 빌더 패턴에서 여러 속성을 한꺼번에 설정하는 메서드입니다. 보통 빌더 객체에 대해 필요한 모든 속성을 설정하는 역할을 합니다. 해당 이름은 PageRequestDTO에서 아래와 같은 형태로 지정해 줬었습니다.

@Builder(builderMethodName = "withAll")
public PageResponseDTO(PageRequestDTO pageRequestDTO,List<E> dtoList, int total)

현재 페이지에 대한 정보, 페이지에 대한 데이터, 총 데이터 값의 수 를 받아와 출력을 표시하는 데 사용합니다.

 


 

글을 마치며

Repository(service)을 진행하면서 중간중간에 ModelMapper 라이브러리가 나옵니다. Service에서 하는 역할이 DTO형태로 입력받은 데이터를 Controller에서 받으면 해당내용을 service에 메서드들을 통해서 DB에 접근하는데 접근할 때 VO형태로 Mapping을 통해서 들어가야 합니다. 해당 Mapping에 대한 설정을 ModelMapper에서 해줄 예정입니다. 다음시간에 ModelMapper 라이브러리에 대한 내용을 공부해 보도록 하겠습니다.

반응형