Spring Boot API 응답 통일, Error Handling

YUNU·2023년 11월 19일
0

스프링

목록 보기
33/33
post-thumbnail

🌱 Spring Boot


🟦 API 응답 통일

❓ 하나의 API 응답에 대한 결과(성공/실패)가 양식이 다르다면 🤔

➡️ 프로젝트 진행에 있어서 API의 응답을 통일하는 것은 필수

일반적인 API 응답 형태
{
	isSuccess : Boolean
	code : String
	message : String
	result : {json}
}

🔷 1. API 응답 나타내는 클래스 정의

ex) 클래스명 : ApiResponse

@JsonPropertyOrder -> Jackson 애노테이션, JSON 속성의 순서 지정
@JsonProperty("name") -> JSON에서 해당 속성의 이름 정의
@JsonInclude(JsonInclude.Inclue.속성값) -> JSON에 포함 여부 결정

  • ALWAYS : 기본값, 항상 포함
  • NON_NULL : 속성값이 null이 아닌 경우에만 포함
  • ABSENT : Optional과 함께 사용될 때, 값이 존재하면 포함
  • NON_EMPTY : 문자열 or 컬렉션과 같은 경우, 값이 비어있지 않으면 포함
@Getter
@AllArgsConstructor
@JsonPropertyOrder({"isSuccess", "code", "message", "result"})
public class ApiResponse<T> { // 어떤 타입을 다룰 지 모름 -> 제네릭 타입
	@JsonProperty{"isSuccess"}
    private final Boolean isSuccess; 
    //isSuccess필드는 JSON에서 isSuccess라는 이름으로 사용
    
    private final String code;
    private final Stirng message;
    
    @JsonInclude(JsonInclude.Inclue.NON_NULL)
    private T result;

	//...
}

🔷 2. 응답에 대한 상세 설명을 위해 Enum 상수 정의

@Getter
@AllArgsConstructor
public enum BaiscErrorStatus {
	BAD_REQUEST(HttpStatus.BAD_REQUEST, "400 Bad Request", "잘못된 요청입니다."),
    UNAUTHORIZED(HttpStatus.UNAUTHORIZED, "401 UNAUTHORIZED", "인증이 필요합니다."),
    //...
    Enum상수명(HttpStatus.httpstatus, "code", "message")
    ;
    
    private final HttpStatus httpStatus;
    private final String code;
    private final String message;
    
    // 오류 이유 DTO 반환 메서드
    // 오류 이유 + HttpStatus 정보 DTO 반환 메서드
    //...
}
<참고>
DTO는 public static class로 선언

public class UserDTO {
	
    public static class UserInfoDTO {
    	//...
    }
    
    public static class UserBodyInfoDTO {
    	//...
    }
}

DTO는 여러 곳에서 사용될 수 있음 ➡️ 범용적으로 사용하기 위함

🟦 @RestController & @ReqiredArgsConstructor

🔷 @RestController

@Controller + @ResponseBody

API 통신을 위해 사용

🟦 lombok

어노테이션 기반으로 코드를 자동완성 해주는 라이브러리
반복되는 getter, setter, toString 등의 메서드 작성 코드를 줄여줌

  • 장점
    어노테이션 기반의 코드 자동 생성 ➡️ 생산성 향상
    반복되는 코드 다이어트 ➡️ 가독성 및 유지보수성 향상
    Getter, Setter 외에 빌더 패턴이나 로그 생성 등 다방면으로 활용 가능
예시
@Getter @Setter
@AllArgsConstructor
@NoArgsConstructor
@RequiredArgsConstructor
@EqualsAndHashCode
@ToString
@Data
@Builder
@Delegate

🟦 Error Handling

@RestControllerAdvice

  • 전역적으로 예외 처리, 응답 생성
  • 해당 클래스는 전역 예외 처리 수행하는 Advice 클래스로 동작

@RestControllerAdvice(annotations = {RestController.class})
➡️ Advice 클래스가 @RestController 애노테이션이 부여된 클래스에만 적용하도록
➡️ RESTful API 엔드포인트 처리하는 컨트롤러에서 발생하는 예외에 대한 처리 담당

public class AdviceClass extends ResponseEntityExceptionHandler
ResponseEntityExceptionHandler ➡️ Spring MVC의 기본 예외 처리 로직 제공
(예외 발생 시에 어떻게 응답할지에 대한 메서드들 정의되어 있음)

@org.springframework.web.bind.annotation.ExceptionHandler

  • 해당 메서드가 예외를 처리하는 역할 수행함을 나타내는 애노테이션

@ExceptuonHanlder(value=예외 클래스)

  • Spring에서 예외를 처리하는 메서드를 지정하기 위해 사용
  • 특히 특정 예외 타입을 처리하는 메서드를 정의할 때
ex)java
// GeneralException 예외가 발생했을 때 메서드 호출
@ExceptionHandler(value = GeneralException.class)

ResponseEntity< T >

  • Spring이 제공하는 클래스로 HTTP 응답을 나타내는 객체
  • HTTP 응답 상태코드, 헤더, 본문 등을 포함할 수 있는 유연한 구조
  • 'T' 타입의 객체를 응답 본문으로 갖는 HTTP 응답 나타냄
profile
DDeo99

0개의 댓글