。
@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(path="url", method = RequestMethod.HTTP메서드명)
。HTTP method를 설정하는 경우매핑된URL Pattern을요청시HTTP Method에 해당하는요청에 대해서만 해당Controller Method를 사용
▶ 일일이RequestMethod를 통해HTTP 메서드를 지정해야하며 직관적이지 않으므로 잘 활용되지않음
。HTTP Method 종류:
GET,POST,DELETE,PUT,PATCH@RequestMapping(path="/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로바인딩하여 처리
@GetMapping(value={ "URL엔드포인트1", "URL엔드포인트2", ... })
。설정된EndPoint들로요청시 해당컨트롤러로전달
▶PathVariable이 전달되는엔드포인트와컨트롤러공유 가능@GetMapping(value={"/path2" , "/path2/{name}"}) public String showIndex( @PathVariable(name = "name") Optional<String> name ){ // }。
/path2로 요청 시name = null로 설정되어 전달
。
@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의 기반이 될템플릿 파일을 검색을 수행하지않고 그대로 반환.
。CharacterSet까지 자동으로인코딩한문자열을 반환할 수 있다
▶ 따로Content-type에text/html;charset=UTF-8을 설정할 필요가 없다.
。@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으로직렬화되어브라우저로 전달됨
@ResponseBody는Return Type을 참고 후 해당하는Message Converter를 찾아 적용하여Conversion을 수행
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를 포함하지 않는 경우 설정된기본값을 전달
▶초기 개발시값을 안넣는 경우도 존재하여테스트의임시값 설정 용도로 사용
。defaultValue = "20"입력 시 자동으로문자열을정수형으로형변환후매개변수로 입력
@RequestParam은HttpServletRequest에서Query String을 가져오는 과정을 단축
。WAS에서HttpServletRequest로 전달되는HttpServletRequest.getParameterMap()을 통해Query String을 가져오는 과정을 간편하게 단축
@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) { // 코드 }
@ModelAttribute
。Spring MVC에서HTTP Request에서 전달된Query String을DTO역할의POJO로 즉시바인딩하는어노테이션
▶QueryString을DTO에 일일이 전달하는 코드를 작성할 필요 없음
POJO
。POJO는 반드시Query String입력을 위한기본 생성자와Getter / Setter를 정의해야한다.
。바인딩을 위해필드명은QueryString명과 동일해야한다.
▶localhost:8080/page-4?name=이름&password=비밀번호로 전달 시 해당POJO 객체로바인딩되어객체생성@Data @NoArgsConstructor class SignInForm{ private String name; private String password; }
@Controller
。HTTP Request전달 시빈 POJO 객체생성 후Query String을Setter를 통해필드로 설정한POJO 객체를Controller의매개변수로 전달@GetMapping("/page-4") public String showPage4( @ModelAttribute SignInForm signInForm ){ System.out.println(signInForm.name); return "model_test"; }