요청을 받았을 때 각 상황에 따라 예외를 발생시키고 처리하고자 한다.
요청에 대해 처리할 때 다양한 문제가 발생할 수 있는데 이를 예외를 발생시켜 catch에서 처리하는 것이 낫다고 생각했다. 그래서 Service 클래스에 throws 키워드를 사용해 Controller에서 예외에 맞게 응답을 반환할 수 있도록 했다.
여기서 예외는 각 Http 상태 코드에 맞추어 발생시킬 수 있도록 ResponseStatusException을 사용했다. 이 예외 클래스에 getStatus() 메서드가 있는데 이 메서드를 사용해 예외에 해당하는 Http 상태 코드를 HttpStatus 타입으로 반환할 수 있다. catch 문에서는 이 상태 코드를 비교해 알맞은 클라이언트에게 응답을 전달한다.
@PutMapping("/{boardSn}")
public ResponseEntity<?> updateBoard(@PathVariable Long boardSn, @RequestBody BoardDto boardDto){
try{
return ResponseEntity.ok(boardService.updateBoard(boardSn, boardDto));
} catch(ResponseStatusException e){
if(e.getStatus() == HttpStatus.NOT_FOUND)
return ResponseEntity.notFound().build();
if(e.getStatus() == HttpStatus.UNAUTHORIZED)
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("비밀번호가 틀렸습니다.");
return ResponseEntity.internalServerError().build();
}
}
위 코드는 게시글을 수정하는 요청을 처리하는 메서드이다. 게시글 수정에서 발생할 수 있는 예외는 3가지가 있다.
첫 번째는 요청받은 게시글 번호와 일치하는 게시글이 없는 경우. 이 경우 Http 상태 코드 중 Not Found(404)를 발생시킨다.
Board selectedBoard = boardRepository.findById(boardSn)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND,
"게시글이 존재하지 않습니다."));
두 번째는 수정하고자하는 게시글의 비밀번호가 일치하지 않는 경우. 이 경우 Unauthorized(401)를 발생시킨다.
if(!selectedBoard.getBoardPw().equals(boardDto.getBoardPw()))
throw new ResponseStatusException(HttpStatus.UNAUTHORIZED,
"비밀번호가 틀렸습니다.");
마지막은 원인을 알 수 없는 서버 내부 오류이다. 이 경우 Internal Server Error(500)을 발생시킨다.
이외에도 다양한 Http 상태코드가 있는데 아직 어떤 상황에서 어떤 코드를 사용해야할지 헷갈린다. 좀 더 공부해보아야할 것 같다.
'Java > Spring Boot' 카테고리의 다른 글
[Spring Boot] JPA의 Entity에서 1대N 관계 설정 (0) | 2023.04.10 |
---|---|
[Spring Boot] JPA의 복합키 (0) | 2023.04.09 |
[Spring Boot] 외부 properties 파일 불러오기 (0) | 2023.04.03 |
[Spring Boot] Controller 생성 (0) | 2023.03.28 |
[Spring Boot] Service 생성 (0) | 2023.03.28 |