NormalBoardController.java

페이징을 위해 Pagable을 사용하였으나 swagger에서 default 수치가 적용되지 않아 swagger에서는 보이지 않도록 

@Parameter를 사용

    /*
    * @PageableDefault: 디폴트 페이지 설정(size= 한 페이지 당 보여줄 데이터의 수, sort=등록시간으로 정렬, directin= 내림차순 정렬
    * @Parameter: swagger 문서 작성을 위한 annotation(파라미터 설명 작성),  swagger에 디폴트 파라미터가 적용되지 않아서 추가
    * Pageable: 페이지 설정
    * */
    @PostMapping("/list")
    @Operation(summary = "게시물 목록 조회(")
    public ResponseEntity<ApiResultDto<Page<NormalBoardSearchDto>>> selectNormalBoardTitleList(
            @RequestBody NormalBoardSearchDto board
            , @PageableDefault(size = 10, direction = Sort.Direction.DESC, sort = "firstRegTime") @Parameter(hidden = true) Pageable page
    ) {
        ApiResultDto<Page<NormalBoardSearchDto>> result = new ApiResultDto<>();
        try {


            Page<NormalBoardSearchDto> t = normalBoardService.selectNormalBoardTitles(board, page);
            result.setData(t);
            result.setResultCode("200");
            result.setResultMessage("Success");
        } catch (Exception e) {
            log.error(e.getMessage());
            result.setResultCode("500");
            result.setResultMessage("Fail");
        }

        return new ResponseEntity<>(result, result.getResultCode().equals("200") ? org.springframework.http.HttpStatus.OK
                : org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR);
    }

 

NormalBaordSearchDto.java

Entity의 NormalBoard나 InsertDto를 사용하려 했으나 swagger에 불필요한 Content, LastUpdTime등 데이터가 표기 되어 별도의 Dto를 만들기로 함.

 

Repository에서 Entity가 아닌 Dto로 return 받을 수 있도록 생성자 추가

package com.portfolio.Dto;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;

/**
 * 일반 게시판(목록)
 date : 2024.09.03
 author : 김만기

 ====== Annotation description ======
 Schema: swagger 문서 작성을 위한 annotation

 ====== field description ======
 title: 게시판 제목
 content: 게시판 내용

 ====== method description ======


 ====== etc description ======

 */
@Getter
@Setter
public class NormalBoardSearchDto {

    @Schema(description = "게시판 아이디", example = "게시판 아이디")
    private String boardId;
    @Schema(description = "게시판 제목", example = "게시판 제목")
    private String title;
    @Schema(description = "게시판 작성자", example = "게시판 작성자")
    private String firstRegUser;
    @Schema(description = "작성 시간", example = "작성시간")
    private LocalDateTime firstRegTime;


    public NormalBoardSearchDto(String boardId, String title, String firstRegUser, LocalDateTime firstRegTime) {
        this.boardId = boardId;
        this.title = title;
        this.firstRegUser = firstRegUser;
        this.firstRegTime = firstRegTime;
    }

}

 

 

BoardService.java

BoardServiceImpl.java

Repo의 메소드 호출

package com.portfolio.serviceimpl;

import com.portfolio.Dto.NormalBoardSearchDto;
import com.portfolio.entity.NormalBoard;
import com.portfolio.repo.NormalBoardRepo;
import com.portfolio.service.NormalBoardService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.List;
/*
    * 일반 게시판 서비스 구현체
    * date: 2024-07-26
    * last_modified: 2024-10-28
    * author: 김만기
    *
    * ====== Annotation description ======
    * Service: 서비스 빈으로 등록
    *
    * ====== method description ======
    * insertNormalBoard: 일반 게시판 등록
    * selectAllBoardList: 모든 게시판 조회
    * selectNormalBoardTitles: 게시판 제목 조회
 */
@Service
@RequiredArgsConstructor
@Slf4j
public class NormalBoardServiceImpl implements NormalBoardService {
    private final NormalBoardRepo boardRepo;

    @Override
    public void insertNormalBoard(NormalBoard board) {
        boardRepo.save(board);
    }

    @Override
    public List<NormalBoard> selectAllBoardList() {
        return boardRepo.findAll();
    }

    /**
     * 게시판 제목 조회
     * date 2024.10.28
     * last_modified 2024.10.28
     */
    @Override
    public Page<NormalBoardSearchDto> selectNormalBoardTitles(NormalBoardSearchDto board, Pageable pageable) {
        return boardRepo.findByTitle(board, pageable);
    }
}

 

 

NormalBoardRepo.java

package com.portfolio.repo;


import com.portfolio.Dto.NormalBoardSearchDto;
import com.portfolio.entity.NormalBoard;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

/*
    * date: 2024-07-26
    * author: 김만기
    * JpaRepository를 상속받아 NormalBoard 엔티티를 관리하는 레포지토리
    *
    *   ====== Annotation description ======
    * Query: JPQL을 사용하여 쿼리문 작성
    *  - select new com.portfolio.Dto.NormalBoardSearchDto: NormalBoardSearchDto객체에 매핑
    *  - where board.title like %:#{#board.title}%: searchBoard.title에 해당하는 값을 포함하는 데이터 조회
    *
 */
public interface NormalBoardRepo extends JpaRepository<NormalBoard, String> {

    /*
     * last_modified: 2024-10-28
     */
    @Query("select new com.portfolio.Dto.NormalBoardSearchDto( board.boardId, board.title, board.firstRegUser, board.firstRegTime)  " +
            "from NormalBoard board " +
            "where board.title like %:#{#searchBoard.title}% ")
    Page<NormalBoardSearchDto> findByTitle(NormalBoardSearchDto searchBoard, Pageable pageable);
}

 


SWAGGER Parameter 적용 전 

page의 데이터가 default로 설정한 값이 들어가지 않음.

 

조회 결과

 

requestBody

Response

{
  "resultCode": "200",
  "resultMessage": "Success",
  "data": {
    "content": [
      {
        "boardId": "8d6341c8-9e24-48a6-a3b6-2c657b7575fa",
        "title": "게시판 제목",
        "firstRegUser": "admin",
        "firstRegTime": "2024-10-28T13:11:48.744752"
      },
      {
        "boardId": "08daea24-0be3-481f-a5f4-2eb56bb75a1d",
        "title": "게시판 제목",
        "firstRegUser": "admin",
        "firstRegTime": "2024-10-28T13:11:48.600051"
      },
      {
        "boardId": "55416544-3a77-4418-ad97-d47b90d43cd8",
        "title": "게시판 제목",
        "firstRegUser": "admin",
        "firstRegTime": "2024-10-28T13:11:48.451605"
      },
      {
        "boardId": "15dfeff3-2883-43b5-8b43-19b32c6d1ad2",
        "title": "게시판 제목",
        "firstRegUser": "admin",
        "firstRegTime": "2024-10-28T13:11:48.311657"
      },
      {
        "boardId": "e49e5819-bded-4584-ab81-83982a34a8c0",
        "title": "게시판 제목",
        "firstRegUser": "admin",
        "firstRegTime": "2024-10-28T13:11:48.156085"
      },
      {
        "boardId": "1c33ff14-d99f-4263-bc02-a3eb8c87a894",
        "title": "게시판 제목",
        "firstRegUser": "admin",
        "firstRegTime": "2024-10-28T13:11:48.017085"
      },
      {
        "boardId": "766a45bb-7831-41c9-ae0c-d8d13a449c9c",
        "title": "게시판 제목",
        "firstRegUser": "admin",
        "firstRegTime": "2024-10-28T13:11:47.88268"
      },
      {
        "boardId": "321ba6bb-70f1-4fa4-ad34-5772870fb8c4",
        "title": "게시판 제목",
        "firstRegUser": "admin",
        "firstRegTime": "2024-10-28T13:11:47.740277"
      },
      {
        "boardId": "75530f37-230a-4703-8a69-b418f7b9dc96",
        "title": "게시판 제목",
        "firstRegUser": "admin",
        "firstRegTime": "2024-10-28T13:11:47.599972"
      },
      {
        "boardId": "0d95876d-99f6-4266-93d4-c6381b699b6d",
        "title": "게시판 제목",
        "firstRegUser": "admin",
        "firstRegTime": "2024-10-28T13:11:47.4611"
      }
    ],
    "pageable": {
      "pageNumber": 0,
      "pageSize": 10,
      "sort": {
        "empty": false,
        "sorted": true,
        "unsorted": false
      },
      "offset": 0,
      "paged": true,
      "unpaged": false
    },
    "last": false,
    "totalElements": 28,
    "totalPages": 3,
    "first": true,
    "size": 10,
    "number": 0,
    "sort": {
      "empty": false,
      "sorted": true,
      "unsorted": false
    },
    "numberOfElements": 10,
    "empty": false
  }
}

https://github.com/Kmmanki/portfolio_was

 

GitHub - Kmmanki/portfolio_was: portfolio

portfolio. Contribute to Kmmanki/portfolio_was development by creating an account on GitHub.

github.com

 

+ Recent posts