[ ApiUtil ]
@Data public class ApiUtil<T> { private Integer status ; //200,400,404,405 private String msg ; // 성공, 실패 -> 메세지 성공시에는 메세지 필요없음 private T body ; // 타입이 정해져있지 않아 new 때 타입을 정하는 T로 정함 //통신이 성공했을 때 public ApiUtil(T body) { this.status = 200; this.msg ="성공"; this.body = body; } //통신이 실패했을 때 public ApiUtil(Integer status, String msg) { this.status = status; this.msg = msg; this.body=null; // 실패 시에는 메세지와 상태코드만 필요하기 때문에 바디 데이터는 필요없다. } }
상태 코드 200 → 내가 get요청을 했을 때 요청이 성공적으로 처리
[ 상태 코드 201 ]- 201 Created → insert 되었을 때 사용
요청이 성공적으로 처리되었고, 그 결과로 새로운 리소스가 생성됨 주로 POST 요청에 대한 응답으로 사용되며, 서버가 클라이언트의 요청으로 데이터베이스에 새로운 데이터(행)를 성공적으로 추가했다는 것을 의미
즉, 내가 insert하면 db에 row를 1개 만들었잖아
니가 준 데이터 내가 db에 잘 넣었어~~ 가 201.
그러나 우린 정상이면 전부 200으로 퉁칠거다. 중요하지 않아서 상관없다
300번이면 redirection
400, 401, 403, 404 -> 프런트 잘못
500은 서버측에서 코드 잘못 짠 것. (이 500도 종류가 많지만 500으로 퉁침)
[ 실패했을 경우 ]
실패했을 때는 바디가 필요 없고 ‘실패 번호(상태코드)랑 메세지’가 중요하기 때문에
바디가 null 로 들어간다!
[ MyExceptionHandler 수정 ]
지금 우리 프로젝트는 AJAX 응답이니까 전부 JSON을 돌려주는 핸들러가 있으면 된다.
@RestControllerAdvice 어노테이션을 붙여준다!
참고만 하자. 이렇게 해도 Status 400
@ResponseStatus를 사용해서 설정해도 400임. 근데 이거 안 쓸 것
[ ResponseEntity<> ]
T body = T 제네릭이 <?> 와일드 카드쪽에 설정되는 것 <?> 와일드 카드는 오브젝트 타입으로 받는다! * return할 때 모든 데이터 타입이 들어갈 수 있지만, 지금 여기서는 데이터 스트림을 할 때 전송되는 데이터의 타입이 미리 정해지지 않았기 때문에 오브젝트로 퉁쳐서 받는 것! 그럼 바디에다가 apiUtil을 줘야한다. 바디를 넣는다는건 성공했을때 쓰는거고, 지금은 http body -> 구성한 객체 ApiUtil<?> apiUtil = new ApiUtil<>(); 이거 자체가 바디란 말. (메세지랑 상태코드를 넣어야함) return new ResponseEntity<>(); 이쪽이 리얼 http header, http body
우리가 apiutil라는 객체에다가 어떻게 바디를 구성할지 정할 수 있는데 그렇게 적어놓은 것을 responseentity에 넣어서 리턴을 하게 된다. Responseentity를 사용하몈 http 헤더 바디 등을 설정할 수 있다고 해
ResponseEntity를 쓰는 이유 → 바디를 주면서 상태 값을 같이 주기 위함
[ 이러면 헤더에 400이 날아간다!! ]
@RestControllerAdvice //데이터 응답 public class MyExceptionHandler { @ExceptionHandler(Exception400.class) public ResponseEntity<?> ex400(Exception e) { ApiUtil<?> apiUtil = new ApiUtil<>(400, e.getMessage()); return new ResponseEntity<>(apiUtil, HttpStatus.BAD_REQUEST); }
헤더에 400넣고, 바디에서도 400을 넣는 이유?
→ 프런트엔드가 더 편하라고. 요청하면 JSON으로 400이 보인다!
이거랑 같은 기능을 하지만, 이 코드보단 ResponseEntity<?> 쓰는게 더 편하다!
[ 원래 코드 ]
[ 모두 이렇게 변경하자! ]
@RestControllerAdvice // 데이터 응답 public class MyExceptionHandler { @ExceptionHandler(Exception400.class) public ResponseEntity<?> ex400(Exception400 e){ ApiUtil<?> apiUtil = new ApiUtil<>(400, e.getMessage()); // http body -> 구성한 객체 return new ResponseEntity<>(apiUtil, HttpStatus.BAD_REQUEST); // http body, http header } @ExceptionHandler(Exception401.class) public ResponseEntity<?> ex401(Exception401 e){ ApiUtil<?> apiUtil = new ApiUtil<>(401, e.getMessage()); return new ResponseEntity<>(apiUtil, HttpStatus.UNAUTHORIZED); } @ExceptionHandler(Exception403.class) public ResponseEntity<?> ex403(Exception403 e){ ApiUtil<?> apiUtil = new ApiUtil<>(403, e.getMessage()); return new ResponseEntity<>(apiUtil, HttpStatus.FORBIDDEN); } @ExceptionHandler(Exception404.class) public ResponseEntity<?> ex404(Exception404 e){ ApiUtil<?> apiUtil = new ApiUtil<>(404, e.getMessage()); return new ResponseEntity<>(apiUtil, HttpStatus.NOT_FOUND); } @ExceptionHandler(Exception500.class) public ResponseEntity<?> ex500(Exception500 e){ ApiUtil<?> apiUtil = new ApiUtil<>(500, e.getMessage()); return new ResponseEntity<>(apiUtil, HttpStatus.INTERNAL_SERVER_ERROR); } }
Exception400, Exception500 클래스들을 받으니까 잘 적자!
[ HttpStatus에 들어가서 각자의 상태 코드 확인 후 작성 ]
그럼 에러 핸들러 수정 끝 ! 에러 쪽은 끝!
Share article