본문 바로가기

Back-End 공부/Spring

스프링 에러메시지 공통소스화

 

[ ResponseEntityController.java ]

//map 형태의 메시지 커스텀
// {
//   "status" : "ok"
//   "error message" : "error 발생"
// }
@GetMapping("map_custom1")
public ResponseEntity<Map<String, String>> customMap1(){
    Map<String, String> body = new HashMap<>();
    HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR;
    body.put("status", Integer.toString(status.value())); //responseBody에 출력되도록 넣기
    body.put("error message", status.getReasonPhrase());
    return new ResponseEntity<>(body, status); //status에 담긴 값은 header로 나가고, body에 담긴 Map은 json 형태로 나감.
}

//status 201(생성), message : 객체
// {
//   "status" : "ok"
//   "error message" : {aa, bb, cc}
// }
// 한 필드에 여러 개의 값이 들어오는 경우 -> Object 사용
// 실무에서는 필요한 값들을 모두 body에 넣어서 전달
@GetMapping("map_custom2")
public ResponseEntity<Map<String, Object>> customMap2(){
    Map<String, Object> body = new HashMap<>();
    HttpStatus status = HttpStatus.CREATED;
    Member member = new Member("choi", "choi@naver.com", "1234");
    body.put("status", Integer.toString(status.value()));
    body.put("error message", member);
    return new ResponseEntity<>(body, status); //status에 담긴 값은 header로 나가고, body에 담긴 Map은 json 형태로 나감.
}

 

 

 

🖥️ 상태코드와 객체가 넘어오도록 변경해서 "공통소스"로 사용할 수 있게 변경

 

성공 => Object  & 상태 코드 출력

실패 => 실패 메시지 & 상태 코드 출력

 

 

[ MemberRestController.java ]

@GetMapping("member/find/{id}")
public ResponseEntity<Map<String, Object>> findMember(@PathVariable int id){
    MemberResponseDto memberResponseDto = null;
    try{
        memberResponseDto = memberService.findById(id);
        // 예외 안터지면 객체+상태코드
        return ResponseEntityController.responseMessage(HttpStatus.OK, memberResponseDto);

    }catch(Exception e){
        e.printStackTrace();
        // 예외터지면 상태코드만
        return ResponseEntityController.errResponseMessage(HttpStatus.NOT_FOUND);
    }
}

 

 

[ ResponseEntityController.java ]

errResponseMessage()와 responseMessage()의 반환 타입을 통일 💡

-> 두 메서드 반환 타입이 같지 않다면 MemberRestController의 findMember()에서 반환 타입이 애매해짐

public static ResponseEntity<Map<String, Object>> errResponseMessage(HttpStatus status){
    Map<String, Object> body = new HashMap<>();
    body.put("status", Integer.toString(status.value())); //responseBody에 출력되도록 넣기
    body.put("error message", status.getReasonPhrase());
    return new ResponseEntity<>(body, status); //status에 담긴 값은 header로 나가고, body에 담긴 Map은 json 형태로 나감.
}

public static ResponseEntity<Map<String, Object>> responseMessage(HttpStatus status, Object object){
    Map<String, Object> body = new HashMap<>();
    body.put("status", Integer.toString(status.value()));
    body.put("message", object);
    return new ResponseEntity<>(body, status); //status에 담긴 값은 header로 나가고, body에 담긴 Map은 json 형태로 나감.
}

 

 

 

 

✔️ 성공

 

✔️ 실패

 

 

 

 

🖥️  어떤 에러가 났는지의 정확한 문구를 출력해보자

 

[ ResponseEntityController.java ]

 넘어온 message 를 출력하기 위해 message 매개변수 추가

public static ResponseEntity<Map<String, Object>> errResponseMessage(HttpStatus status, String message){
    Map<String, Object> body = new HashMap<>();
    body.put("status", Integer.toString(status.value())); //responseBody에 출력되도록 넣기
    body.put("error message", message);
    return new ResponseEntity<>(body, status); //status에 담긴 값은 header로 나가고, body에 담긴 Map은 json 형태로 나감.
}

 

 

[ MemberService.java ]

기존 :: 방식에서 에러를 던지면서 문자열을 넘길 수 있는 () -> new Exception("") 형식으로 변경

public MemberResponseDto findById(int id) throws EntityNotFoundException {
//        Member member = memberRepository.findById(id).orElseThrow(EntityNotFoundException::new);
        Member member = memberRepository.findById(id).orElseThrow(()-> new EntityNotFoundException("검색하신 ID의 Member가 없습니다."));

 

 

[ ResponseEntityController.java ]

MemberService > findById의 .orElseThrow에서 넘어온 에러 메시지 정보를 실제 사용자에게 출력

@GetMapping("member/find/{id}")
public ResponseEntity<Map<String, Object>> findMember(@PathVariable int id){
    MemberResponseDto memberResponseDto = null;
    try{
        memberResponseDto = memberService.findById(id);
        return ResponseEntityController.responseMessage(HttpStatus.OK, memberResponseDto);

    }catch(Exception e){
        e.printStackTrace();
        //orElseThrow에서 넘어온 에러 메시지 정보를 실제 사용자에게 주자
        return ResponseEntityController.errResponseMessage(HttpStatus.NOT_FOUND, e.getMessage());
    }
}

 

 

✔️ 성공