스프링 MVC 1편
Intro
안녕하세요. 최혜정 사원입니다. 스프링 MVC 1편 강의를 보고 정리한 내용입니다.
1. RequestMapping(요청 매핑) 이란?
요청이 왔을 때 어떤 컨트롤러가 호출이 되어야 하는지 알려주는 지표 같은 것
@RestController
@Slf4j
public class Mapping{
@RequestMapping("/hello-basic")
public String helloBasic() {
log.info("helloBasic");
return "ok";
}
}
이렇게 매핑을 하면 localhost:8080/hello-basic으로 url을 입력했을 경우에 이것에 해당하는 메서드가 실행된다.
RequestMapping은 다중 요청도 가능하다 다중 요청을 하려면 배열로 묶어야 한다.
@RequestMapping(value = {"/hello", "/hello-basic"})
1-1. HTTP 메서드
@RequestMapping에 method 속성으로 HTTP 메서드를 지정하지 않으면 HTTP 메서드와 무관하게 호출된다.
모두 허용 GET, POST, PUT, PATCH, DELETE
@RequestMapping(value = "/hello-basic", method = RequestMethod.GET)
2. HTTP 메서드 매핑 축약
HTTP 메서드를 축약한 애노테이션을 사용하는 것이 더 직관적이다.
- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping
- @PatchMapping
@GetMapping(value = "/hello-basic")
3. 경로변수(PathVariable) 사용
최근 HTTP API는 리소스 경로에 식별자를 넣는 스타일을 선호한다.
쿼리 파마리터로 식별자를 넣는 방법도 있지만 경로 변수를 사용하는 것이 매핑되는 부분을 편리하게 조회할 수 있다.
- url 자체에 값이 들어가있다.
- /mapping/userA
- /users/1
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data) {
log.info("mappingPath userId={}", data);
return "ok";
}
localhost:8080/mapping/userA 라고 입력하면 userId가 data로 매칭돼서 편하게 사용할 수 있다.
변수명이 같으면 생략 가능
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable userId)
3-1. PathVariable 사용 - 다중
@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable Long orderId) {
log.info("mappingPath userId={}, orderId={}", userId, orderId);
return "ok";
}
4. @ModelAttribute
요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다.
보통 @RequestParam을 사용해서 값을 받고, set을 사용해서 값을 넣어주곤 하지만 이 과정을 자동화시켜주는 것이 @ModelAttribute이다.
요청 파라미터를 바인딩 받을 객체
@Data
public class HelloData {
private String username;
private int age;
}
롬복 @Data : @Getter , @Setter , @ToString , @EqualsAndHashCode , @RequiredArgsConstructor 를 자동으로 적용해준다.
@ModelAttribute를 사용하지 않을 때
public void item(@RequestParam String username,
@RequestParam int age) {
HelloData helloData = new HelloData();
helloData.setUsername(username);
helloData.setAge(age);
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
@ModelAttribute를 사용할 때
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
- HelloData 객체를 생성한다.
- 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩) 한다.
- 파라미터 이름이 username 이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다.
5. 요청 매핑 - API 예시
@RestController
@RequestMapping("/mapping/users")
public class MappingClassController {
@GetMapping
public String user() {
return "get users";
}
@PostMapping
public String addUser() {
return "post user";
}
@GetMapping("/{userId}")
public String findUser(@PathVariable String userId) {
return "get userId = " + userId;
}
@PatchMapping("/{userId}")
public String updateUser(@PathVariable String userId) {
return "update userId = " + userId;
}
@DeleteMapping("/{userId}")
public String deleteUser(@PathVariable String userId) {
return "delete userId = " + userId;
}
}
- 회원 목록 조회: GET /mapping/users
- 회원 등록: POST /mapping/users
- 회원 조회: GET /mapping/users/id1
- 회원 수정: PATCH /mapping/users/id1
- 회원 삭제: DELETE /mapping/users/id1
Leave a comment