[Spring Boot] 게시판 구현 2 - 게시물 등록/수정/조회/삭제 API 만들기 ②

joyful·2021년 4월 30일
1

Java/Spring

목록 보기
11/28

지난 시간에 이어 이번에는 조회(Read)와 삭제(Delete)를 구현해볼 것이다.

📝 조회 API - Read

BoardController

@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();
    }

}

BoardService

@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());
    }
    
}

@TransactionalreadOnly = true 옵션을 설정한다. 트랜잭션 범위는 유지하되 기능을 조회로 제한함으로써 조회 속도가 개선된다.

전체 조회 메소드의 내용은 다음과 같다.

① boardRepository.findAllDesc().stream()
→ boardRepository 결과로 넘어온 Board의 Stream을
② .map(BoardListResponseDto::new)
→ map을 통해 BoardListResponseDto로 변환하여
③ .collect(Collectors.toList());
→ List로 반환

BoardRepository.java

public interface BoardRepository extends JpaRepository<Board, Long> {

	List<Board> findAllByOrderByIdDesc();
}

SpringDataJpa는 메소드 이름으로 쿼리 생성이 가능하다. 마지막 글부터 전체 조회한다. 다음 SQL문과 동일하다.

SELECT * FROM `Board` ORDER BY `id` DESC;

BoardResponseDto

@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();
    }
}

개별 조회시 데이터를 반환하기 위해 사용되는 BoardResponseDtoEntity의 필드 중 일부만 사용하므로 생성자로 Entity를 받아 필드에 값을 대입한다.

BoardListResponseDto

@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도 같이 생성한다.

📝 삭제 API - Delete

BoardController

@RequiredArgsConstructor
@RestController
public class BoardController {
    
    ...
    
    @DeleteMapping("/board/{id}")
    public void delete(@PathVariable Long id){
        boardService.delete(id);
    }

}

BoardService

@RequiredArgsConstructor
@Service
public class BoardService {

    ...

    @Transactional
    public void delete(Long id){
        Board board = boardRepository.findById(id)
                .orElseThrow(()->new IllegalArgumentException("해당 게시물이 존재하지 않습니다."));

        boardRepository.delete(board);
    }
    
}

엔티티를 조회하여 존재하는 게시물인지 확인하는 절차가 필요하다. 또한 JpaRespository에서 delete 메소드를 기본적으로 지원하므로 이를 활용한다.




📖 참고

  • 스프링 부트와 AWS로 혼자 구현하는 웹 서비스(이동욱 저)
profile
기쁘게 코딩하고 싶은 백엔드 개발자

0개의 댓글