Spring MVC를 사용하면서 발생할 수 있는 예외는 크게 다음과 같다.
예외 처리를 통해 구체적으로 어느 단계에서 어떤 문제가 발생했는지 클라이언트에 정보를 제공할 수 있다. 또한 애플리케이션에서도 예외 처리를 함으로써 개발자가 어떤 부분에서 예외가 발생하였는지 쉽게 확인할 수 있게 된다.
@ExceptionHandler
를 이용한 예외 처리클래스 또는 메서드 레벨에서 사용할 수 있으며 해당 어노테이션이 붙은 경우 선언된 곳에서 예외가 발생했을 때 예외를 처리할 수 있는 코드를 수행하도록 한다.
@RestController
@RequestMapping("/v5/members")
@Validated
public class MemberController {
private final MemberService memberService;
private final MemberMapper mapper;
public MemberController(MemberService memberService, MemberMapper mapper) {
this.memberService = memberService;
this.mapper = mapper;
}
@PostMapping
public ResponseEntity postMember(@Valid @RequestBody MemberPostDto memberDto) {
Member member = mapper.memberPostDtoToMember(memberDto);
Member response = memberService.createMember(member);
return new ResponseEntity<>(mapper.memberToMemberResponseDto(response),
HttpStatus.CREATED);
}
@PatchMapping("/{member-id}")
public ResponseEntity patchMember(
@PathVariable("member-id") @Positive long memberId,
@Valid @RequestBody MemberPatchDto memberPatchDto) {
memberPatchDto.setMemberId(memberId);
Member response =
memberService.updateMember(mapper.memberPatchDtoToMember(memberPatchDto));
return new ResponseEntity<>(mapper.memberToMemberResponseDto(response),
HttpStatus.OK);
}
@GetMapping("/{member-id}")
public ResponseEntity getMember(
@PathVariable("member-id") @Positive long memberId) {
Member response = memberService.findMember(memberId);
return new ResponseEntity<>(mapper.memberToMemberResponseDto(response), HttpStatus.OK);
}
@GetMapping
public ResponseEntity getMembers() {
List<Member> members = memberService.findMembers();
List<MemberResponseDto> response = mapper.membersToMemberResponseDtos(members);
return new ResponseEntity<>(response, HttpStatus.OK);
}
@DeleteMapping("/{member-id}")
public ResponseEntity deleteMember(
@PathVariable("member-id") @Positive long memberId) {
System.out.println("# delete member");
memberService.deleteMember(memberId);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}
public class MemberPostDto {
@Email
@NotBlank
private String email;
@NotBlank(message = "이름은 공백이 아니어야 합니다.")
private String name;
@Pattern(regexp = "^010-\\\\d{3,4}-\\\\d{4}$",
message = "휴대폰 번호는 010으로 시작하는 11자리 숫자와 '-'로 구성되어야 합니다.")
private String phone;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}