Skip to content

Commit d801e9d

Browse files
committed
refactor: Modify customException, memberService
- CustomException 확장성 개선 및 핸들러 추가 - MemberService 예외 처리 일부 삭제
1 parent a4ab5db commit d801e9d

File tree

3 files changed

+111
-25
lines changed

3 files changed

+111
-25
lines changed
Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,35 @@
11
package app.common.infrastructure.exception;
22

33
import app.common.domain.model.common.ResponseCode;
4-
import lombok.AllArgsConstructor;
54
import lombok.Getter;
65

7-
@AllArgsConstructor
6+
import java.io.Serializable;
7+
88
@Getter
9-
public class CustomException extends RuntimeException {
9+
public class CustomException extends RuntimeException implements Serializable {
10+
private static final long serialVersionUID = 1L;
11+
1012
private final ResponseCode responseCode;
13+
private final String additionalMessage;
14+
15+
public CustomException(ResponseCode responseCode) {
16+
this(responseCode, null, null);
17+
}
18+
19+
public CustomException(ResponseCode responseCode, String additionalMessage) {
20+
this(responseCode, additionalMessage, null);
21+
}
22+
23+
public CustomException(ResponseCode responseCode, String additionalMessage, Throwable cause) {
24+
super(additionalMessage, cause);
25+
this.responseCode = responseCode;
26+
this.additionalMessage = additionalMessage;
27+
}
28+
29+
@Override
30+
public String getMessage() {
31+
return (additionalMessage != null)
32+
? responseCode.getMessage() + ": " + additionalMessage
33+
: responseCode.getMessage();
34+
}
1135
}
Lines changed: 72 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,86 @@
11
package app.common.infrastructure.exception;
22

3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
import org.springframework.http.HttpStatus;
6+
import org.springframework.http.ResponseEntity;
37
import org.springframework.web.bind.annotation.ExceptionHandler;
48
import org.springframework.web.bind.annotation.RestControllerAdvice;
9+
import org.springframework.web.servlet.NoHandlerFoundException;
10+
import org.springframework.web.HttpRequestMethodNotSupportedException;
11+
import org.springframework.web.bind.MethodArgumentNotValidException;
12+
import org.springframework.dao.DataAccessException;
13+
import org.springframework.security.access.AccessDeniedException;
14+
15+
import javax.validation.ConstraintViolationException;
516

617
import app.common.domain.model.common.BaseResponse;
718

819
@RestControllerAdvice
920
public class CustomExceptionHandler {
10-
@ExceptionHandler(Exception.class)
11-
protected BaseResponse handleException(Exception e) {
12-
return BaseResponse.failResponse(e);
13-
}
21+
22+
private static final Logger logger = LoggerFactory.getLogger(CustomExceptionHandler.class);
1423

1524
@ExceptionHandler(CustomException.class)
16-
protected BaseResponse handleCustomException(CustomException e) {
17-
return BaseResponse.failResponse(e.getResponseCode());
25+
protected ResponseEntity<BaseResponse> handleCustomException(CustomException e) {
26+
logger.error("CustomException occurred: ", e);
27+
BaseResponse response = BaseResponse.failResponse(e.getResponseCode());
28+
return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
29+
}
30+
31+
@ExceptionHandler(IllegalArgumentException.class)
32+
protected ResponseEntity<BaseResponse> handleIllegalArgumentException(IllegalArgumentException e) {
33+
logger.error("IllegalArgumentException occurred: ", e);
34+
BaseResponse response = BaseResponse.failResponse("INVALID_ARGUMENT");
35+
return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
36+
}
37+
38+
@ExceptionHandler(NoHandlerFoundException.class)
39+
protected ResponseEntity<BaseResponse> handleNoHandlerFoundException(NoHandlerFoundException e) {
40+
logger.error("NoHandlerFoundException occurred: ", e);
41+
BaseResponse response = BaseResponse.failResponse("RESOURCE_NOT_FOUND");
42+
return new ResponseEntity<>(response, HttpStatus.NOT_FOUND);
43+
}
44+
45+
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
46+
protected ResponseEntity<BaseResponse> handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
47+
logger.error("HttpRequestMethodNotSupportedException occurred: ", e);
48+
BaseResponse response = BaseResponse.failResponse("METHOD_NOT_ALLOWED");
49+
return new ResponseEntity<>(response, HttpStatus.METHOD_NOT_ALLOWED);
1850
}
1951

52+
@ExceptionHandler(MethodArgumentNotValidException.class)
53+
protected ResponseEntity<BaseResponse> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
54+
logger.error("MethodArgumentNotValidException occurred: ", e);
55+
BaseResponse response = BaseResponse.failResponse("INVALID_INPUT");
56+
return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
57+
}
58+
59+
@ExceptionHandler(ConstraintViolationException.class)
60+
protected ResponseEntity<BaseResponse> handleConstraintViolationException(ConstraintViolationException e) {
61+
logger.error("ConstraintViolationException occurred: ", e);
62+
BaseResponse response = BaseResponse.failResponse("CONSTRAINT_VIOLATION");
63+
return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
64+
}
65+
66+
@ExceptionHandler(DataAccessException.class)
67+
protected ResponseEntity<BaseResponse> handleDataAccessException(DataAccessException e) {
68+
logger.error("DataAccessException occurred: ", e);
69+
BaseResponse response = BaseResponse.failResponse("DATABASE_ERROR");
70+
return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);
71+
}
72+
73+
@ExceptionHandler(AccessDeniedException.class)
74+
protected ResponseEntity<BaseResponse> handleAccessDeniedException(AccessDeniedException e) {
75+
logger.error("AccessDeniedException occurred: ", e);
76+
BaseResponse response = BaseResponse.failResponse("ACCESS_DENIED");
77+
return new ResponseEntity<>(response, HttpStatus.FORBIDDEN);
78+
}
79+
80+
@ExceptionHandler(Exception.class)
81+
protected ResponseEntity<BaseResponse> handleException(Exception e) {
82+
logger.error("Unexpected exception occurred: ", e);
83+
BaseResponse response = BaseResponse.failResponse("INTERNAL_SERVER_ERROR");
84+
return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);
85+
}
2086
}

src/main/java/app/member/domain/service/MemberService.java

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,19 @@ public class MemberService {
2424

2525
@Transactional
2626
public CreateMemberVo createMember(CreateMemberDto dto) {
27-
try {
28-
Member member = Member.builder()
29-
.name(dto.getName())
30-
.email(dto.getEmail())
31-
.role(dto.getRole())
32-
.build();
33-
Member result = memberRepository.save(member);
34-
log.info("### 회원 생성 결과: {}", result);
27+
validateNewMember(dto);
3528

36-
return CreateMemberVo.toVo(result);
37-
} catch (DataIntegrityViolationException e) {
38-
throw new CustomException(ResponseCode.CONFLICT_DATA);
39-
} catch (CustomException e) {
40-
throw new CustomException(e.getResponseCode());
41-
} catch (Exception e) {
42-
throw e;
43-
}
29+
Member member = Member.builder()
30+
.name(dto.getName())
31+
.email(dto.getEmail())
32+
.role(dto.getRole())
33+
.build();
34+
35+
Member savedMember = memberRepository.save(member);
36+
37+
log.info("New member created with ID: {}", savedMember.getId());
38+
39+
return CreateMemberVo.toVo(savedMember);
4440
}
4541

4642
@Transactional(readOnly = true)

0 commit comments

Comments
 (0)