지난 시간에 이어 이번에는 조회(Read)와 삭제(Delete)를 구현해볼 것이다.
@RequiredArgsConstructor
@RestController
public class BoardController {
private final BoardService boardService;
//개별 조회
@GetMapping("/board/{id}")
public BoardResponseDto searchById(@PathVariable Long id) {
return boardService.searchById(id);
}
//전체 조회(목록)
@GetMapping("/board")
public List<BoardListResponseDto> searchAllDesc() {
return boardService.searchAllDesc();
}
}
@RequiredArgsConstructor
@Service
public class BoardService {
...
@Transactional(readOnly = true)
public BoardResponseDto searchById(Long id) {
Board board = boardRepository.findById(id).orElseThrow(()
-> new IllegalArgumentException("해당 게시물이 존재하지 않습니다."));
return new BoardResponseDto(entity);
}
@Transactional(readOnly = true)
public List<BoardListResponseDto> searchAllDesc() {
return boardRepository.findAllDesc().stream()
.map(BoardListResponseDto::new)
.collect(Collectors.toList());
}
}
@Transactional
에 readOnly = true
옵션을 설정한다. 트랜잭션 범위는 유지하되 기능을 조회로 제한함으로써 조회 속도가 개선된다.
전체 조회 메소드의 내용은 다음과 같다.
① boardRepository.findAllDesc().stream()
→ boardRepository 결과로 넘어온 Board의 Stream을
② .map(BoardListResponseDto::new)
→ map을 통해 BoardListResponseDto로 변환하여
③ .collect(Collectors.toList());
→ List로 반환
public interface BoardRepository extends JpaRepository<Board, Long> {
List<Board> findAllByOrderByIdDesc();
}
SpringDataJpa는 메소드 이름으로 쿼리 생성이 가능하다. 마지막 글부터 전체 조회한다. 다음 SQL문과 동일하다.
SELECT * FROM `Board` ORDER BY `id` DESC;
@Getter
public class BoardResponseDto {
private Long id;
private String member;
private String title;
private String content;
public BoardResponseDto(Board entity) {
this.id = entity.getId();
this.member = entity.getMember().getName();
this.title = entity.getTitle();
this.content = entity.getContent();
}
}
개별 조회시 데이터를 반환하기 위해 사용되는 BoardResponseDto
는 Entity의 필드 중 일부만 사용하므로 생성자로 Entity를 받아 필드에 값을 대입한다.
@Getter
public class BoardListResponseDto {
private Long id;
private String member;
private String title;
public BoardListResponseDto(Board entity) {
this.id = entity.getId();
this.member = entity.getMember().getName();
this.title = entity.getTitle();
}
}
전체 조회시 데이터를 반환하기 위해 List를 반환하는 BoardListResponseDto
도 같이 생성한다.
@RequiredArgsConstructor
@RestController
public class BoardController {
...
@DeleteMapping("/board/{id}")
public void delete(@PathVariable Long id){
boardService.delete(id);
}
}
@RequiredArgsConstructor
@Service
public class BoardService {
...
@Transactional
public void delete(Long id){
Board board = boardRepository.findById(id)
.orElseThrow(()->new IllegalArgumentException("해당 게시물이 존재하지 않습니다."));
boardRepository.delete(board);
}
}
엔티티를 조회하여 존재하는 게시물인지 확인하는 절차가 필요하다. 또한 JpaRespository
에서 delete
메소드를 기본적으로 지원하므로 이를 활용한다.
📖 참고