API 컨트롤러 시작하기
@RestController
@RequestMapping("/api/get")
public class GetApiController {
...
}
컨트롤러 클래스위에 어노테이션 @RestController와 @RequestMapping를 붙여줍니다.
@RestController은 컨트롤러로 쓰겠다고 선언하것이고
@RequestMapping 클라이언트에서 보낼 URI를 기술하면 됩니다.
@RequestMapping vs @GetMapping
@RestController
@RequestMapping("/api/get")
public class GetApiController {
@GetMapping(path = "/hello") // http://localhost:9090/api/get/hello
public String getHello() {
return "get Hello";
}
@RequestMapping(path = "/hi", method = RequestMethod.GET) // get http://localhost:9090/api/get/hi
public String hi() {
return "hi";
}
}
예전에 api를 작성할 때는 @RequestMapping 어노테이션을 사용했습니다.
@RequestMapping를 사용하게 되면 get, post, put, delete 등 모든 타입을 받게 됩니다.
그래서 method 속성을 사용하여 타입을 지정해주었습니다.
하지만 Restful api를 명시적으로 작성하기 위해서
@GetMapping, @PostMapping, @PutMapping, @DeleteMapping 등 타입에 맞는 어노테이션을 사용하는 것을 권장합니다.
@GetMapping("") 안에 바로 URI를 적어주면 path로 인식합니다.
@PathVariable
URI에 가변 변수를 사용하고 싶을 때 사용하는 어노테이션입니다.
@GetMapping("/path-variable/{name}")
public String pathVariable(@PathVariable(name = "name") String pathName) {
System.out.println("PathVariable : " + pathName);
return pathName;
}
URI에 {가변 변수명}를 기술하고 @PathVariable name에 가변 변수명을 선택하고 사용하면 됩니다.
@PathVariable name에서 name 속성을 생략 시 받아오는 파라미터명을 같게 하면 됩니다.
이 경우 파라미터 변수명을 바꾸고 싶은 경우에는 클라이언트에서 URI를 변경해야함으로 번거로울 수 있습니다.
그러므로 name 속성을 생략하지 않고 사용하는 것이 더 편리하고 명시적일 수 있습니다.
@RequestParam
URI에 파라미터를 queryString으로 보내는 경우 파라미터를 받을 때는 @RequestParam을 사용합니다.
Map으로 파라미터를 받는 경우
@GetMapping("/query-param01")
public String queryParam01(@RequestParam Map<String, String> queryParam) {
StringBuilder sb = new StringBuilder();
queryParam.entrySet().forEach( entry -> {
sb.append(entry.getKey()+ " = " + entry.getValue()+ "\n");
});
return sb.toString();
}
직접 데이터를 일일이 파라미터를 받는 경우
@GetMapping("/query-param02")
public String queryParam02(
@RequestParam String name,
@RequestParam String email,
@RequestParam int age
) {
return name+" "+email+" "+age;
}
이 경우 파라미터를 추가할 때마다 @RequestParam을 선언해야하므로 코드가 길어질 수가 있습니다.
그렇다고 map으로 파라미터를 받는 경우 파라미터를 일일이 추출해서 사용해야할 경우에 불편할 수 있습니다.
그러므로 다음에 서술할 dto를 사용하여 파라미터를 받는 것을 권장합니다.
DTO를 사용하여 파라미터를 받는 경우
@GetMapping("/query-param03")
public String queryParam03(UserRequest userRequest, @RequestParam String name) {
return userRequest.toString();
}
DTO 클래스를 만들어야하는 번거러움이 있지만, 한번 만들어 놓으면 코드의 재사용과 변경에 용이합니다.
DTO를 사용할 경우 @RequestParam을 기술하지 않아야합니다.
또한 DTO와 @RequestParam로 파라미터를 받는 형식은 함께 사용할 수 있습니다.
'Java' 카테고리의 다른 글
java - PUT API (0) | 2021.08.26 |
---|---|
java - POST API (0) | 2021.08.26 |
java - api 프로젝트 만들기 (0) | 2021.08.25 |
java - 전략 패턴(행위 패턴) (0) | 2021.08.24 |
java - 파사드 패턴(구조 패턴) (0) | 2021.08.24 |
댓글