@RestController
@RequestMapping("/api/get")
public class GetController { }
시작하기 앞서, 다음과 같이 Controller를 만들고 경로를 지정해주자.
@RestController : 해당 클래스는 REST API를 처리하는 Controller임을 선언
@RequestMapping : URL 지정
/http://localhost:8080/api/get/hello
@GetMapping(path = "/hello")
public String getHello() {
return "Hello Spring!";
}
화면에 Hello Spring! 이라는 문자열이 출력된다. 리턴값이 그대로 HTML Body에 전달된다.
참고로, @GetMapping에 "path = "는 생략하고 "/hello"만 작성해도 문제 없다.
// http://localhost:8080/api/get/path-variable/{name}
@GetMapping("/path-variable/{name}")
public String pathVariable(@PathVariable String name) {
return name;
}
Path Variable, 말 그대로 경로(url)에 변수를 사용하는 방법으로,
파라미터로 넣은 값 "John"이 그대로 name에 대입된다.
이 때, 메서드에서 파라미터를 받을 때 반드시 @PathVariable 어노테이션을 사용한다.
// http://localhost:8080/api/get/query-param?name=john&email=john@gmail.com
@GetMapping("/query-param")
public String queryParameter(@RequestParam String name, @RequestParam String email) {
return name + ", " + email;
}
Query String으로 넘어온 파라미터들을 메서드 파라미터에 대입하는 방법으로,
파라미터로 넘어온 값들은 메서드의 파라미터 타입에 따라 적절히 전환된다.
이 때, 메서드에서 파라미터를 받을 때 반드시 @RequestParam 어노테이션을 사용한다.
단, 이렇게 일일이 파라미터를 받게 되는 경우,
파라미터의 수가 많아지면 코드가 복잡해지며 가독성이 떨어지게 되는 단점이 있다.
// http://localhost:8080/api/get/query-param?name=John&email=john@gmail.com
@GetMapping("/query-param/map")
public String queryParameterMap(@RequestParam Map<String, String> queryParam) {
StringBuilder sb = new StringBuilder();
queryParam.forEach((key, value) -> sb.append(key).append(": ").append(value).append("\n"));
return sb.toString();
}
위 예시에서는 name과 email 두 개의 파라미터를 Map 컬렉션으로 담았는데,
단, Map 컬렉션을 사용하는 경우 어떤 파라미터가 넘어오는지 명확하게 알 수 없는 단점이 있다.
StringBuilder나 forEach 등 기본 JAVA 문법은 굳이 설명하지 않겠다.
public class GetRequest {
private String name;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return this.name + ", " + this.email;
}
}
@GetMapping("/query-param/dto")
public String queryParameterDTO(GetRequest userRequest) {
return userRequest.toString();
}
파라미터로 넘어온 값들을 SpringBoot에서 자동으로 키 이름에 맞는 DTO 객체의 멤버 변수에 대입해주는 방법이다. 이 때, DTO 클래스를 별개로 만들어주어야 하며, 반드시 getter와 setter를 생성해주어야 한다. 참고로, 메서드의 파라미터로 DTO를 사용하게 되면, @RequestParam 애노테이션을 붙일 필요가 없다.
HTML Body 부분에는 userRequest 객체의 toString 메서드에 지정해놓은 문자열 포맷대로 파라미터들이 출력된 것을 확인할 수 있다.