1 분 소요

1. REST API란?

REST(Representational State Trasfer)는 REST 아키텍처의 제약 조건을 준수하는 어플리케이션 프로그래밍 인터페이스를 뜻한다.

  • REST : HTTP URI를 통해서 제어할 리소스를 명히하고, HTTP method을 통해 해당 리소스를 제어하는 명령을 내리는 방식의 아키텍처.
  • 웹 서비스와 모바일 앱 경량화의 필요에 맞춘 아키텍처 원칙.
  • HTML, XML, Text, JSON 과 같은 다양한 형식으로 메시지 반환을 가능하게 함.
  • 경량화 되어있고, 인간과 기계가 모두 읽을수 있음.

2. REST 구성

  • 자원(Resource) - URI
  • 행위(Verb) - HTTP Method(GET,POST,PUT,DELETE)
  • 표현(Representations)

3. 기존방식과 차이점

3.1 서비스적 차이점

  • 기존 : 요청에 대한 처리를 한 후 가공된 데이터를 이요해서 특정 플렛폼에 적합한 형태의 View로 만들어서 반환
  • Rest: 데이터 처리만 하거나, 처리 후 반환 될 데이터가 있으면 JSON이나 XML 형식으로 전달한다.

3.2 웹접근 방식 차이점

작업 Method 기존 Method REST
Create POST /write.do?id=asd123 POST /blog/asd123
Read GET /view.do?id=asd123&articelno=25 GET /blog/asd123/25
Update POST /modify.do?id=asd123 PUT /blog/asd123
Delete GET /delete.do?id=asd123&articelno=25 DELETE /blog/asd123

4. REST API 설정

4.1 Jackson

  • jackson-databind 는 객체를 JSON 형태의 문자열로 변환시켜서 브라우저로 전송하는 라이브러리
  • jackson-dateformat-xml은 객체를 XML 형태로 브라우저로 전송
          <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
          <dependency>
              <groupId>com.fasterxml.jackson.core</groupId>
              <artifactId>jackson-databind</artifactId>
              <version>${jackson-databind-version}</version>
          </dependency>
    

4.2 REST 관련 Annotation

  • @RestController : 컨트롤러가 REST방식을 처리하기 위한 것임을 명시
  • @ResposeBody : View(JSP)로 전달하는 대신에 데이터 자체(String)를 전달
  • @PathVariable : URL 경로에 있는 값을 파라미터로 추출.
  • @CrossOrigin : Ajax의 Cross Domain 이슈 해결
  • @RequestBody : JSON 데이터를 원하는 형태로 바인딩 한다.

5. Rest API 적용

5.1 @RestController & @ResposeBody

  • @Controller 와 @RestController의 차이는 반환을 View(jsp)로 하느냐 데이터 자체를 반환하느냐에 따라 구별된다.
  • @RestController = @ResponseBody + @Controller.

@Controller 적용

@RequestMapping("/userapi")
@Controller
public class UserController{
	@PostMapping(value="/user")
	public @ResponseBody User register(){
		...
	} 
}

@RestController 적용

@RequestMapping("/userapi")
@RestController
public class UserController{
	@PostMapping(value="/user")
	public User register(){
		...
	} 
}

5.2 @PathVariable

  • Mapping 어노테이션의 URL 정의 부분과 Method의 매개변수에 정의하여 사용 가능하다.
  • 어노테이션 값으로 {템플릿 변수}를 사용
  • @PathVariable로 {템플릿 변수}와 동일한 이름을 갖는 매개변수를 추가한다.

      @GetMapping(value="/user/{userid})
      public User userInfo(@PathVariable("userid)) String userid){
    

5.3 @CrossOrigin

  • 웹 페이지의 제한된 자원을 외부 도메인에서 접근을 혀용해주는 방식
  • 보통 API를 사용할 떄 ajax를 사용하는데 같은 도메인을 사용 하지 않으면 거부된다.

      @RequestMapping("/userapi")
      @CrossOrigin("*")=>전체 메소드도 지정 가능
      public class UserController{
          @CressOrigin(origin={"http://localhost:8080"}) => 한개만 지정 가능하다.
          @RequestMapping("/user")
          public List<User> userList() throws Exception{
              ...
          }
      }
    

5.4 @RequestBody

  • 요청할 내용에 대해서 자바 객체로 변환한다.
  • HttpMessageConveter를 사용해서 변환.
  • Http요청의 본문(body)데이터를 그대로 전달한다.
  • XML이나 JSON기반의 메시지를 요청할 경우 사용한다.

      @PostMapping(value = "/user")
      public List<User> register(@RequestBody User user) throws Exception {