Skip to content

Commit a996b47

Browse files
authored
feat: 500에러, 400에러 #서버-에러 채널에 슬랫봇 알림 추가 (#157)
* feat: 슬랙 서버-에러 채널에 400,500 에러 전송 기능 개발 * chore: test controller 삭제
1 parent cc9112d commit a996b47

4 files changed

Lines changed: 67 additions & 1 deletion

File tree

src/main/java/ssu/eatssu/domain/slack/entity/SlackChannel.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ public enum SlackChannel {
77
REPORT_CHANNEL("#신고"),
88
ADDMENU_CHANNEL("#메뉴_추가"),
99
ERROR_CHANNEL("#장애"),
10-
USER_INQUIRY_CHANNEL("#유저-문의");
10+
USER_INQUIRY_CHANNEL("#유저-문의"),
11+
SERVER_ERROR("C092J4J6F0U");
1112

1213
@Getter
1314
private String krName;

src/main/java/ssu/eatssu/domain/slack/entity/SlackMessageFormat.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,24 @@ public static String sendUserInquiry(Inquiry inquiry) {
6363
, inquiry.getCreatedDate(), inquiry.getContent()};
6464
return messageFormat.format(args);
6565
}
66+
67+
68+
public static String sendServerError(Exception ex) {
69+
MessageFormat messageFormat = new MessageFormat(
70+
"""
71+
===================
72+
*서버 에러 발생*
73+
- 예외 클래스: {0}
74+
- 예외 메시지: {1}
75+
- 원인: {2}
76+
===================
77+
"""
78+
);
79+
Object[] args = {
80+
ex.getClass().getName(),
81+
ex.getMessage(),
82+
ex.getCause() != null ? ex.getCause().toString() : "없음"
83+
};
84+
return messageFormat.format(args);
85+
}
6686
}

src/main/java/ssu/eatssu/domain/slack/service/SlackService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.slack.api.methods.MethodsClient;
1010
import com.slack.api.methods.SlackApiException;
1111
import com.slack.api.methods.request.chat.ChatPostMessageRequest;
12+
import com.slack.api.methods.response.chat.ChatPostMessageResponse;
1213

1314
import lombok.extern.slf4j.Slf4j;
1415
import ssu.eatssu.domain.slack.entity.SlackChannel;

src/main/java/ssu/eatssu/global/handler/GlobalExceptionHandler.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@
2323
import org.springframework.web.servlet.NoHandlerFoundException;
2424
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
2525

26+
import lombok.RequiredArgsConstructor;
2627
import lombok.extern.slf4j.Slf4j;
28+
import ssu.eatssu.domain.slack.entity.SlackMessageFormat;
29+
import ssu.eatssu.domain.slack.service.SlackService;
2730
import ssu.eatssu.global.handler.response.BaseException;
2831
import ssu.eatssu.global.handler.response.BaseResponse;
2932
import ssu.eatssu.global.handler.response.BaseResponseStatus;
@@ -33,16 +36,26 @@
3336
*/
3437
@Slf4j
3538
@RestControllerAdvice
39+
@RequiredArgsConstructor
3640
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
41+
private final SlackService slackService;
3742

3843
/**
3944
* BaseException 처리
4045
*/
4146
@ExceptionHandler(BaseException.class)
4247
public ResponseEntity<BaseResponse<Void>> handleBaseException(BaseException e) {
4348
log.info(e.getStatus().toString());
49+
sendErrorToSlack(e);
4450
return ResponseEntity.status(e.getStatus().getHttpStatus()).body(BaseResponse.fail(e.getStatus()));
4551
}
52+
@ExceptionHandler(Exception.class)
53+
public ResponseEntity<BaseResponse<Void>> handleAllUnhandledException(Exception ex) {
54+
sendErrorToSlack(ex);
55+
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
56+
.body(BaseResponse.fail(BaseResponseStatus.INTERNAL_SERVER_ERROR));
57+
}
58+
4659

4760
/**
4861
* 경로는 있으나 지원하지 않는 http method로 요청 시
@@ -215,4 +228,35 @@ protected ResponseEntity<Object> handleHttpMessageNotWritable(
215228
.body(BaseResponse.fail(BaseResponseStatus.INTERNAL_SERVER_ERROR));
216229
}
217230

231+
@Override
232+
protected ResponseEntity<Object> handleExceptionInternal(
233+
@NonNull Exception ex,
234+
Object body,
235+
@NonNull HttpHeaders headers,
236+
@NonNull HttpStatusCode statusCode,
237+
@NonNull WebRequest request) {
238+
239+
HttpStatus status = HttpStatus.valueOf(statusCode.value());
240+
241+
if (status.is4xxClientError() || status.is5xxServerError()) {
242+
sendErrorToSlack(ex);
243+
}
244+
245+
BaseResponseStatus responseStatus = status.is4xxClientError()
246+
? BaseResponseStatus.BAD_REQUEST
247+
: BaseResponseStatus.INTERNAL_SERVER_ERROR;
248+
249+
return ResponseEntity.status(status).body(BaseResponse.fail(responseStatus));
250+
}
251+
252+
private void sendErrorToSlack(Exception ex) {
253+
try {
254+
String message = SlackMessageFormat.sendServerError(ex);
255+
slackService.sendSlackMessage(message, ssu.eatssu.domain.slack.entity.SlackChannel.SERVER_ERROR);
256+
} catch (Exception slackEx) {
257+
log.warn("슬랙 전송 실패: {}", slackEx.getMessage());
258+
}
259+
}
260+
261+
218262
}

0 commit comments

Comments
 (0)