[Spring Boot] API 개발

    반응형

    0. HTTP Method

    각 HTTP Method가 하는 역할과 요청을 할 때 필요한 정보는 다음과 같습니다.

      CRUD 멱등성 안정성 Path Variable Query Parameter DataBody
    GET R (리소스 취득) O O O O X
    POST C (리소스 생성, 추가) X X O O
    PUT C/U(리소스 갱신, 생성) O X O O
    DELETE D(리소스 삭제) O X O O X

     

    1. GET 요청

    1-1. GET 요청 받아서 String 리턴하기

    스프링에서는 @RestController를 지원합니다. @RestController는 스프링 프레임워크 4점대 버전 이상부터 사용가능하고 @Controller@ResponseBody가 결합된 어노테이션입니다. 즉, 컨트롤러 클래스 하위 메서드에 @ResponseBody 어노테이션을 붙이지 않아도 문자열과 JSON을 전송할 수 있습니다.(객체를 리턴하면 자동으로 형변환을 하여 JSON으로 리턴해줍니다.)

    그리고 @GetMapping@RequestMapping 어노테이션에 method 속성을 RequestMethod.GET으로 한 것과 같은 어노테이션입니다. @GetMapping에는 path를 명시적으로 작성 후, URI를 작성해줄 수도 있고, path를 생략후, URI로 사용될 문자열만 작성해줘도 문제없이 작동합니다.

    @RestController
    @RequestMapping("/api/get")
    public class GetApiController {
    
        @GetMapping(path = "/hello")
        public String hello() {
            return "Hello";
        }
    }

    1-2. path variable 받기

    다음으로는 URI에서 path variable을 받아보겠습니다.  path variable을 받기 위해서는 @PathVariable 어노테이션이 필요합니다. @PathVariable의 name 속성에는 @GetMapping에 작성한 URI에서 사용된 변수명을 지정해주변 됩니다.

    @RestController
    @RequestMapping("/api/get")
    public class GetApiController {
    
        // http://localhost:8080/api/path-variable/{id}
        @GetMapping("/path-variable/{id}")
        public String pathVariable(@PathVariable(name="id") String idValue) {
            System.out.println("path-variable: " + idValue);
            return idValue;
        }
        
    }

     

    1-3. query parameter 받기

    GET 요청을 할 때에는 쿼리 파라미터를 받아야하는 경우가 많습니다. 쿼리 파라미터를 요청으로 받기 위해서는 @RequestParam이라는 어노테이션을 클래스 내의 메서드의 파라미터에 작성해주어야 합니다.

    @RestController
    @RequestMapping("/api/get")
    public class GetApiController {
    
        //http://localhost:8080/api/query-param?user={user_name}&email={email}
        @GetMapping("/query-param")
        public String queryParam02(
                @RequestParam String user,
                @RequestParam String email
        ) {
            return user + " " + email + "\n";
        }
        
    }

    Postman으로 확인한 결과

     

    1-4. query parameter로 객체 받기

    쿼리 파라미터로 객체를 넘겨주어야 하는 경우도 많습니다. UserDTO 클래스를 작성하고 이 객체를 쿼리 파라미터로 넘겨보도록 하겠습니다. UserDTO 클래스와 API를 다음과 같이 작성했습니다. 객체를 쿼리 파라미터로 넘겨줄 때에는 @RequestParam 어노테이션을 작성하지 않아도 됩니다.

    @Data
    public class UserDTO {
    
        private Integer id;
        private String address;
        private String email;
        private String password;
    
    }
    @RestController
    @RequestMapping("/api/get")
    public class GetApiController {
    
        @GetMapping("/query-param")
        public String queryParam(UserDTO user) {
            return user.toString();
        }
    
    }

    이때, 리턴 타입을 String이 아닌 UserDTOuser 객체를 그대로 반환하면 스프링에서 자동으로 JSON 형태로 변환하여 응답은 내려줍니다.

    @RestController
    @RequestMapping("/api/get")
    public class GetAPIController {
    
    	@GetMapping("/query-param")
        public UserDTO queryParam(UserDTO user) {
            return user;
        }
    
    }

     

    2. POST

    다음은 POST 메서드 요청입니다. POST 메서드로 요청을 할 때는 일반적으로 쿼리 파라미터에 데이터를 담아서 보내지 않고, Request body에 데이터를 담아 보냅니다. 이때 @RequestBody 어노테이션을 사용합니다. 위의 예시와 마찬가지로 UserDTO 객체를 Request body에 담아 echo해보겠습니다. (POST 메서드 요청의 리턴값은 대부분 void이므로 콘솔에만 데이터를 찍어보겠습니다.)

    @RestController
    @RequestMapping("/api/post")
    public class PostApiController {
    
        @PostMapping("/userdto")
        public void postUserDTO(@RequestBody  UserDTO user) {
            System.out.println(user.toString());
        }
    
    }

    위와 같이 POST 요청에 json 데이터를 request body에 담아서 send하면, 아래와 같이 객체가 잘 전달되어 찍히는 것을 확인할 수 있습니다.

     

    +) PUT과 DELETE 요청을 POST 메서드와 비슷하므로 생략하도록 하겠습니다.

    +) 추가적으로, java의 notation과 JSON의 notation이 다를 때, 데이터를 넘기고 받는 방법에 대해 알아보겠습니다. 일반적으로 자바에서는 camel notation(ex. userName)을 사용하고, JSON은 snake notation(ex. user_name)을 사용하는 것이 컨벤션입니다. 이런 컨벤션을 양 쪽 모두 지켜서 데이터를 주고 받기 위해서 @JSONNaming과 @JSONProperty 어노테이션을 사용합니다. @JSONProperty는 멤버 변수 각각에 대해서 JSON에서는 어떤 이름을 사용할 지 지정해주고, @JSONNaming은 해당 클래스의 전체 변수에 대해 어떤 네이밍 전략을 사용할 지 지정해줍니다.

    @Data
    @JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public class UserDTO {
    
        @JsonProperty("user_id")
        private Integer userId;
        private String userAddress;
        private String userEmail;
        private String userPassword;
    
    }

     

    위와 같이 멤버 변수를 모두 camel notation으로 UserDTO를 작성하고 JSON으로 snake notation에 따라 request body를 보내도 아래와 같이 객체가 잘 담겨서 전달되는 것을 확인할 수 있습니다.

    반응형

    댓글