군만두의 IT 공부 일지

[스터디7] 06. REST 서비스 구현 본문

프로그래밍/Java

[스터디7] 06. REST 서비스 구현

mandus 2025. 5. 24. 05:07

목차

    10장. REST 서비스 구현

    이 장에서 다룰 내용
    - REST 서비스 이해하기
    - REST 엔드포인트 구현하기
    - HTTP 응답으로 서버가 클라이언트로 전송하는 데이터 관리하기
    - HTTP 요청 본문(body)에서 클라이언트가 보낸 데이터 가져오기
    - 엔드포인트 수준에서 예외 관리하기

    10.1 REST 서비스를 이용한 앱 간 데이터 교환

    • REST 엔드포인트:
      • 스프링에서 HTTP 메서드와 경로에 매핑된 컨트롤러 액션이다.
      • 스프링 MVC 디스패처 서블릿이 뷰를 찾지 않는다는 것이 다르다.
      • 서버는 컨트롤러의 액션이 반환하는 것을 클라이언트에 대한 HTTP 응답으로 직접 전송한다.

    ▲ REST 엔드포인트를 구현할 때 MVC 흐름도

    • REST 엔드포인트의 통신 문제:
      • 컨트롤러 작업이 완료되는 데 오랜 시간이 소요된다면 엔드포인트에 대한 HTTP 호출이 타임아웃(timeout)되어 통신이 중단될 수 있다.
      • HTTP 요청으로 한 번의 호출에 대량의 데이터를 전송하면 호출이 타임아웃되어 통신이 중단될 수 있다.
      • 백엔드 컴포넌트로 노출된 엔드포인트에 대한 동시 호출이 과도하면 앱은 지나치게 많은 부하를 받아 실패할 수 있다.
      • 네트워크는 HTTP 호출을 지원하지만, 네트워크 때문에 REST 엔드포인트 호출이 실패할 가능성은 항상 존재한다.

    10.2 REST 엔드포인트 구현

    간단한 웹 컨트롤러를 REST 컨트롤러로 변환하여 REST 웹 서비스를 구현하는 방법은 다음과 같다.

    • 컨트롤러 클래스에 @Controller 스테레오타입 애너테이션을 추가한다. 스프링 컨텍스트에서 클래스의 인스턴스가 빈이 되고 스프링 MVC는 이 애너테이션이 메서드를 특정 HTTP 경로에 매핑하는 컨트롤러라고 인식한다.
    • @GetMapping 애너테이션을 사용하여 액션 경로와 HTTP 메서드를 지정한다.
    • @ResponseBody 애너테이션을 사용한다. 컨트롤러의 액션이 뷰 이름이 아니라 HTTP 응답으로 직접 전송된 데이터를 반환한다는 것을 디스패치 서블릿에 알려 준다.
    // @ResponseBody 애너테이션이 중복된 코드
    package com.example.controllers;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    public class HelloController {
    
      @GetMapping("/hello")
      @ResponseBody
      public String hello() {
        return "Hello!";
      }
    
      @GetMapping("/ciao")
      @ResponseBody
      public String ciao() {
        return "Ciao!";
      }
    }
    • @RestController을 사용하여 컨트롤러의 모든 액션이 REST 엔드포인트라고 스프링에 지시할 수 있다. @ResponseBody 애너테이션을 반복하지 않아도 된다.
    // 코드 중복을 피하는 @RestController 애너테이션 사용하기
    package com.example.controllers;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class HelloController {
    
      @GetMapping("/hello")
      public String hello() {
        return "Hello!";
      }
    
      @GetMapping("/ciao")
      public String ciao() {
        return "Ciao!";
      }
    }
    • 엔드포인트를 호출하는 도구:
      • 포스트맨(Postman): 멋진 GUI를 제공하며 사용하기 편하다.
      • cURL: GUI가 없는 경우(예: SSH로 가상 머신에 연결하거나 배치 스크립트를 작성할 때)에 유용한 명령줄 도구다.

    기본적으로 스프링 부트 앱은 8080번 포트에서 액세스할 수 있도록 톰캣 서블릿 컨테이너를 구성한다.

    ▲ 포스트맨

    curl http://localhost:8080/hello

    ▲ cURL

     

    이 글은 『스프링 교과서』 책을 학습한 내용을 정리한 것입니다.
    Comments