[Spring] REST API
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 {