Back-End

[ERROR Solution] Rest API 활용 중 생긴 에러(MissingServletRequestParameterException)

Miiko 2021. 10. 30. 23:48

MissingServletRequestParameterException: Required String parameter 'pName' is not present

 

 

ajax를 활용하여 form데이터를 DB에 저장하는 데 생긴 문제이다.

 

 

 | DB(데이터 구조)

우선 DB에 product라는 테이블이 있다.

 

 

사진과 같이 4개의 컬럼이 있다. 하지만 no(primary key)는 auto_increment로 데이터가 insert 될 때마다 자동으로 다음 값이 들어간다. 

 

 

 

 

위의 이유로 화면의 form 양식에서는 pName, pPrice, pDesc 만을 입력받는다.

 

@PostMapping("/")
	public Map<String, Object> insert(@RequestBody Product product) {
		Map<String, Object> resultMap = new HashMap<>();
		System.out.println(product);
		int result = service.insert(product);
		if (result == 1) {
			resultMap.put("success", true);
			resultMap.put("data", product);
		} else {
			resultMap.put("success", false);
		}
		return resultMap;
	}

 

따라서 이 코드처럼 product로 파라미터를 받아버리면 변수들에 값이 매핑이 안된다😢

 

 

 

| 1번 방법 (@RequestBody String obj) 

 

String 으로 받은 obj를 출력해보면

{"pName":"무선충전기","pPrice":"50000","pDesc":"고속무선충전기"}

잘 들어온다.

 

 

하지만,

문자열을 조작해서 Product 컬럼 하나씩 데이터를 넣고싶지는 않았기 때문에 2번으로 간다.

 

 

 

| 2번 방법 (@RequestBody HashMap<String, Object> map)

 

map으로 데이터를 받으면 String으로 받는 것과 같이 잘 들어오고,

Product 객체 만들어서 하나씩 값을 꺼내 product에 넣어주었다. 

 

String pName = map.get("pName").toString();
int pPrice = Integer.parseInt(map.get("pPrice").toString()); 
String pDesc = map.get("pDesc").toString();
Product product = new Product(pName,pPrice,pDesc);

 

 

이제 map + 하나씩 값 넣어주기 보다 더 효율적인 방법을 찾아봐야겠다.