사용자의 입력을 서버단에서 처리하기위해 받아오는 방법으로 여러가지가 있습니다.
Path Variable
// GET http://localhost:8080/hello/request/star/Robbie/age/95
@GetMapping("/star/{name}/age/{age}")
@ResponseBody
public String helloRequestPath(@PathVariable String name, @PathVariable int age)
{
return String.format("Hello, @PathVariable.<br> name = %s, age = %d", name, age);
}
Get 방식으로 URL에 데이터를 입력받아 전달할 경우 컨트롤러 단에서 해당 데이터를 처리할 수 있도록
가져올 수 있다, @GetMapping 어노테이션에 가져올 데이터 부분을 {}로 묶어서 네이밍 처리하고
메소드의 파라미터에 타입 앞에 @PathVariable 어노테이션을 붙인뒤 함수 내부에서 사용이 가능.
html 과같은 front 단에서 사용자의 입력을 받아 서버로 넘겨 처리할 때 사용할 수 있는 방법이겠다.
RequestParam
// GET http://localhost:8080/hello/request/form/param?name=Robbie&age=95
@GetMapping("/form/param")
@ResponseBody
public String helloGetRequestParam(@RequestParam String name, @RequestParam int age) {
return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
제일 많이 익숙한 방식으로 URL의 ? 표시 뒤에 key : value 쌍으로 들어오는 값을 사용하는 방법이다.
쿼리라고도 하며 메소드의 파라미터로 @RequestParam 어노테이션을 붙여준다.
Post 방식을 사용하여 처리하는방법.
// POST http://localhost:8080/hello/request/form/param
// Header
// Content type: application/x-www-form-urlencoded
// Body
// name=Robbie&age=95
@PostMapping("/form/param")
@ResponseBody
public String helloPostRequestParam(@RequestParam String name, @RequestParam int age) {
return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
Post는 Get과는 다르게 URL에 데이터를 담아 보내는것이 아니라 Body부분에 담아 전송합니다.
이 경우에도 @RequestParam으로 key 값을 사용하여 value를 가져올 수 있습니다.
ModelAttribute
// POST http://localhost:8080/hello/request/form/model
// Header
// Content type: application/x-www-form-urlencoded
// Body
// name=Robbie&age=95
@PostMapping("/form/model")
@ResponseBody
public String helloRequestBodyForm(@ModelAttribute Star star) {
return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age);
}
@ModelAttribute 어노테이션을 사용하면, Post요청으로 넘어온 Body 부분의 데이터 들을
미리 선언해 둔 Star와 같은 객체로 매핑하여 가져올 수 있습니다, 당연히 그렇게 넘어온 데이터들은 객체처럼
사용이 가능합니다.
또한 request의 body 부분에 Query형식으로 넘어오는게 아니라
Json 형식으로 넘어오는 경우도 처리해야 하는데
Json to Object로 처리해야하므로 이를 Spring에게 명시해 줘야 한다.
// POST http://localhost:8080/hello/request/form/json
// Header
// Content type: application/json
// Body
// {"name":"Robbie","age":"95"}
@PostMapping("/form/json")
@ResponseBody
public String helloPostRequestJson(@RequestBody Star star) {
return String.format("Hello, @RequestBody.<br> (name = %s, age = %d) ", star.name, star.age);
}
@RequestBody 어노테이션을 붙여줘서 Spring에게 message body에 Json형식으로 데이터가 들어온 것을 Java 객체 형식으로 변환해달라고 할 수 있습니다.
사용자로부터 받은 입력정보를 가진 DTO 클래스를 Entity객체인 VO 클래스로 변환하여 처리하는 과정에서
이렇게 쓸 수도 있었구나 하는 부분이 있었다.
@RestController
@RequestMapping("/api")
public class MemoController {
//HTTP Body에 Json형태로 데이터가 넘어온다 :
@PostMapping("/memos")
public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto){
//RequestDto -> Entity
Memo memo = new Memo(requestDto);
}
}
//memo.java
@Getter
@Setter
@NoArgsConstructor
public class Memo {
private Long id;
private String username;
private String contents;
public Memo(MemoRequestDto requestDto) {
}
}
동작 흐름 -> 사용자 입력으로 받은 정보를 POST로 전달받는다 -> 전달받은 정보들은 Http body에 Json형식으로 되어있기 때문에 Java에서 사용하기 위해서는 클래스로 변경해야하한다 -> @RequestBody 어노테이션을 부여하여
Spring에게 MemoRequestDto 클래스의 객체로 Json 데이터를 변환하라고 해준다.
-> 객체로 변환된 입력 데이터를 VO객체(Memo) 클래스의 객체 생성자에 그대로 대입하여 변환.
DTO 클래스 자체를 생성자에 전달하여 사용이 가능하다면 이전에 진행했던 프로젝트에서 점수가 들어왔을 때
등급을 자동으로 부여해주는 부분에서 코드가 더 깔끔할 수 있었을 것 같다.
'부트캠프 > TIL' 카테고리의 다른 글
[부트캠프] TIL - IoC Container, Bean (1) | 2024.08.19 |
---|---|
[부트캠프] TIL - JPA (0) | 2024.08.16 |
[부트캠프] TIL - 정적페이지와 동적페이지 (0) | 2024.08.14 |
[부트캠프] TIL - @RequestMapping, @ResponseBody, @RequestBody (0) | 2024.08.12 |
[부트캠프] TIL - Gradle,Maven (0) | 2024.08.09 |