본문 바로가기

JAVA/Spring

RestController

반응형

REST는 Representational State Transfer

하나의 URI는 하나의 고유한 리소스(Resource)를 대표하도록 설계된다는 개념이다.

서버에 접근하는 기기의 종류가 다양해지면서 다양한 기기에서 공통으로 데이터를 처리할 수 있는 규칙을 만들려고 하는데 이러한 시도가 REST 방식이다.


REST 방식은 특정한 URI는 반드시 그에 상응하는 데이터 자체라는 것을 의미하는 방식이다.

예를 들어 '/board/123'은 게시물 중에서 123번이라는 고유의 의미를 가지도록 설계하고 이에 대한 처리는 GET, POST 방식과 같이 추가적인 정보를 통해서 결정한다.


REST API는 외부에서 위와 같은 방식으로 특정 URI을 통해서 사용자가 원하는 정보를 제공하는 방식이다.

최근 Open API에서 많이 사용되면서 REST 방식으로 제공되는 외부 연결 URI를 REST API라고 하고, REST 방식의 서비스제공이 가능한 것을 Restful 하다라고 표현한다.

스프링은 3버전부터 @ResponseBody 애노테이션을 지원하면서 본격적인 REST 방식의 처리를 지원하고 있었고, 그 이전부터 스프링는 Content negotiation 등을 이용해서 처리할 수 있었다.

스프링 4에 들어와서 @RestController가 본격적으로 소개되었다.


@ResponseBody 애노테이션은 메소드나 리턴 타입에 사용할수 있는 애노테이션으로

기존 JSP 방식의 처리와 달리 @ResponseBody 애노테이션의 처리는 스프링의 MessageConverter에 의해 영향을 받는다.

스프링에서 전달되는 데이터의 타입에 따라  MessageConverter가 데이터를 가공해서 브라우저에 전송

과거에는 개발자가 직접  MIME 타입을 지정하고, 해당 데이터를 만들어 내는 방식이였는데, 지금은 자동화된 처리 방식


@RestController 

JSP와 같은 뷰를 만들어 내지 않는 대신 데이터 자체를 반환하는데, 주로 단순문자열과 JSON, XML 사용


ResponseEntity 타입

@RestController는 별도의 뷰를 제공하지 않는 형태로 서비스를 실행하기 때문에 결과 데이터가 예외적인 상황에서 문제가 발생할수 있다.

웹의 경우 HTTP 상태 (status) 코드가 이러한 정보를 나타내는 데 사용


100번대: 현재 데이터의 처리중인 상태

-100: 데이터의 일부를 서버가 받은 상태

200번대 : 정상적인 응답

-200 : 에러없이 정상처리

-204: 정상처리 되었으나 서버에서 보내줄 데이터가 없음

300번대: 다른 URL처리

-301:요청된 페이지가 새 URL로 변경되었음

-304: 이미 기존의 데이터와 변경된것이 없음

400번대: 서버에서 인식할수 없음

-400: 전송된 Request에 문제가 있어서 서버가 인식할수 없음

-403: 서버에서 허락되지 않음

-404: URL에 해당하는 자원을 찾을 수 없음

-406: 전송방식이 허락되지 않음 (REST에서 자주 발생)

500번대: 서버 내부의 문제

-500: 서버에서 처리시 문제가 발생

-502: 게이트웨이나 프록시 상태의 문제(과부하 등)

-503: 일시적인 과부하나 서비스중단상태

-504: 지정된 처리시간이 지나서 처리되지 못함




스프링에서 제공하는 ResponseEntity 타입은 개발자가 직접 결과 데이터 + HTTP의 상태 코드를 직접 제어할 수 있는 클래스이다. 

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


예)

@RequestMapping("/sendErrorAuth")

public  ResponseEntity<Void> sendListAuth() {

return new ResponseEntity<>(HttpStatus.BAD_REQUEST);

}

설명)

HTTP 상태 코드중 400(Bad request)을 헤더 메시지로 전송


예)

@RequestMapping("/sendErrorNot")

public  ResponseEntity<List<SampleVO>> sendErrorNot() {

List<SampleVO> list = new ArrayList<>();

for (int i =0; i<10; i++) {

SampleVo vo = new SampleVO();

vo.setFirstName("길동");

vo.setLastName("홍");

vo.setMno(i);

list.add(vo);

}

return new ResponseEntity<>(list, HttpStatus.NOT_FOUND);

}

설명)

List 데이터와 HTTP 상태코드 404전송

결과는 그대로 보여주면서 상태코드를 전달

주로 호출하는 쪽으로 에러의 원인 메시지를 전송할때 사용하는 방식



REST 사용원칙

1)  URI가 원하는 리소스를 의미

 - 특별한 경우가 아니라면 영어에서 복수형의 형태로 작성하는 것이 일반적

2) URI에는 식별할 수 있는 데이터를 같이 전달하는 것이 일반적

 - HTTP의 전송방식(method)이 실제 작업의 종류를 의미


URI

의미 

 /boards/123

 123번 게시물을 조회

 /boards/123/replies/456

 123번 게시물의 댓글 456번을 조회

 /boards/123/456/

 123번 게시물의 댓글 456번을 조회

 /boards/

 신규 작성 입력 페이지 조회




HTTP method

설명

 GET(/boards/123)

 자료의 조회용

 DELETE(/boards/123)

 자료의 삭제

 POST(/boards/ or /board/new) + 데이터

 신규자료의 등록

 PUT(/boards/123) + 데이터

 신규 자료의 수정  또는 등록

 PATCH

 간혹 PUT방식 대용으로 사용


반응형

'JAVA > Spring' 카테고리의 다른 글

Spring Transaction  (0) 2017.11.27
Spring AOP  (0) 2017.11.21
예외처리 기본  (0) 2017.11.20
모델2방식과 스프링 MVC  (0) 2017.11.20
스프링 웹프로젝트의 구성  (0) 2017.11.20