6.1 예외 처리
Ex) 존재하지 않는 회사명을 조회하는 경우
- http://localhost:8080/finance/dividend/3M
Note) 실행 결과 - 500 에러 (서버 에러)
- 그런데, 존재하지 않아서 나는 오류이므로 이는 400번 대의 에러가 더 적절하다.
- 따라서, 새로운 예외를 만든다.
Ex) 예외 구현하기
- 예외 클래스를 새로 만든다.
<hide/>
package com.dayone.exception;
public abstract class AbstractException extends RuntimeException {
abstract public int getStatusCode();
abstract public String getMessage();
}
- NoCompanyException
<hide/>
public class NoCompanyException extends AbstractException {
@Override
public int getStatusCode() {
return HttpStatus.BAD_REQUEST.value();
}
@Override
public String getMessage() {
return "존재하지 않는 회사명입니다.";
}
}
- 컴퍼니 서비스 하위 메서드, FinanceService 아래의 예외도 바꿔준다.
- 예외를 바꾼다.
<hide/>
public String deleteCompany(String ticker) {
var company = this.companyRepository.findByTicker(ticker)
.orElseThrow(() -> new NoCompanyException());
this.dividendRepository.deleteAllByCompanyId(company.getId());
this.companyRepository.delete(company);
this.deleteAutocompleteKeyword(company.getName()); // 트라이에서도 데이터를 지운다.
return company.getName();
}
- 예외 추가
<hide/>
public class AlreadyExistUserException extends AbstractException{
@Override
public int getStatusCode() {
return HttpStatus.BAD_REQUEST.value();
}
@Override
public String getMessage() {
return "이미 존재하는 사용자명입니다.";
}
}
- CustomExceptionHandler
- @ControllerAdvice는 필터와 비슷하게 컨트롤러보다 더 밖에서 동작하는 층이다.
- 필터가 더 바깥에 있고 ControllerAdvice는 컨트롤러에 조금 더 가깝다.
<hide/>
@Slf4j
@ControllerAdvice
public class CustomExceptionHandler {
@ExceptionHandler({AbstractException.class})
protected ResponseEntity<ErrorResponse> handlerCustomException(AbstractException e){
ErrorResponse errorResponse = ErrorResponse.builder()
.code(e.getStatusCode())
.message(e.getMessage())
.build();
return new ResponseEntity<>(errorResponse, HttpStatus.resolve(e.getStatusCode()));
}
}
- ErrorResponse
<hide/>
@Data
@Builder
public class ErrorResponse {
private int code;
private String message;
}
- API 호출
- http://localhost:8080/finance/dividend/3M%20Company
Note) 실행 결과
- 아까와는 다르게 500이 아닌 400 에러가 나면서 메시지가 나온다.
6.2 log 남기기
Log Level - 아래로 갈수록 레벨 높음
- (아래로 갈수록 level이 높다)
- DEBUG: 디버깅을 위한 정보를 로깅한다. 개발 과정에서는 노출되지만 서비스 운영이 시작되면 노출되지 않는다.
- INFO: 실제 서비스에도 필요한 로그
- WARN: 단순 정보를 넘어서 문제가 될 수 있는 부분, 경고성 메시지
- ERROR: 실제로 에러가 발생한 경우
Log
- console
- File
- 중앙화
Ex) console
- 스크랩 스케줄러에 다음 코드를 추가한다.
log.info("INSERT new Dividend = > " + e.toString());
- 컨트롤러
- 어떤 사용자가 접속했는지 확인하기 위해 다음과 같이 log를 추가한다.
@PostMapping("/signin")
public ResponseEntity<?> signin(@RequestBody Auth.SignIn request){
var member = this.memberService.authenticate(request);
var token = this.tokenProvider.generateToken(member.getUsername(), member.getRoles());
log.info("user login -> " + request.getUsername());
return ResponseEntity.ok(token);
}
- Jwt 필터
- doFilterInternal에도 다음과 같이 추가
log.info(String.format("[%s] -> %s", this.tokenProvider.getUsername(token)
, request.getRequestURI()));
'Spring Projcect > 배당금 프로젝트' 카테고리의 다른 글
Chanpter 08. 기술 면접 준비 (0) | 2022.09.21 |
---|---|
Chapter 07. README (0) | 2022.09.21 |
Chapter 05. 회원 관리 (0) | 2022.09.19 |
Chapter 04. 서비스 구현 (0) | 2022.09.14 |
Chapter 03. 서비스 설계 (0) | 2022.09.13 |