[Spring] REST API

Posted by 신희준 on October 26, 2017


2017 - 10 - 26 (목)

  • REST API

  • 코드로 배우는 스프링 웹프로젝트[구멍가게 코딩단 지음] 참조


    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;
      }