개발
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만 사용하고 메시지를 얻어 반환하는 것으로 어떤 오류가 발생했는지 알 수 있다.