TIL

TIL 241102

muerha 2024. 11. 2. 21:04

 

 

Spring 기초 5주차

 


 

 

 

@RequestParam

URL에서 파라미터 값과 이름을 함께 전달하는 방식

GET 방식의 통신을 할 때 많이 사용

 

?뒤에 오는 URL을 Query String, Query Parameter, Request Param이라 한다.

@Slf4j
@Controller
public class RequestParamControllerV2 {

	@ResponseBody
	@GetMapping("/v1/request-param")
	public String requestParamV1 (
					@RequestParam("name") String userName,
					@RequestParam("age") int userAge													
	) {
		// logic
		log.info("name={}", userName);
    log.info("age={}", userAge);
		return "success";
	}
    
}
  1. @Controller + @ResponseBody
    • View를 찾는 것이 아니라 ResponseBody에 응답을 작성한다(=@RestController)
  2. @RequestParam
    • 파라미터 이름으로 바인딩한다.
  3. @RequestParam(”속성값”)
    • 속성값이 파라미터 이름으로 매핑된다.

\

 

@RequestParam 사용법

 

속성값과 변수명이 같으면 생략이 가능하다.

ex) @RequestParam("name") String name

@RequestParam String name,
@RequestParam int age

 

 

@RequestParam(어노테이션) 은 생략이 가능하지만 @RequestParam(required=false) 필수 여부 속성이 default로 설정된다. 요청 파라미터와 이름이 완전히 같아야 하고 또 단순 타입(int, String, Integer 등)이어야 생략 가능하다.

협업시 혼동을 줄 수 있기 때문에 이 방식을 권장은 하지 않고 최소 @RequestParam String name 속성 값 생략 형태를 쓰면 된다. 

 

 

 

required 속성 설정

 

  • 파라미터의 필수 값을 설정
  • API 스펙을 규정할 때 사용
  • @RequestParam을 사용하면 기본 Default값은 True
  • default 속성 적용
    - defaultValue 속성을 설정하게 되면 “” 빈 문자열의 경우에도 기본 값이 설정된다.
  • Map 사용

 

 

@ModelAttribute

 

요청 파라미터를 받아 필요한 Object로 바인딩 해준다.

주로 HTML 폼에서 전송된 데이터를 바인딩하고 HTTP Method POST인 경우 사용된다.

 

@Data @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructer를 자동으로 설정해주는 역할. 테스트 용도로만 사용하고 실무에서는 잘 사용하지 않음

 

 

// 기존 코드
@Data
public class Tutor {

	private String name;
	private int age;

}

@Controller
public class ModelAttributeController {

	@ResponseBody
  @PostMapping("/v1/tutor")
  public String requestParamV1(
          @RequestParam String name,
          @RequestParam int age
  ) {
      Tutor tutor = new Tutor();
      tutor.setName(name);
      tutor.setAge(age);

      return "tutor name = " + name + " age = " + age;
  }

}

 

@RequestParam 의 Mapping을 사용하게 되면 위와 같은 객체를 생성하는 코드가 포함되는데, @ModelAttribute 는 해당 과정을 자동화 한다.

// @ModelAttribute 적용
@ResponseBody
@PostMapping("/v2/tutor")
public String modelAttributeV2(
		@ModelAttribute Tutor tutor													
) {
		
	String name = tutor.getName();
	int age = tutor.getAge();

	return "tutor name = " + name + " age = " + age;
}

 

 

@ModelAttirubte 동작 순서

  1. 파라미터에 @ModelAttribute가 있으면 파라미터인 Tutor 객체를 생성한다.
  2. 요청 파라미터 이름으로 객체 필드의 Setter를 호출해서 바인딩한다.
    • 파라미터 이름이 name 이면 setName(value); 메서드를 호출한다.
    • 파라미터 이름과 필드 이름이 반드시 같아야 한다.

 


 

 

@RequestParam, @ModelAttribute는 GET + Query Parameter와, POST HTML Form Data를 바인딩하는 방법 

 

 

HttpEntity

HTTP Header, Body 정보를 편리하게 조회할 수 있도록 만들어줌

HttpEntity를 사용하면 HttpMessageConverter를 사용한다.

 

HttpMessageConverter

JSON 데이터와같은 것들을 Java에서 쉽게 접근해서 사용할 수 있도록 Object로 만들어주는 역할

 

 

@RequestBody, @ResponseBody

각각 Request, Response 객체의 Body에 편하게 접근하여 사용할 수 있다.

 

 

@RequestBody

  • 요청 메세지 Body Data를 쉽게 조회할 수 있다.

@RequestHeader

  • 요청 헤더 정보 조회

@ResponseBody

  • 응답 메세지 바디에 값을 쉽게 담아서 전달할 수 있도록 해준다.
  • View가 아닌 데이터를 반환한다.

 

 

요청 파라미터, HTML Form Data에 접근하는 경우 ▶ @RequestParam, @ModelAttribute 사용

Http Message Body에 접근하는 경우 ▶ @RequestBody 사용 (JSON, XML, TEXT)

 

 

 

JSON

 

@RequestBody 어노테이션을 사용하면 Object를 Mapping할 수 있다.

 

HttpEntity<>, @RequestBody를 사용하면 HTTPMessageConverter가 Request Body의 Data를 개발자가 원하는 String이나 Object로 변환해준다.

 

HTTP Message Converter가 ObjectMapper를 대신 실행한다.

 

 

 

 

  • 요청 데이터는 @RequestBody를 사용해서 바인딩
  • @RequestBody 는 생략 불가능 ▶ @ModelAttribute가 적용되기 때문
  • HttpMessageConverter 가 요청 응답 데이터를 모두 변환할 수 있다.
    • JSON은 MappingJackson2HttpMessageConverter 를 사용한다.
    • Request Header의 Content-Type은 application/json 이어야 한다.
      • Header로 어떤 Converter가 동작할지 판별한다.

 

 

 

HTTPMessageConverter

HTTP 요청과 응답을 변환하는 인터페이스

클라이언트와 서버 간에 데이터를 주고받을 때 요청 데이터를 자바 객체로 변환하거나 자바 객체를 응답 본문으로 변환하는 역할

 

MappingJackson2HttpMessageConverter는 JSON을 처리하는 대표적인 HTTPMessageConverter의 구현체이다.

 

 

  • @RequestBody
    • 요청 데이터 + Request Header를 참고하여 Object로 변환
  • @ResponseBody
    • 응답 데이터 + Accept Header를 참고하여 원하는 데이터 형식으로 변환

'TIL' 카테고리의 다른 글

TIL 241105  (0) 2024.11.05
TIL 241104  (0) 2024.11.04
TIL 241101  (0) 2024.11.01
TIL 241031  (0) 2024.10.31
TIL 241030  (1) 2024.10.30