Spring Projcect/배당금 프로젝트

Chapter 06. 완성도 높이기

계란💕 2022. 9. 20. 20:07

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

 

 

 

출처 - https://zero-base.co.kr/

 

제로베이스 - 누구나 취업하는 가장 합리적인 취업 스쿨

코딩 부트 캠프 개발자, 데이터 사이언티스트, 마케터, PM, 디자이너 등 제대로 공부하고 확실하게 취업하세요. 당신의 삶의 전환점이 될 제로베이스 스쿨입니다.

zero-base.co.kr

 

'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