본문 바로가기

개발일지/TIL

[230624] 네트워크와 Java Spring 기본 개념 이해하기 (2)

Controller Annotation

1. PathVariable

👉  클라이언트가 URL 경로에 포함시켜 보낸 데이터를 받아올 수 있는 Annotation

 

👀 Client - Server  예시

 

[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)

 

 

2. RequestParam

👉  클라이언트가 Query로 보낸 데이터를 받아올 수 있는 Annotation

 

👀 Client - Server  예시

 

[GET] http://localhost:8080/hello/request/form/param?name=Robbie&age=95

 

@GetMapping("/form/param")
@ResponseBody
public String helloGetRequestParam(@RequestParam String name, 
                                   @RequestParam(required = false)  Integer age)

 

👀 코드로 테스트해 본 것

✅ RequestParam은 생략이 가능하다.
      ➡ 요청 데이터가 Simple Value Type(Primitive, WrapperClass 등) 일 경우 자바 스프링에서 자동 매핑 [예외 존재]
✅ "required" 옵션이 false인 경우 null 값을 할당한다.
      ➡ 요청에서 값이 없는 데이터가 Primitive Type인 경우 null값을 할당할 수 없기에 에러 발생

 

👀 궁금한 것

❓PathVariable과 ReqeustParam은 언제 사용하는 것이 좋은가
✅ RequestParam 사용 유형
     ➡ Retrieving query parameters
     ➡ Retrieving form data
     ➡ Retrieving request headers 💢 글 잘못된 정보, 테스트 해보니 안됨 [ 대체제 @RequestHeader ]

✅ PathVariable 사용 유형
     ➡ Capturing resource IDs
     ➡ Capturing slugs or friendly URLs
     ➡ Capturing version numbers or other dynamic parts
 

Difference between @RequestParam and @PathVariable in Spring MVC?

How to choose between the @RequestParam and @PathVariable in Spring MVC

medium.com

 

3. ModelAttribute

👉 클라이언트가 Query로 보낸 데이터를 객체로 받아올 수 있는 Annotation

 

👀 Client - Server  예시

 

[GET] http://localhost:8080/hello/request/form/param/model?name=Robbie&age=95

 

@GetMapping("/form/param/model")
@ResponseBody
public String helloRequestParam(@ModelAttribute Star star)

 

👀 코드로 테스트해본 것

✅ ModelAttribute는 생략이 가능하다.
     ➡ 요청 데이터가 Simple Value Type이 아닌 경우 자바 스프링에서 자동 매핑 [예외 존재]
✅ 객체에 매핑되는 데이터가 없는 경우 Reference Type에 null 할당, Primitive Type에 0 할당
✅ Constructor, Setter 둘 다 없는 경우 보낸 데이터가 할당되지 않음

 

 

4. RequestBody

👉 클라이언트가 보낸 Payload 데이터를 객체로 받아올 수 있는 Annotation

 

👀 Client - Server  예시

 

[POST] http://localhost:8080/hello/request/form/param/model
[Payload] { "name":"Robbie", "age":95 }

 

@GetMapping("/form/json")
@ResponseBody
public String helloPostRequest(@RequestBody Star star)

 

👀 코드로 테스트해본 것

✅ 객체에 매핑되는 데이터가 없는 경우 Reference Type에 null 할당, Primitive Type에 0 할당
✅ 의외로 Constructor, Setter가 없는데도 할당이 제대로 됨

 

👀 궁금한 것

❓ModelAttribute와 RequestBody는 언제 사용하는 것이 좋은가
✅ ModelAttribute 사용 유형
     ➡ Query String 및 Form 형식으로 데이터를 받는 경우
✅ RequestBody 사용 유형
     ➡ JSON, XML 등의 형식으로 데이터를 받는 경우
 

@RequestBody vs @ModelAttribute

1. @RequestBody와 @ModelAttribute Controller.java @RequestBody와 @ModelAttribute는 클라이언트 측에서 보낸 데이터를 Java…

tecoble.techcourse.co.kr

느낀 점

그동안 Client에서 요청하는 데이터를 다룰 때 생각 없이 Annotation을 사용했다는 것을 새삼 느꼈다. 개념에 대해서 다시 한번 되새길 수 있어서 좋았다. 내용을 정리하면서 "이런 건 되나 저런 건 되나" 하는 것들을 직접 코드를 작성하고 테스트해볼 수 있어서 각 상황에서 어떻게 동작하는지 알 수 있게 되었다. 기본기라는 것이 왜 중요한지 또 느낄 수 있는 시간이었다. 계속해서 "왜?", "이건 될까?"라는 질문을 계속하면서 강의를 천천히 들어봐야겠다.