카테고리별 게시판 목록 조회하기
슬슬 최종목표인 페이징처리까지 다가가고 있다. 종강하자마자 거의 매일 도서관을 다니면서 JPA 책을 읽거나, 게시판 만들기에만 올인하고 있다. 3학년 2학기 성적이 슬슬 나오기 시작한다! 프로젝트도 준비하고, 정처기-sqld 자격증도 준비하고, 코테준비, 최종 졸업 학점 4.0 이상 이루기까지.. 여전히 갈 길은 멀지만 꾸준히 엉덩이 무겁게 앉아있어보려고 한다.
네이버카페를 들어가보면 각종 여러 카테고리 속성을 가지는 게시글로 분류되어 있다. 이 부분을 구현해보고싶었다.
자질구래한 실수들 때문에 구현하는데 시간이 조금 들었지만 조회하는데 성공하니 그래도 뿌듯하다.
/** 게시판 카테고리별로 불러오기 */
@GetMapping("/list/{category}")
public ResponseEntity<List<BoardResponseListDto>> boardList(@PathVariable("category") String category){
BoardCategory boardCategory = BoardCategory.of(category);
List<BoardResponseListDto> responseBoardList = boardService.boardList(boardCategory);
return ResponseEntity.status(HttpStatus.OK).body(responseBoardList);
}
프론트엔드가 있다고 가정하고 API로만 개발을 진행하다보니 테스트코드를 작성하기가 어렵다. 더구나 JWT 인증 과정까지 포함되기 때문에, 회원가입,로그인 과정을 진행할 때와는 다르게 조금 번거롭더라도 Postman으로 테스트를 진행했다.
- URI에 적혀있는 category 문자를 잡아내기 위해 @PathVariable 어노테이션으로 category를 매핑시켜서 String 객체로 담아서 BoardCategory 중 하나로 선별작업을 진행한다.
public enum BoardCategory {
GREETING, FREE, ADMIN, TOTAL;
public static BoardCategory of(String category) {
if (category.equalsIgnoreCase("greeting")) return BoardCategory.GREETING;
else if (category.equalsIgnoreCase("free")) return BoardCategory.FREE;
else if (category.equalsIgnoreCase("total")) return BoardCategory.TOTAL;
else if (category.equalsIgnoreCase("admin")) return BoardCategory.ADMIN;
else return null;
}
}
// BoardService class
public List<BoardResponseListDto> boardList(BoardCategory category){
List<Board> boards = boardRepository.findByBoardCategory(category);
return boards.stream().map(BoardResponseListDto::fromEntity).toList();
}
@Repository
public interface BoardRepository extends JpaRepository<Board, Long> {
List<Board> findByBoardCategory(BoardCategory category);
}
@Data
@Builder
@NoArgsConstructor
public class BoardResponseListDto {
/** 카테고리별 게시글 목록 확인 */
private String title;
private String content;
private int recommendCnt; //추천 수 카운트 현황
private String createDate; // 글 작성 일
private String writerName; // 글쓴이
public BoardResponseListDto(String title, String content, int recommendCnt, String createDate, String writerName) {
this.title = title;
this.content = content;
this.recommendCnt = recommendCnt;
this.createDate = createDate;
this.writerName = writerName;
}
// db에서 board list를 가져오면 map함수로 entity -> dto로 변환작업 진행
public static BoardResponseListDto fromEntity(Board board){
return BoardResponseListDto.builder()
.title(board.getTitle())
.content(board.getBody())
.recommendCnt(board.getRecommendCnt())
.createDate(board.getCreatedDate())
.writerName(board.getMember().getUsername())
.build();
}
}
List<BoardResponseListDto>로 리턴을 시켜서 결국엔 아래와 같은 결과물을 얻을 수 있다. 가입인사 글을 두개 작성했다고 했을 때, 가입인사 게시글 목록만 조회하는 테스트를 진행하였다.


참고로! 게시글 목록 조회의 경우 사용자 인증이 필요없기 때문에 SecurityConfig에서 permitAll()메소드 범주에 포함시켜주었기 때문에, JWT 토큰이 없고 No Auth라도 조회가 가능하다!
결과물로만 보니 과정이 단순한데, Security를 이해하면서 코드를 고민하니 시간이 꽤 걸린 것 같다. 언젠가 Security가 머리속에 그려지겠지..라는 생각이다.
글 쓰기 과정도 구현을 했다.
// BoardController
/** 게시판 글쓰기 */
@PostMapping("/write/{category}")
public ResponseEntity<BoardResponseWriteDto> write(
@PathVariable("category") String category,
@RequestBody BoardWriteDto boardWriteDto,
@AuthenticationPrincipal Member member){
Thread currentThread = Thread.currentThread();
BoardResponseWriteDto saveBoard = boardService.write(category, boardWriteDto, member); //저장정보 리턴
return ResponseEntity.status(HttpStatus.OK).body(saveBoard);
}
// BoardService Class
public BoardResponseWriteDto write(String category, BoardWriteDto boardWriteDto, Member member){
//DTO를 ENTITY로 바꾸기 -> member 객체로 회원 찾기 -> 로그인아이디로 멤버 판별 -> 글 저장
Board board = BoardWriteDto.applyCategory(boardWriteDto, category); //카테고리 적용까지 완료
Member writeMember = memberRepository.findByLoginId(member.getLoginId()).orElseThrow(
() -> new ResourceNotFoundException("Member", "Member LoginId", member.getLoginId()));
if (category.equalsIgnoreCase("greeting")){member.rankUp(MemberRole.REGULAR);} //준회원 + 가입인사 게시판 글쓰기 => 등업
board.setMappingMember(writeMember); // 양방향 연관관계 적용
Board saveBoard = boardRepository.save(board);
return BoardResponseWriteDto.fromEntity(saveBoard, writeMember.getNickname());
}
양방향 연관관계 매핑 작업이 일어나는 부분이었다. 연관관계의 주인인 board 객체에 정보를 저장하지만 member 객체에도 내용이 들어가도록 해주었다. 아직까진 굳이 양방향 매핑을 할 필요는 없지만, 기능을 더 고민하다가
'사용자 정보 조회-> 작성한 글 목록 조회' 기능을 넣을수도 있으니깐? 일단 다양한 방향으로 이야기를 만들어 나갈 수 있게 계속 구현하겠다.
'Backend' 카테고리의 다른 글
| [SpringBoot] 게시판 만들기 (advanced type) (4) - 등급 별 총 회원 수 (0) | 2023.12.25 |
|---|---|
| [SpringBoot] 게시판 만들기 (advanced type) (3) - 회원탈퇴 (CascadeType.REMOVE) (2) | 2023.12.24 |
| [SpringBoot] 게시판 만들기 (advanced type) (2) - JWT 적용하기 (Springboot 3.x, Swagger 3.0) (4) | 2023.12.22 |
| [SpringBoot] 게시판 만들기 (advanced type) (0) | 2023.12.18 |
| [Spring Boot] 게시판 만들기(step1) (3) | 2023.12.18 |