Spring Boot

[Spring Boot] 개발환경 설정 -(4) 응답 객체 생성하기

DEV_HEO 2022. 6. 2. 01:18
320x100

컨트롤러를 작성할 때 일일이 응답코드를 설정해주고, 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인 배열과 지정한 메세지가 리턴되었다.

320x100