게시글 작성 기능에 이어서 글을 읽을 수 있는 기능을 넣어줍시다. 일단 게시글 목록 조회도 필요할 테고 그중에서 마음에 드는 글의 내용을 볼 수 있도록 해볼게요.
BoardController
@GetMapping("/board/list")
public String list(Model model){
model.addAttribute("postList",boardService.findAllDesc());
return "board/list.html";
}
@GetMapping("/board/post/{id}")
public String findById (@PathVariable Long id,Model model){
BoardDto boardDto = boardService.findById(id);
model.addAttribute("post",boardDto);
return "board/detail.html";
}
list 메서드는 게시글 목록을 조회하기 위한 내용이고 findById는 게시글 디테일한 내용을 조회하는 파트입니다. 메서드명 작성 스타일이 다른 이유는.. 원래 조졸두님이나 김영한님 스타일처럼 findById 스타일로 list도 이름을 정해주고 싶었지만 제 창의력 부족으로 인해..
아무튼 코드를 살펴봅시다.
Model addAttribute(String name, Object value)
value 객체를 name이라는 이름으로 View에 넘겨줍니다.
즉 저 코드에서는 boardService.findAllDesc() 한 결과를 View단에 넘겨주겠죠.
View단에서는 postList를 받아서 데이터를 보기 좋게 보여줄텐데 그것은 저는 다루지 않겠습니다.
@PathVariable
PathVariable 어노테이션은 @GetMapping("/board/post/{id}") 에서 저 {id}랑 매칭이 됩니다. 음 말 그대로 저 경로에다가 변수를 넣어줄 수 있도록 해주는 겁니다. 제 경우에는 포스트 번호(id)랑 매핑이 됩니다.
요청으로 들어온 변수가 데이터베이스에 id 값으로 저장되어 있는 경우 그것을 조회해서 얘도 View로 넘겨줍니다.
BoardRepository
public interface BoardRepository extends JpaRepository<Board,Long> {
@Query("SELECT b FROM Board b ORDER BY b.id DESC")
List<Board> findAllDesc();
}
findAllDesc라는 메서드랑 저 쿼리문이랑 연결해줍시다.
BoardService
@Transactional(readOnly = true)
public List<BoardListDto> findAllDesc(){
return boardRepository.findAllDesc().stream()
.map(BoardListDto::new)
.collect(Collectors.toList());
}
public BoardDto findById(Long id){
Board entity = boardRepository.findById(id).orElseThrow(()->new IllegalArgumentException("해당 게시글이 없습니다. id = "+id));
return new BoardDto(entity);
}
findAllDesc 같은 경우에는 쿼리문 결과를 List 형으로 묶어주기 위한 작업을 하고 있습니다.
findById는 JpaRepository에서 기본으로 제공합니다. id값을 기준으로 entity에서 값을 찾고, 만약에 값이 있다면 그대로 return을 하고 값이 없다면 예외 처리를 해줍니다.
DTO
@Getter
public class BoardDto {
private Long id;
private String title;
private String content;
private String author;
private LocalDateTime modifiedDate;
public BoardDto(Board entity){
this.id = entity.getId();
this.title = entity.getTitle();
this.content = entity.getContent();
this.author = entity.getAuthor();
this.modifiedDate = entity.getModifiedDate();
}
}
@Getter
public class BoardListDto {
private Long id;
private String title;
private String author;
private LocalDateTime modifiedDate;
public BoardListDto(Board entity){
this.id = entity.getId();
this.title = entity.getTitle();
this.author = entity.getAuthor();
this.modifiedDate = entity.getModifiedDate();
}
}
게시글 목록들을 조회할때랑 특정 게시글을 조회하는 거랑 원하는 값이 다르잖아요?? 원래라면 그걸 어디서 따로 처리해줘야겠지만 수정할 때마다 문제가 생겨서 임시방편으로 DTO를 분리해버렸습니다...
이렇게 Read 기능까지 구현해봤습니다.
만약에 View쪽의 코드가 필요하신 분들은 아래 블로그에서 참고해주세요. 저도 이분의 코드를 대부분 가져와서 사용했습니다.
https://kyuhyuk.kr/article/spring-boot/2020/07/20/Spring-Boot-JPA-MySQL-Board-Post-View
'web > spring&spring boot' 카테고리의 다른 글
[spring boot] 스프링 부트 게시판 수정하기 기능 추가 (0) | 2021.05.27 |
---|---|
[spring boot] 스프링 시큐리티 세션 활용하기 (0) | 2021.05.21 |
[spring boot] 스프링 부트 게시판 등록 구현하기(2) (0) | 2021.05.19 |
[spring/spring boot] 스프링 부트 회원가입 후 자동로그인 기능 구현하기 (0) | 2021.05.17 |
[spring boot] 로그아웃 기능 구현하기 (0) | 2021.05.15 |