API를 작성하는 다양한 방법
HTTP 메서드에 해당하는 API를 개발하고 그 과정에서 필요한 내용들 중
하나인 GET 메서드의 구현에 관하여 자세하게 알아보겠습니다.
@RequestMapping
@RestController
@RequestMapping("/Sample")
public class SampleController {
}
클래스 수준에서 @RequestMapping을 설정하면 내부에 선언한 메서드의 URL 리소스 앞에 @RequestMapping의 값이 공통으로 추가된다.
@RequestMapping 어노테이션을 별다른 설정 없이 선언하면 HTTP의 모든 요청을 받는다.
GET API
웹 애플리케이션 서버에서 값을 가져올 때 사용하는 API이다.
@RequestMapping 어노테이션의 method 요소의 값을 RequestMethod.GET으로 설정하면 GET 요청 형식으로 설정할 수 있다.
@RequestMapping을 이용한 GET 메서드 구현
@RestController
@RequestMapping("/Sample")
public class SampleController {
//http://localhost:8080/Sample/test
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String getTest() {
return "test";
}
}
매개변수가 없는 GET 메서드 구현
@RestController
@RequestMapping("/Sample")
public class SampleController {
//http://localhost:8080/Sample/Hello
@GetMapping(value = "/Hello")
public String getHello() {
return "Hello";
}
}
@PathVariable을 GET 메서드 구현
실무 환경에서는 매개변수를 받지 않는 메서드가 거의 쓰이지 않는다. 웹 통신의 기본 목적은 데이터를 주고 받는 것이기 때문에 대부분 매개변수를 받는 메서드를 작성하게 된다. 매개변수를 받을 때 자주 쓰이는 방법 중 하나는 URL 자체에 값을 담아 요청하는 것이다.
@RestController
@RequestMapping("/Sample")
public class SampleController {
//http://localhost:8080/Sample/Project/{value}
@GetMapping(value = "/Project/{value}")
public String getValue(@PathVariable String value) {
return value;
}
}
해당 메서드는 중괄호({ })로 표시된 위치의 값을 받아 요청한다.
실제 요청 시 중괄호는 들어가지 않고 값만 존재한다.
값을 간단히 전달할 때 주로 사용하는 방법이며, GET 요청에서 많이 사용된다.
@GetMapping 규칙
- @GetMapping 어노테이션의 값으로 URL을 입력할 때, 중괄호를 사용해 어느 위치에서 값을 받을지 지정해야한다.
- 메서드의 매개변수와 그 값을 연결하기 위해 @PathVariable을 명시하며, @GetMapping 어노테이션과 @PathVariable에 지정된 변수의 이름을 동일하게 맞춰야한다.
@GetMapping 어노테이션과 @PathVariable에 지정된 변수의 이름을 동일하게 맞추기 어렵다면?
@PathVariable에는 변수의 이름을 특정할 수 있는 value 요소가 존재하며, 이 위치에 변수 이름을 정의하면 매개변수와 매핑할 수 있다.
@RestController
@RequestMapping("/Sample")
public class SampleController {
//http://localhost:8080/Sample/Project/{Value}
@GetMapping(value = "/Project/{value}")
public String getValue(@PathVariable("value") String value) {
return value;
}
}
@RequestParam을 활용한 GET 메서드 구현
URI에서 '?' 를 기준으로 우측에 ' {키}={값}' 형태로 구성된 요청을 전송하는 방법이다.
@RequestParam 어노테이션을 명시해 쿼리 값과 매핑하면 된다.
@RestController
@RequestMapping("/Sample")
public class SampleController {
//http://localhost:8080/Sample/request?name=value1&email=value2
@GetMapping(value = "/request")
public String getValue(@RequestParam String name, @RequestParam String email) {
return name + " " + email;
}
}
'?' 오른쪽에 쿼리 스트링(query string)이 명시되어있다. 쿼리스트링에는 키(변수의 이름)가 모두 적혀 있기 때문에 이 값을 기준으로 메서드의 매개변수에 이름을 매핑하면 값을 가져올 수 있다.
키와 @RequestParam 뒤에 적는 이름을 동일하게 설정하기 어렵다면 @PathVariable 예제에서 사용한 방법처럼 value 요소로 매핑한다.
@RequestParam과 Map을 조합한 GET 메서드 구현
@RestController
@RequestMapping("/Sample")
public class SampleController {
//http://localhost:8080/Sample/request?key1=value1&key2=value2
@GetMapping(value = "/request")
public String getValue(@RequestParam Map<String, String> param) {
StringBuilder sb = new StringBuilder();
param.entrySet().forEach(map -> {
sb.append(map.getKey() + " " + map.getValue() + "\n");
});
return sb.toString();
}
}
ex) 회원가입 관련 API에서 사용자는 회원가입 시에 ID 처럼 필수 항목이 아닌 선택 항목에 대해서는 값을 기입하지 않는 경우가 있다. 이러한 경우, 매개변수의 항목이 일정하지 않을 수 있어 Map 객체로 받는 것이 효율적이다.
DTO 객체를 활용한 GET 메서드 구현
DTO(Data Transfer Object)
- 다른 레이어 간의 데이터 교환에 활용된다.
- 각 클래스 및 인터페이스를 호출하면서 전달하는 매개변수로 사용되는 데이터 객체이다.
- 데이터를 교환하는 용도로만 사용하는 객체이기에 DTO에는 별도의 로직이 포함되지 않는다.
import lombok.*;
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class MemberDto {
private String name;
private String email;
}
- DTO 클래스는 전달하고자 하는 필드 객체를 선언하고 getter/setter 메서드를 구현한다.
- DTO 클래스에 선언된 필드는 컨트롤러의 메서드에서 쿼리 파라미터의 키와 매핑된다.
- 쿼리스트링의 키가 정해져있지만 받아야할 파라미터가 많을 경우세는 DTO 객체를 활용해 코드의 가독성을 높인다.
@RestController
@RequestMapping("/Sample")
public class SampleController {
//http://localhost:8080/Sample/request?name=value1&email=value2
@GetMapping(value = "/request")
public String getValue(MemberDto memberDto) {
return memberDto.toString();
}
}
'Book > 스프링부트 핵심가이드' 카테고리의 다른 글
스프링부트 생성 (Feat. Spring Initializr) (2) | 2023.10.25 |
---|---|
[Spring] 스프링부트 개발 기초 지식 (0) | 2023.10.18 |
[Spring] 스프링부트(Spring Boot) 설명과 특징 (0) | 2023.10.16 |
댓글