개발

Response Success/Fail

오승미 2023. 7. 11. 17:57

프로젝트를 하면서 프론트 쪽으로 response를 해주어야 하는데,

반환값을 넘겨주는 것을 까먹었다가 몇 시간 동안 오류로 고생해서 글로 정리하려한다.

 

지금도 예외 처리에 대해 공부해야 할 내용은 많지만

그래도 프론트에게 조금 더 친절하게 반환값을 넘겨줘야겠다는 생각이 들었다.

(이전 반환값들은 정말 막무가내 그 자체였다. 회원가입 시 토큰만 덜렁 넘겨준다던지)

 

1. ResponseDto를 작성한다.

Java 제네릭 API Response를 활용할 것이다.

  • 제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다.
  • 제네릭 타입은 클래스 또는 인터페이스 이름 뒤에 "<>" 부호가 붙고, 사이에 타입 파라미터가 위치한다. <T>
  • 타입 파라미터는 일반적으로 대문자 알파벳 한 글자로 표현합니다.
  • 제네릭을 사용하면 특정 클래스나 인터페이스에 다양한 타입으로 사용 및 저장할 필요가 있을 경우 편리합니다. (재활용 가능)  
  • 제네릭을 통해 타입을 지정하게 됨으로써 타입 변환을 줄이게 되어 프로그램 성능에 유리합니다.
  • 제네릭은 자바의 여러 기능에서 사용되고 있으므로 자바를 잘 활용하기 위해서는 무조건 이해해야 합니다. (Collection, Stream API, Lambda)

내가 만들 api의 반환은 다음과 같다.

{
    "status": 200,    
    "message": "OK",    
    "data": 
}

@Data 는 @Getter , @Setter , @RequiredArgsConstructor , @ToString , @EqualsAndHashCode 을 한꺼번에 설정해주는 매우 유용한 어노테이션이다.

ResponseDto<T>에서 T는 사용자가 원하는 데이터 타입을 유연하게 지정할 수 있게 해준다.

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

@Data
@AllArgsConstructor
@Builder
public class ResponseDto<T> {

    private int status;
    private String message;
    private T data;

    public ResponseDto(int status, String message) {
        this.status = status;
        this.message = message;
        this.data = null;
    }

    public static<T> ResponseDto<T> response(int status, String message) {
        return response(status, message, null);
    }

    public static<T> ResponseDto<T> response(int status, String message, T t) {
        return ResponseDto.<T>builder()
                .status(status)
                .message(message)
                .data(t)
                .build();
    }
}

2. 실제 사용 (Service 단에서)

public ResponseDto 메소드명(파라미터) throws Exception {
        try {
            	//서비스 로직
                return new ResponseDto(200, "OK", 반환해야할 데이터 값이 있으면 넣어줌);
            } else {
                throw new Exception("ERR");
            }
        } catch (Exception e) {
            throw new Exception(e.getMessage());
        }
    }

3. 실제 사용 (Controller 단에서)

@PostMapping("엔드포인트")
    public ResponseEntity registerImg(파라미터) throws Exception {
        try {
            ResponseDto responseDto = service.메소드명(파라미터);
            return ResponseEntity.ok().body(ResponseDto.response(200, responseDto.getMessage(), responseDto.getData()));
        } catch (Exception e) {
            return ResponseEntity.badRequest().body(ResponseDto.response(400, e.getMessage()));
        }
    }

 

이런식으로 사용해 주면 된다.

Exception 말고도 다른 예외 처리를 해 줄 수 있을 것 같은데 어떻게 해야 할 지 고민을 좀 해봐야 겠다.

현재는 Exception만 사용하고 메시지를 얻어 반환하는 것으로 어떤 오류가 발생했는지 알 수 있다.