IT탐험

스프링 REST API 본문

게시판만들기기록/스프링 프레임워크

스프링 REST API

watercase 2021. 10. 13. 11:47
  • Representational State Transfer
    • 하나의 URI가 고유한 리소스를 처리하는 공통 방식
      • /board/112 : 게시글 중 112번째 글
    • 전송 방식을 나타내는 method 속성의 값에 따라 리소스에 대한 추가 작업을 요청
    • RESTful API
      • REST 방식으로 제공되는 API
      • 트위터와 같은 Open API에서 활발히 사용중

 

 

  • @RestController
    • 스프링 3버전까지는 @ResponseBody 애너테이션으로 REST 방식의 데이터 처리 지원
    • 스프링 4버전에서는 @RestController 애너테이션으로 REST 방식의 데이터 처리 지원
    • JSP 같은 뷰를 반환하는 것이 아닌, JSON, XML 같은 데이터를 브라우저로 전송하는 컨트롤러
  • @PathVariable
    • 브라우저에서 요청 URL로 전달된 매개변수를 가져온다
    • 더보기
      @RequestMapping(value= "/notice/{num}" , method = RequestMethod.GET)
      public int notice(@PathVariable("num") int num ) throws Exception {
      		return num;
      }
  • Ajax를 적용할 때 @RequestBody 와 @ ResponseBody를 자주 사용한다
    •  @RequestBody
      • 브라우저에서 전달되는 JSON 데이터를 객체로 자동 변환
    • @ResponseBody
      • JSP를 뷰리졸버로 리턴한 뒤 브라우저에 결과를 표시하는게 아닌 텍스트나 JSON으로 결과를 전송
  • @ResponseEntity
    • @RestController는 별도의 View를 제공하지 않고 데이터를 전달하므로 예외가 발생할 수 있다
    • 예외에 대한 세밀한 제어는 ResponseEntity 클래스를 사용한다
      • HTTP 상태 코드를 설정하여 앱으로 전송
        • 그룹 코드 상수 설명
          정보 응답 100 CONTINUE 정상 상태이고 클라이언트가 계속해서 요청하거나 요청이 완료된 경우에는 무시해도 된다는 정보
          101 SWITCHING_PROTOCOL 클라이언트가 보낸 upgrade 요청 헤더에 대한 응답
          서버에서 프로토콜을 변경할 것임을 알림
          성공 응답 200 OK 요청이 성공적으로 완료
          201 CREATED 요청이 성공적이었고 그 결과로 새로운 리소스 생성
          202 ACCEPTED 요청을 수신했지만 그에 응한 행동은 할 수 없음
          리다이렉션 메시지 300 MULTIPLE_CHOICE 요청에 대해 하나 이상의 응답이 가능
          301 MOVED_PERMANENTLY 요청한 리소스의 URI가 변경
          302 FOUND 요청한 리소스의 URI가 일시적으로 변경
          303 SEE_OTHER 클라이언트가 요청한 리소스를 다른 URI 에서 GET 요청을 통해 얻어야 할 경우 서버가 클라이어트로 직접 보내는 응답
          클라이언트 오류 응답 400 BAD_REQUEST 잘못된 문법으로 인해 서버가 요청을 이해할 수 없음
          401 UNAUTHORIZED 인증되지 않았음
          403 FORBIDDEN 클라이언트가 콘텐츠에 접근할 권리가 없다
          404 NOT_FOUND 요청 받은 리소스를 찾을 수 없다
          서버 오류 응답 500 INTERNAL_SERVER_ERROR 처리할 수 없는 내부 오류 발생
          501 NOT_IMPLEMENTED 메서드를 서버가 지원하지 않거나 처리할 수 없다는 의미
          503 SERVICE_UNAVAILABLE 서버가 요청을 처리할 준비가 되지 않았다는 의미
        • 더보기
          @RequestMapping("/membersList2")
          public  ResponseEntity<List<MemberVO>> listMembers2() {
              List<MemberVO> list = new ArrayList<MemberVO>();
              for (int i = 0; i < 10; i++) {
                  MemberVO vo = new MemberVO();
                  vo.setId("lee" + i);
                  vo.setPwd("123"+i);
                  vo.setName("이순신" + i);
                  vo.setEmail("lee"+i+"@test.com");
                  list.add(vo);
              }
              return new ResponseEntity(list,HttpStatus.INTERNAL_SERVER_ERROR);
          }
      • HttpHeaders 클래스를 이용하면 전송할 데이터의 종류와 한글 인코딩 설정 가능
        • 더보기
          @RequestMapping(value = "/res3")
          public ResponseEntity res3() {
              HttpHeaders responseHeaders = new HttpHeaders();
              responseHeaders.add("Content-Type", "text/html; charset=utf-8");
              String message = "<script>";
              message += " alert('새 회원을 등록합니다.');";
              message += " location.href='/pro29/test/membersList2'; ";
              message += " </script>";
              return  new ResponseEntity(message, responseHeaders, HttpStatus.CREATED);
          }

REST 방식으로 URI 표현

  • 서버에 데이터를 조회하는 것 외에도 추가, 수정, 삭제 기능도 REST 방식으로 요청할 수 있다
    • HTTP 메서드를 이용하여 처리
      • 메서드 설명
        POST 추가
        GET 조회
        PUT 수정
        DELETE 삭제
    • 작업을 REST 방식으로 요청하는 URI
      • /작업명/기본키 + 메서드 + 데이터
        • 작업명 : 요청하는 작업 종류
        • 기본키 : 요청하는 작업에 해당하는 대상의 기본키
        • 메서드 : 요청하는 기능
        • 데이터 : 기능 수행에 필요한 JSON 데이터
      • 게시판 기능과 관련된 URI
        • 메서드 URI 설명
          POST /boards + 데이터 새 글 등록하기
          GET /boards/133 133번 글 조회
          PUT /boards/133 + 데이터 133번 글 수정
          DELETE /boards/133 133번 글 삭제

 

Comments