9. Spring 기반 REST Service 구현

동동주·2024년 6월 7일
0

spring 기말고사

목록 보기
3/11

🥠 REST(Representational State Transfer)

  • 요청가능한 자원에 대해 주소(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 객체 -> 응답 메시지 변환
    • HttpMessageConverter: XML, JSON 등 다양한 data format에 대한 변환 처리 (처리를 내부적으로)

🥠 @RequestBody, @ResponseBody

  • @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"
   }

🥠 Java 객체와 message 간의 변환 처리

  • XML, JSON 등 다양한 message 타입들에 대한 HttpMessageConverter 구현체를 제공
    - 앞 예제에서 message body와 String 객체 사이의 변환을 위해 StringHttpMessageConverter가 사용됨
  • <mvc:annotation-driven /> 또는 @EnableWebMvc 설정을 통해 다양한 HttpMessageConverter 구현 객체를 생성

🥠 JAXB2를 이용한 XML 처리

1) JAXB(Java Architecture for XML Binding)란?

  • Java 객체와 XML 사이의 mapping을 위한 표준 라이브러리
    • Java objects -> XML data (marshalling)
    • XML data -> Java objects (unmarshalling)

2) Annotaion을 사용하여 mapping 정의

annotationmeaning
@XmlRootElementJava class를 XML root element로 mapping
@XmlElementField나 property(getter)를 XML element로 mapping
@XmlAccessorTypeJava class의 어떤 요소가 기본적으로 mapping되는지를 명시 (field or property)
@XmlTypeXML Schema type 및 element들의 순서를 명시
@XmlTransientXML mapping에 제외될 field나 property를 지정
@XmlAttributeField나 property를 XML attribute로 mapping
  • @XmlRootElement 예시 코드
@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;
}

3) GET/POST 요청 처리 흐름

  • Controller: GET 요청 처리
    • 프로그램 내 Java 객체 -> XML 데이터로 변환하여 응답 메시지로 전송
  • Controller: POST 요청 처이
    • 요청 메시지를 통해 전송된 XML 데이터 -> Java 객체로 변환하여 사용


⚓ 출처: https://velog.io/@maketheworldwise/Body%EB%A1%9C-%EC%A0%84%EB%8B%AC%EB%90%9C-JSONXML-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EC%B2%98%EB%A6%AC%ED%95%98%EB%8A%94-HTTP-Message-Converter

0개의 댓글