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