컨트롤러를 작성할 때 일일이 응답코드를 설정해주고, ResponseEnity를 리턴해줘야 하는게 번거롭다.
회사에서는 컨트롤러에서 공통으로 쓸 수 있는 클래스를 만들어 상속해서 쓰고 있다.
코딩할 때 공통되는 부분을 최소화 하지 않으면 너무 찝찝해서
최대한 공통되는 코드들은 모아두려고 한다.
이번 포스팅에서는 내가 편하자고 만든 코드를 정리해두었다.
ResponseEntity 생성
@Data
public class ResponseEntity<T>{
private int code;
private String message;
private T data;
public ResponseEntity(int code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
}
code : 응답 상태를 설정할 수 있는 상태코드
message : 응답 메세지
data : 응답 body에 보낼 데이터
Status 생성
위 ResponseEntity에 담을 code와 message를 정의해주는 클래스이다.
public class Status{
//code가 key인 상태값
public static final Map<Integer, String> StatusCode=
Collections.unmodifiableMap(new HashMap<Integer, String>(){
private static final long serialVersionUID = 7835287845816788595L;
{
put(200, "OK");
put(201, "CREATED");
put(204, "NO_CONTENT");
put(400, "BAD_REQUEST");
put(401, "UNAUTHORIZED");
put(403, "FORBIDDEN");
put(404, "NOT_FOUND");
put(500, "INTERNAL_SERVER_ERROR");
put(503, "SERVICE_UNAVAILABLE");
put(600, "DB_ERROR");
}});
//message가 key인 상태값
public static final Map<String, Integer> StatusMessage =
Collections.unmodifiableMap(new HashMap<String, Integer>() {
private static final long serialVersionUID = 3922431394814449884L;
{
put("OK", 200);
put("CREATED", 201);
put("NO_CONTENT", 204);
put("BAD_REQUEST", 400);
put("UNAUTHORIZED", 401);
put("FORBIDDEN", 403);
put("NOT_FOUND", 404);
put("INTERNAL_SERVER_ERROR", 500);
put("SERVICE_UNAVAILABLE", 503);
put("DB_ERROR", 600);
}});
}
- StatusCode : 코드가 key이고 코드에 해당하는 status 메세지를 꺼낼 수 있다.
- StatusMessage : 코드가 Message이고 메세지에 해당하는 status 코드를 꺼낼 수 있다.
이 정도로 정해두고 필요할 때
Status.StatusCode.put(200)
혹은
Status.StatusMessage.put("OK") 으로
꺼내쓰면 된다.
ControllerSupport
모든 컨트롤러에서 상속받을 클래스이다.
이 클래스를 상속받기만 하면 컨트롤러에서는 return getOkResponse(); 함수만 쓰면 된다.
package com.pigplace.common.vo;
public class ControllerSupport {
/**
* <h1>응답코드와 메세지를 지정하고 data를 담은 Response</h1>
*/
public <T> ResponseEntity<T> getOkResponse(int code, String message, T data){
ResponseEntity<T> res = new ResponseEntity<T>(code, message, data);
return res;
}
//성공 응답 리턴(default StatusCode : 200)
/**
* <h1>data가 없는 Response</h1>
*/
public <T> ResponseEntity<T> getOkResponse(){
return this.getOkResponse(200, Status.StatusCode.get(200), null);
}
/**
* <h1>data를 담은 Response</h1>
*/
public <T> ResponseEntity<T> getOkResponse(T data) {
return this.getOkResponse(200, Status.StatusCode.get(200), data);
}
/**
* <h1>응답코드를 지정하고 data가 없는 Response</h1>
*/
public <T> ResponseEntity<T> getOkResponse(int code){
return this.getOkResponse(code, Status.StatusCode.get(code), null);
}
/**
* <h1>메세지를 지정하고 data가 없는 Response</h1>
*/
public <T> ResponseEntity<T> getOkResponse(String message){
return this.getOkResponse(200, message, null);
}
/**
* <h1>응답코드와 메세지를 data가 없는 Response</h1>
*/
public <T> ResponseEntity<T> getOkResponse(int code, String message){
return this.getOkResponse(code, message, null);
}
/**
* <h1>메세지를 지정하고 data를 담은 Response</h1>
*/
public <T> ResponseEntity<T> getOkResponse(String message, T data){
return this.getOkResponse(200, message, data);
}
//실패 응답 리턴(default StatusCode : 500)
/**
* <h1>data가 없는 Response</h1>
*/
public <T> ResponseEntity<T> getFailResponse(){
return this.getOkResponse(500, Status.StatusCode.get(500), null);
}
/**
* <h1>data를 담은 Response</h1>
*/
public <T> ResponseEntity<T> getFailResponse(T data) {
return this.getOkResponse(500, Status.StatusCode.get(500), data);
}
/**
* <h1>응답코드를 지정하고 data가 없는 Response</h1>
*/
public <T> ResponseEntity<T> getFailResponse(int code){
return this.getOkResponse(code, Status.StatusCode.get(code), null);
}
/**
* <h1>메세지를 지정하고 data가 없는 Response</h1>
*/
public <T> ResponseEntity<T> getFailResponse(String message){
return this.getOkResponse(500, message, null);
}
/**
* <h1>응답코드와 메세지를 data가 없는 Response</h1>
*/
public <T> ResponseEntity<T> getFailResponse(int code, String message){
return this.getOkResponse(code, message, null);
}
/**
* <h1>메세지를 지정하고 data를 담은 Response</h1>
*/
public <T> ResponseEntity<T> getFailResponse(String message, T data){
return this.getOkResponse(200, message, data);
}
/**
* <h1>응답코드와 메세지를 지정하고 data를 담은 Response</h1>
*/
public <T> ResponseEntity<T> getFailResponse(int code, String message, T data){
ResponseEntity<T> res = new ResponseEntity<T>(code, Status.StatusCode.get(code), data);
return res;
}
}
크게 성공 response와 실패 response 메소드를 선언하였다.
1. getOkResponse : 성공response
- code, message, data로 나올 수 있는 경우의 수 6가지와
- 셋 다 지정하지 않은 경우
=> 총 7가지 이다.
물론 이 경우를 모두 다 사용할지는 모르겠으나, 추후에 쓰이지 않는다면 삭제할 것이다.
2. getFailResponse실패 response
- code, message, data로 나올 수 있는 경우의 수 3가지와
- 둘 다 지정하지 않은 경우
=> 총 7가지 이다.
* code나 message를 지정했을 때 이름을 ok나 fail로 하지 않고 other등으로 하면
controllersupport 코드가 짧아지겠지만,
응답을 논리적으로 성공/실패 로만 나누고 싶어서 좀 길게 작성했다.
샘플 Controller
@Data
public class TestVO {
String id;
String pw;
}
@RestController
@RequestMapping("/api")
public class RestTestController extends ControllerSupport{
@GetMapping("/test")
public ResponseEntity<?> testvo() {
TestVO testVO = new TestVO();
testVO.setId("ID");
testVO.setPw("PW");
List<TestVO> testList = new ArrayList<>();
testList.add(testVO);
testList.add(testVO);
return getOkResponse(testList); //(1)
//return getOkResponse("조회성공~!", testList); //(2)
//return getFailReponse("조회 실패.."); //(3)
}
}
1. 위에서 작성한 ControllerSupport를 상속받는다.
2. 메소드의 리턴 형태를 ReponseEntity<T>로 선언한다.
3. 필요한 응답을 리턴하는 함수를 사용한다.
(1) 실행 결과 : default 로 설정되어 있는 응답코드에 해당하는 메세지가 리턴되었다.
(2) 실행 결과 : 지정한 메세지가 리턴되었다.
(3) data의 size가 0인 배열과 지정한 메세지가 리턴되었다.
'Spring Boot' 카테고리의 다른 글
[Spring Boot] 개발환경 설정 -(5) mySQL JPA 연동하기-② (0) | 2022.06.30 |
---|---|
[Spring Boot] 개발환경 설정 -(5) mySQL JPA 연동하기-① (0) | 2022.06.30 |
[Spring Boot] @Controller + @ResponseBody / @RestController (0) | 2022.05.30 |
[Spring Boot] Postman 으로 api 테스트해보기 (0) | 2022.05.30 |
[Spring Boot] 개발환경 설정 -(3) Swagger 적용하기 & Lombok 적용 (0) | 2022.05.28 |