상세 컨텐츠

본문 제목

[WEB] RESTful API 만들기

JAVA/SPRING

by ranlan 2021. 3. 22. 23:10

본문

728x90

 

VIEW를 담당하는 컨트롤러를 제외한 모든 컨트롤러를 @RestController로 지정하여 RESTful API로 만들었다.

@RestController는 별도의 View를 제공하지 않기 때문에 문제가 발생하는 상황에서 상태코드와 응답메시지 등을 함께 보내주어야 한다고 한다.

따라서 컨트롤러의 반환값은 모두 ResponseEntity로 하였고  ApiResponse라는 response객체를 만들어 상태코드, 메시지, 데이터 등을 담아 반환하였다.

 

ResponseEntity는 '개발자가 직접 결과 데이터와 HTTP 상태 코드를 직접 제어할 수 있는 클래스'로 404나 500같은 HTTP 상태 코드를 전송하고 싶은 데이터와 함께 전송할수 있기 때문에 좀더 세밀한 제어가 필요한 경우 사용할 수 있다.

 

 

ResponseEntity

public class ResponseEntity<T> extends HttpEntity<T> {

    private final Object status;

    ...
}

ResponseEntity는 이처럼 HttpEntity를 상속받기 때문에

 

HttpEntity

public class HttpEntity<T> {

	public static final HttpEntity<?> EMPTY = new HttpEntity<>();
    
	private final HttpHeaders headers;

	@Nullable
	private final T body;
    
    ..
}

헤더와 바디, 상태정보를 가질 수 있다.

* ResponseEntity 는 status field를 가지기 때문에 상태코드는 필수적으로 리턴해줘야 한다. 

 

ApiResponse

@Getter @Setter
@NoArgsConstructor
@Builder
public class ApiResponse {

    private boolean success;
    private String dateTime;
    private String errorCode;
    private String detail;
    private Map<String, Object> data = new HashMap<>();

   public ApiResponse(boolean success) {
        this.dateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        this.success = success;
    }

    public ApiResponse(boolean success, String detail) {
        this.dateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        this.success = success;
        this.detail = detail;
    }

    public ApiResponse(boolean success, String errorCode, String detail) {
        this.dateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        this.success = success;
        this.errorCode = errorCode;
        this.detail = detail;
    }

    public void putData(String key, Object value) {
        this.data.put(key, value);
    }

}

success : 성공 여부

dateTime : 반환 시점의 시간

errorCode : 에러 발생 시 반환할 에러 코드

detail : 상세 정보

data : 반환할 데이터

 

 

CategoryApiController에서 카테고리 리스트를 조회하는 경우를 예로 들어보자

 

사용 예시를 보기 전

RestController는 데이터를 반환함으로 ResponseEntity를 사용하지 않고 바로 데이터 반환도 가능하다

@GetMapping("test")
public List<Category> test() {

	return categoryService.findAllCategory();
}

response.body

 

예시1) 요청에 따른 로직을 수행한 후 해당 내용에 대한 정보와 성공 여부를 ApiResponse 객체에 담아 반환한다.

@GetMapping("test1")
public ResponseEntity<?> test1() {

    ApiResponse apiResponse = new ApiResponse(true, "게시판 카테고리 전체 조회");
    apiResponse.putData("categoryList",categoryService.findAllCategory());

    return ResponseEntity.ok(apiResponse);
}

카테고리에 대한 정보를 조회하는 코드로 실행 결과 카테고리의 리스트 데이터 반환

response.body

 

예시2)  다른 곳에서 찾아본 결과 따로 reponse객체를 생성하지 않고 아래와 같은 형태로 사용할 수 있다고 한다.

 

- 반환할 데이터가 없을 때

@GetMapping("test2")
public ResponseEntity test2() {
	
    return new ResponseEntity("success", HttpStatus.OK);
}

response.body

 

HttpStatus의 종류는 매우 다양해서 공식 문서를 참고하면 좋을 듯 하다.

docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/HttpStatus.html

 

HttpStatus (Spring Framework 5.3.6 API)

Enumeration of HTTP status codes. The HTTP status code series can be retrieved via series().

docs.spring.io

 

- 반환할 데이터가 있을 때

@GetMapping("test3")
public ResponseEntity<List> test3() {

    List<Category> categoryList = categoryService.findAllCategory();
    return ResponseEntity.ok(categoryList);
}

response.body

 

 

이 외에도 다양한 방법으로 응답을 반환하는데 차이는 크게 없는것 같다. 그냥 사람마다 취향차이 인것 같기도하고..

이전에는 ApiResponse객체를 만들어 반환하는 방식만 써보았는데 따로 응답객체를 안만들고 ResponseEntity Body에 바로 필요한 정보들을 담아 반환하는 방식도 써봐야겠다.

 

에러 발생시 처리하는 로직도 비슷한 것 같다.

다음번에는 에러 핸들링에 대해 더 자세히 살펴봐야겠다.

 

 

 

728x90

관련글 더보기

댓글 영역