Spring Boot Request Data (Parameter)

devyunie·2024년 8월 22일

SpringBoot

목록 보기
5/13
post-thumbnail

Request DataController (Parameter)

@RequestParam()

  • GET, DELETE 처럼 Request Body가 존재하지 않고 URL로 데이터를 전송하는 메서드에서
  • Query String 방식으로 데이터를 가져오기 위해 사용하는 어노테이션
URL 진입 순서
@RestController
@RequestMapping("/request-data")
public class RequestDataController {

	@GetMapping("/request-param")
	public String requestParam (
		//@RequestParam(name="name") String name,
        @RequestParam("name") String name,
		@RequestParam(name="age") int age
	){
		return "이름: " + name + "나이: " + age;
	}
}

Result

Error 500번 오류

@RequestParam(name="age" , required=false) int age

required=false = false

  • 필수로 받지 않아도 된다
  • 기본값으로 NULL 값을 전달 해준다.
  • age 는 int 자료형이므로 NULL을 받을수 없다.
@RequestParam(name="age" , required=false) Integer age
  • age를 int형이 아닌 Integer 데이터타입으로 지정

(name = "name") 생략하기

@RequestParam() String name,
  • name 값을 전달 받는다.

@PathVariable()

  • 모든 HTTP 메서드에서 URL의 특정 패턴에 따라 데이터를 추출
  1. 1개를 받을때
@GetMapping("/path-variable/{var}")
public String pathVariable(
	@PathVariable(name="var") String var
){
	return "읽은 경로 변수 : " + var;`
}
  1. 2개 이상을 받을때
@GetMapping("/path-variable/{var}/{str}")
public String pathVariable(
	@PathVariable(name="var") String var,
	@PathVariable("str") String str
){
	return "읽은 경로 변수 : " + var + " , " + str;
}
  • 1,2번 종합 결과

    ⚠️주의
    @PathVariable(name="str", required=false) String str
    구문에서 우리의 생각으로는 required=false가 붙어서 필수 조건은 아니다 생각하지만
    @GetMapping("/path-variable/{var}/{str}")
    패턴이 일치 하지 않기 위해 404 Error 발생

  • 해결방법

@GetMapping({
	"/path-variable/{var}/{str}",
	"/patg-variable/{var}/",
	"/patg-variable/{var}"
})

모든 경로의 경우의 수를 입력하여 패턴의 경우의수를 증가시켜 패턴일치를 유발시킨다.

⚠️ 주의

  • 경로 변수를 사용하여 URL 패턴을 작성할 때
  • 겹치는 패턴이 존재하는지 잘 확인 해야함
  • 읽은 경로 변수 : other, null을 결과로 받고 싶은데 other 메서드 호출 이라는 결과를 반환 받음

Error Ex1

패턴에 따라 원치 않는 결과값을 출력

@GetMapping("/path-variable/other")
	public String otherPathVariable(){
	return "other 메서드 호출";
}

Error Ex2

GET http://localhost:4000/request-data/path-variable/another/another
.../another/another PathVariable에서 어떤걸 호출 해야할지 모르기에 충돌이 발생
Error 500

@GetMapping("/path-variable/{var}/another")
public String anotherPathVariable1 (
	@PathVariable("var") String var
) {
	return "another1 메서드 호출";
}

@GetMapping("/path-variable/another{var}")
	public String anotherPathVariable2 (
@PathVariable("var") String var
) {
	return "another2 메서드 호출";
}
  • 실행

@RequestBody()

  • POST, PUT, PATCH 처럼 Request Body로 데이터를 전송하는 메서드에서 데이터를 읽기 위한 방법
  • request body 를 통해 text 전송
@PostMapping("/request-body")
public String requestBody(
	@RequestBody String requestBody
){
	return "request body data: " + requestBody;
}

  • 객체를 전달하는 방법 (DTO)
@PostMapping("/request-body")
public String requestBody(
// @RequestBody String requestBody
	@RequestBody SampleDto requestBody
	) {
	return "Request Body data : " + requestBody.getName() + ", " + requestBody.getAge();
}
  • DTO (2가지 방법)
//1. 직접 생성
class SampleDto{
	//필드
	private String name;
	private int age;
	
	//생성자
	public SampleDto(){};
	public SampleDto(String name, int age){
		this.name = name;
		this.age = age;
	}
	
	//setter
	public void setName(String name){
		this.name = name;
	}
	public void setAge(int age){
		this.age = age;
	}
	
	//getter
	public String getName(){
		return this.name;
	}
	public int getAge(){
		return this.age;
	}
}

//2. lombok으로 정리
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
class SampleDto {
	private String name;
	private int age;
}

0개의 댓글