2017 - 10 - 26 (목)
코드로 배우는 스프링 웹프로젝트[구멍가게 코딩단 지음] 참조
REST API의 개념
REST API : Representational State Transfer 의 약자로 URI는 하나의 고유한 리소스를 대표하도록 설계된다는 개념이다. - 특정 URI (ex: sboard/123 = 123 번째 게시물 ) 처럼 고유한 의미를 가지도록 설계.
어렵게 생각하지 말자. NON-REST API방식은 화면이 수정될 때마다 화면이 깜빡거린다. 즉, 새로 고침 되는 것이다.
REST API 방식의 경우 이 깜박거리는 것 없이 고속의 화면전환을 이룬다. - AJAX 를 활용한다.
REST API의 특징
1 . stateless server : 서버가 어플리케이션의 상태를 관리하지 않는다. (쿠키나 세션을 사용하지 않는다.)
2 . 클라이언트에서 캐시할 수 있도록 캐시가 가능한 응답은 캐시가 할 수 있도록 한다. ( 프록시 활용 )
3 . URI 에 너무 많은 정보를 담는 것은 피해야하며 Content type의 정보를 활용해야한다. ex) content-type : Application/json
SPRING에서 REST API 방식
기존의 httpmethod 는 보통 GET/POST 만을 활용하였다.
REST API방식은 더 다양한 Http 통신을 한다.
[ put(update), get(select), post(insert), delete(delete) ]
@ResponseBody와 @REST APIController 애너테이션을 통해 REST API 방식의 데이터 처리를 한다.
@ResponseBody 는 반환타입에 붙이게 된다. 이를 활용하기 위해 jackson-databind 라이브러리를 pom.xml 에 추가하자.
,br>
@REST APIController
@RequestMapping("/sample")
public class SampleController {
@RequestMapping("/hello")
public String sayHello() {
return "hello World";
}
}
// 이경우 반환 타입은 text/html 으로 반환된 문자열이 그대로 출력된다.
@RequestMapping("/sendVO")
public SampleVO sendVO() {
SampleVO vo = new SampleVO();
vo.setFirstName("길동");
vo.setLastName("홍");
vo.setMno(123);
return vo;
}
//이 경우 vo 객체를 반환한다. 문자열과 달리 406에러가 발생한다. 하지만 jackson-databind 라이브러리를 추가하면 자동으로 json타입의 데이터로 변환을 해준다.
ResponseEntity 타입
ResponseEntity 타입은 Http 의 상태코드를 함께 전송해주기 위해 사용한다.
@RequestMapping("/sendErrorNot")
public ResponseEntity <List<SampleVO>> sendListNot(){
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);
}
REST API 와 AJAX
REST API 방식과 가장 많이 쓰는 형태는 AJAX와 결합된 형태이다.
REST API 방식이 데이터를 호출하고 사용하는 방식이라면 Ajax 는 실제로 이것을 이용하는 수단이라고 할 수 있다.
아래는 게시판의 댓글을 처리하기 위한 컨트롤러의 일부이다.
@REST APIController //REST API 방식의 처리를 위한 @REST APIController 애너테이션
@RequestMapping("/replies")
public class ReplyController {
@Inject
private ReplyService service;
@RequestMapping(value = "", method = RequestMethod.POST)
public ResponseEntity<String> register(@RequestBody ReplyVO vo) {
//JSON 데이터를 처리하기 위해 @RequestBody 애너테이션을 사용한다.
//댓글을 등록하기 위한 Insert는 post방식으로 처리한다.
ResponseEntity<String> entity = null;
try {
service.addReply(vo);
System.out.println(vo.getReplyer());
entity = new ResponseEntity<String>("SUCCESS", HttpStatus.OK);
} catch (Exception e) {
e.printStackTrace();
entity = new ResponseEntity<String>(e.getMessage(), HttpStatus.BAD_REQUEST);
}
return entity;
}
@RequestMapping(value = "/all/{bno}", method = RequestMethod.GET)
public ResponseEntity<List<ReplyVO>> list(@PathVariable("bno") Integer bno) {
//댓글들의 목록을 확인할 수 있는 메서드이다.
// @PathVariable 을 활용하면 URI 경로에서 원하는 데이터를 추출 할 수 있다.
// 조회의 목적 즉, select 처리는 GET방식을 활용한다.
ResponseEntity<List<ReplyVO>> entity = null;
try {
entity = new ResponseEntity<>(service.listReply(bno), HttpStatus.OK);
} catch (Exception e) {
e.printStackTrace();
entity = new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
return entity;
}