선택지
- A. 하나의 예외 계층에서 처리한다
- B. 비즈니스 예외와 시스템 예외를 분리해서 처리한다
선택: B
이유:
선택지
- A. 500 Internal Server Error
- B. 400 Bad Request
- C. 200 OK (실패 메시지를 body에 담는다)
선택: B
이유:
선택지
- A. 내부 예외 메시지를 그대로 반환
- B. 사용자 친화적인 메시지를 따로 만들어서 반환
선택: B
이유:
선택지 없음 (자유응답)
응답:
code + message 선택지 없음 (자유응답)
응답:
- 로그 시점의 발생 시간
- 예외 발생 클래스, 스택
- Log4j 등을 기준으로 더 확장 가능
- 필요 시 DB 기록도 고려
Q6. 도메인 예외가 발생했을 때 서비스에서 바로 throw 해도 될까?
선택지
- A. 서비스에서 throw 후 핸들러에서 가공
- B. 서비스에서 바로 응답 메시지 구성까지 담당
선택: A
이유:- 예외 발생 위치가 가장 풍부한 정보 보유
- 표현 책임(응답 구조)은 공통 핸들러에서 맡는 것이 분리 관점에서 바람직
Q7.
e.printStackTrace()사용에 대한 생각은?선택지 없음 (자유응답)
응답:
- 사용 지양
- 이유: 로그 시스템 연동 안됨, 로그 레벨 지정 불가, 운영 환경에선 출력 손실 가능
- 대안:
log.error("메시지", e)사용
✍️ 설계 구조 예시 (Java)
// 예외 정의 class DomainException extends RuntimeException { private final String code; public DomainException(String msg, String code) { super(msg); this.code = code; } public String getCode() { return code; } } // 도메인 서비스에서 예외 발생 if (order.isAlreadyPaid()) { throw new DomainException("이미 결제된 주문입니다", "ORDER_ALREADY_PAID"); } // 공통 예외 핸들러 @ExceptionHandler(DomainException.class) public ResponseEntity<ErrorResponse> handle(DomainException e) { log.warn("도메인 예외 발생", e); return ResponseEntity.status(400) .body(new ErrorResponse(e.getCode(), e.getMessage())); }
🎯 오늘의 한 줄 정리
사용자에게는 친절하게, 개발자에게는 정확하게.
예외는 의미별로 나누고, 책임은 계층별로 분리하라.