특정 한 게시판을 조회하는 API를 만들어 보려고 한다.
먼저 Service 코드부터 작성해보자.
@Override
public Board findOne(int id) {
return repository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("not found : " + id));
}
findById 는 CrudRepository 에 있는 메소드이다.
id 를 기반으로 Board를 탐색한다.
서비스 코드를 작성했으니 컨트롤러를 작성해보자.
@GetMapping("/{id}")
public ResponseEntity<Board> findOneBoard(@PathVariable int id) {
Board board = boardService.findOne(id);
return ResponseEntity.status(HttpStatus.OK)
.body(board);
}
이러면 벌써 게시글 하나 조회하는 API는 작성이 완료되었다. JPA를 이용하니 더욱더 간단하다.
게시판 수정 API도 위와 마찬가지로 하면 되지만, 한 가지 단계를 더 추가해야한다.
이전에 만들었던 Board DTO 객체에 update 메소드를 추가해준다.
public void update(String title, String content) {
this.title = title;
this.content = content;
}
그 후 이전에 했던 방법과 마찬가지로 각각 서비스와 컨트롤러 부분 코드를 작성해준다.
@Override
@Transactional
public Board update(int id, BoardRequest boardRequest) {
Board board = repository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("not found : " + id));
board.update(boardRequest.getTitle(), boardRequest.getContent());
return board;
}
그런데 업데이트 메소드를 보면 위에 @Transactional 이 붙은 것을 확인할 수가 있다.
이 어노테이션은 매칭한 메서드를 하나의 트랜잭션으로 묶어준다.
예를 들어 내가 A의 계좌에 돈을 송금하면 A의 계좌엔 돈이 입금 되어야 하는데, 돈이 송금되고 나서 시스템이 멈춰버리면 돈은 감쪽같이 사라지게 된다. 그렇기 때문에 이 두가지 작업을 하나로 묶어서, 즉, 트랜잭션으로 묶어서 한 단위로 실행하게끔 만드는 것이다.
여기서는 Board를 읽어오는 단위와 수정해주는 단위를 하나로 묶어서 작업한 것이다.
@PutMapping("/{id}")
public ResponseEntity<Board> updateBoard(@PathVariable int id, @RequestBody BoardRequest boardRequest) {
Board board = boardService.update(id, boardRequest);
return ResponseEntity.status(HttpStatus.OK)
.body(board);
}
컨트롤러는 이전과 다를바가 없다.
삭제도 마찬가지로 별 다를게 없다.
각 서비스 코드와 컨트롤러 코드를 작성해 주자.
@Override
public void delete(int id) {
repository.deleteById(id);
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteBoard(@PathVariable int id) {
boardService.delete(id);
return ResponseEntity.status(HttpStatus.OK)
.build();
}
삭제를 마지막으로 CRUD API를 다 만들었다!
끝 -*