。
@RequestMapping,@GetMapping,@DeleteMapping,@PatchMapping,@PostMapping,@PutMapping
。클라이언트의요청의URL 패턴과HTTP Method가 일치하는 경우 선언된메서드로mapping하는어노테이션
▶Spring MVC의HandlerAdapter,HandlerMapping역할을 수행
。Web Controller Class의 내부를 구성하는Controller Method를 정의 시 사용 Controller Class
▶ 해당 method는Controller로서요청을 처리하고Service,Repository를 통해 필요한logic을 수행 후 결과를Dispatcher Servlet으로응답
。기본적으로반환값은View Resolver에 의해 참조되며REST API를 통한JSON등의 데이터를 반환 시@ResponseBody선언 시View Resolver는 작동하지 않는다.
。각REST API Controller의URL Pattern설정 시 각Endpoint에 적합하게 지정
REST API - Endpoint
@RequestMapping(value="url", method = RequestMethod.HTTP메서드명)
。HTTP method를 설정하는 경우매핑된URL Pattern을요청시HTTP Method에 해당하는요청에 대해서만 해당Controller Method를 사용
▶ 일일이RequestMethod를 통해HTTP 메서드를 지정해야하며 직관적이지 않으므로 잘 활용되지않음
。HTTP Method 종류:
GET,POST,DELETE,PUT,PATCH@RequestMapping("/say-hello-jsp" , method = RequestMethod.GET) public String sayHelloJsp() { return "sayHello"; }
클래스 레벨에 선언하는 경우API의URL Pattern의prefix를 지정
。클래스에@RequestMapping("/api/users")선언 시Controller에@GetMapping("/1")을 선언하는 경우 해당Controller로/api/users/1의HTTP 요청이라우팅@RestController @RequestMapping("/members") public class MemberController { private final MemberService memberservice; // localhost:8080/members/로 요청 시 해당 컨트롤러로 매핑 @PostMapping("/") @ResponseStatus(HttpStatus.CREATED) public void create(@Valid @RequestBody MemberCreateRequest request) { // }
@GetMapping(path="url")
。@RequestMapping(path="url", method = RequestMethod.GET)와 동일 기능을 수행하는어노테이션
。REST API에 의한Path Variable를 정의할 경우path="URL"에{Path Variable이름}을 추가해야한다.
▶@GetMapping(path="/users/{id}")
。Http 메서드에 따라서 다음어노테이션이구체화:
@DeleteMapping,@PatchMapping,@PostMapping,@PutMapping@GetMapping(path="/users/{id}") public User GetUserById(@PathVariable int id){ User user = userDaoService.findById(id); return user; }
Http Method:GET이 아닌 경우Http Message에XML또는JSON을 포함하여 전송
。클라이언트에서요청내HTTP Message Body에JSON Format데이터를 포함 시@RequestBody을 통해Jackson이 동작하여JSON을POJO인DTO로바인딩하여 처리
。
@RequestBody,@ResponseBody
▶Jackson Message Converter를 이용
DTO
。DTO는POJO를 사용
▶Spring Bean은Singleton특징으로데이터 전달용도로는 사용하지 않는다.
@RequestBody
。클라이언트에서JSON Format의 데이터를HTTP Request Body에 포함하여Controller의URL로 요청 시Controller의매개변수에서 해당JSON 데이터와 사전에Mapping된DTO 객체에 선언하여 수신받도록하는어노테이션
▶Jackson의역직렬화를 통해 선언된Controller Method의 매개변수에 존재하는DTO 객체와HTTP Request Body의JSON과 Mapping
。JSON의key와 매핑할DTO의field명을 동일하게 설정
。GETMethod는@ResponseBody를 사용 불가능!
▶GET은 기본적으로HTTP Request Body를 포함하지않으므로Query String을 통해클라이언트로부터 데이터를 수신
。Content Negotiation을 통해HTTP Request Body의데이터를클라이언트가 원하는Representation(data typeorlanguage)로Response받을 수 있음.// DTO 정의 public class UserCreateRequest { private String name; private int age; public UserCreateRequest(String name, int age) { this.name = name; this.age = age; } public int getAge() { return this.age; } }@RestController @RequiredArgsConstructor public class AnnotationController { AnnotationRepository annotationRepository; // REST API 역할의 Controller @PostMapping("/annotation/user") public void create(@RequestBody UserCreateRequest request) { System.out.println(request.getAge()); } }
@ResponseBody
。REST API를 구현하기위해Controller에서자원을 포함하여 반환되는DTO 객체를JSON,XMLformat으로직렬화하여Dispatcher Servlet을 통해HTTP Response Body로 포함하여클라이언트에게 반환하도록 하는어노테이션
。@ResponseBody를 선언하는 경우View Resolver의 작동을 차단
▶반환값을 기준으로View의 기반이 될템플릿 파일을 검색을 수행하지않고 그대로 반환.
。@ResponseBody대신ResponseEntity로 대체가능 ResponseEntity
。@RestController내부에@ResponseBody를 포함하므로 따로 정의할 필요는 없다.
。Controller Method에서Response용도의DTO의 일반POJO를 반환값으로 설정 및@ResponseBody를 선언 시Jackson에 의해JSON으로직렬화되어HTTP Response Body에 포함
▶Response용도의DTO는getter를 포함해야한다.// @ResponseBody : 이미 @RestController에 포함 @RestController public class CourseController { @GetMapping( path="/courses") public List<Course> retrieveAllCourses() { return Arrays.asList( new Course(1,"Learn AWS","wjdtn1"), new Course(1,"Learn DevOps","wjdtn2") ); } }
▶ 반환된DTO 객체가@ReponseBody에 의해JSON으로직렬화되어브라우저로 전달됨
Message Converter
。POJO를JSON등의 다양한Format으로직렬화하는 역할을 수행.
。Controller에서 전달된JSON을Message Converter를 통해DTO로역직렬화하거나 반환하는DTO를HTTP Message에 맞는 데이터(JSON등 )으로직렬화
JacksonHttpMessageConverters
。Spring Boot의 기본Http Message Converter
。@RequestBody,@ResponseBody에 포함되어 있음.
▶ 해당Message Converter로POJO를 전달 시JSON Conversion하거나JSON전달 시POJO로매핑하는 역할을 수행.
。
Query Parameter:@RequestParam
。Path Variable:@PathVariable
@RequestParam:
。URL 패턴상Query Parameter를Controller Method의 매개변수로Binding
。@RequestParam는GET의Query Parameter뿐만 아니라,POSTmethod를 통해 전달되는Form Data도 전달 받을 수 있다.@Controller public class gotoLoginPage { @RequestMapping("/login") public String gotoLoginPage(@RequestParam String name, ModelMap model) { model.put("name",name); return "login"; } }。
URL 패턴:/login?name=wjdtn747일 경우,
▶ 매개변수에@RequestParam String name설정 시 URL의Query Parameter의name과mapping
@RequestParam(required = true)
。요청시URL에 해당Query Parameter를 포함하지 않는 경우IllegalArgumentException를 발생
▶Client에게400 에러를 반환
。Query String이 꼭 필요하지 않는경우@RequestParam(required = false)설정
▶Spring은 기본적으로required=false
@RequestParam(defaultValue = "기본값")
。요청시URL에 해당Query Parameter를 포함하지 않는 경우 설정된기본값을 전달
▶초기 개발시값을 안넣는 경우도 존재하여테스트의임시값 설정 용도로 사용
Query Parameter/자원명?키=값Query String
。URI에 포함되어 전달되는Query String
▶@RequestParam으로 수신
@PathVariable:
。@RestController의Controller에 요청되는REST API URL에 포함된Path Variable을Controller Method의 매개변수로 Mapping.@GetMapping( path = "/courses/path-variable/{name}") public Course getCourse(@PathVariable String name) { // /{name} : Path Variable => 변수는 {}로 구분. return new Course(1,name,"wjdtn1"); }。
Controller에 등록하는URL 패턴의Path Parameter부분은{PathVariable명}으로 지정.
▶매개변수명칭과URL 패턴의{PathVariable명}을 통일
@PathVariable()
Path Variable:/user/{name}
。REST API의URI에 포함되어 전달되는Path
▶@PathVariable으로 수신
@ResponseStatus(code=HttpStatus.상태코드)
。Spring MVC에서Controller에특정 Exception이 발생한 경우 정의된HTTP Status Code와 함께Response를반환하도록 설정.
▶HTTP Response의Status Code를 설정
。인자로HttpStatus객체(org.springframework.http.HttpStatus)의Status Code 프로퍼티를 설정 시404가 반환된다.
▶@ResponseStatus(code= HttpStatus.NOT_FOUND)@PostMapping("/users") @ResponseStatus(HttpStatus.CREATED) public void createUser(@RequestBody User user) { // 코드 }