요청가능한 자원에 대해 주소(URI)를 지정하고 HTTP 상에서 (부가적인 전송 계층 없이) HTTP methods를 이용하여 자원의 상태(정보) 전송
URI를 통한 자원의 식별
- 예: http://api.example.com/products/101
HTTP method를 이용한 자원에 대한 연산(operation) 요청
- 예: POST, GET, PUT, DELETE 등
Resource의 URI 명명 규칙
1) 단일 객체나 객체 집합의 이름을 나타내는 명사 이용
2) Underscores(_) 대신 hyphens(-) 사용, 마지막에 slash(/) 생략
3) 소문자 사용
4) 파일의 확장자 불포함
5) 객체 집합을 정렬하거나 filtering하기 위해 request parameter 활용
- ~~~?region=USA&brand=XYZ&sort=reg-date
6) CRUD 연산의 이름 미사용 (HTTP methods 이용, update 같은 직접적인 이름 X)
Spring framework의 REST 지원
@PathVariable
: parameterized URI를 이용한 요청 처리@GetMapping("/users/{id}")
public User getUser(@PathVariable("id") Long userId) {
return userService.getUserById(userId);
}
@RequestBody
: 요청 메시지 -> Java 객체 변환@ResponseBody
: Java 객체 -> 응답 메시지 변환@RequestBody
: 요청 메시지의 body에 포함된 데이터를 지정된 Java 객체에 저장@ResponseBody
: Java 객체에 포함된 데이터를 응답 메시지의 body에 출력@RestController
: @Controller + @ResponseBody@PostMapping
@ResponseBody
public String submit(@RequestBody String body) {
System.out.println("Request Body:" + body);
return body; // 예: "name=Chris&age=20"
}
HttpMessageConverter
구현체를 제공<mvc:annotation-driven />
또는 @EnableWebMvc
설정을 통해 다양한 HttpMessageConverter 구현 객체를 생성annotation | meaning |
---|---|
@XmlRootElement | Java class를 XML root element로 mapping |
@XmlElement | Field나 property(getter)를 XML element로 mapping |
@XmlAccessorType | Java class의 어떤 요소가 기본적으로 mapping되는지를 명시 (field or property) |
@XmlType | XML Schema type 및 element들의 순서를 명시 |
@XmlTransient | XML mapping에 제외될 field나 property를 지정 |
@XmlAttribute | Field나 property를 XML attribute로 mapping |
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public Jaxb2Marshaller jaxb2Marshaller() {
Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
// @XmlRootElement 어노테이션 스캔
jaxb2Marshaller.setPackagesToScan(Person.class.getPackageName());
return jaxb2Marshaller;
}
}
@XmlRootElement
@Getter
@Setter
@Entity
public class Person {
@Id @GeneratedValue
private Long id;
private String name;
}