파라미터 DTO를 만들어서 파라미터 여러 개를 한 번에 받기
$.ajax({
url: 'searchItem',
data: {
searchKeyword : 'hello',
dateStart : '2022-04-07',
dateEnd : '2022-04-09',
},
method: 'POST',
success: function(result) {
console.log(result);
}
});
Java Spring Framework에서 검색 기능을 구현한다고 해 보자.
쉽게 볼 수 있도록
ajax에서 controller로 보내는 파라미터 부분인
data 속성만 따로 떼어서 보자.
jQuery 객체가 들고 있는 ajax() 함수를 호출하고,
그 함수의 파라미터로 어떤 객체 하나를 넣어 준다.
ajax 함수를 부를 때 파라미터로 넣어주는 객체는
url, data, method, success 등 여러 속성들을 가지고 있다.
그 중에 data 속성에 값으로 어떤 객체를 넣어줬다.
그 객체는 여러 속성들과 그 값들을 들고 있다.
data에 넣어준 객체 안을 들여다 보자.
searchKeyword 속성과, dateStart 속성과, dateEnd 속성이 있다.
controller에서 받을 때는 어떻게 해야 할까.
하나 하나 따로 명시해 주어야 한다.
//java - controller
public String searchController(
String searchKeyword,
String dateStart,
String dateEnd) {
//do something
}
받아와야 하는 파라미터가 점점 많아질수록 보기가 불편해진다.
하나하나 지정해 줘야 하는 불편함(귀찮음)도 있다.
차라리 객체를 따로 하나 만들어 주면 좋다.
그 객체는 멤버 변수로 searchKeyword, dateStart, dateEnd 등을 갖도록 한다.
//java - 파라미터를 한 번에 받는 객체 만들기
public class SearchParamDTO {
String searchKeyword;
String dateStart;
String dateEnd;
}
여기에 getter와 setter 도 모두 만들어 둔다.
그럼 여러 파라미터들을 객체 하나로 한 번에 받을 수 있어서 편하다.
//java - 수정 전
public String searchController(
String searchKeyword,
String dateStart,
String dateEnd) {
//do something
}
//java - 수정 후
public String searchController(SearchParamDTO param) {
//do something
}
이렇게 SearchParamDTO 라는 클래스를 만들고,
이 자료형으로 받으면 파라미터 여러 개를 한 번에 받을 수 있다.
해당 클래스는 그 안에 멤버 변수를 여러 개 들고 있다.
파라미터는 멤버 변수들 중에서 이름이 같은 setter들을 자동으로 찾아서
SearchParamDTO 자료형의 param 객체 안에 넣어준다.
즉, ajax에서 searchKeyword라는 key에 value를 넣어서 보냈으면,
컨트롤러에서는 setSearchKeyword 라는 메소드를 찾아서
param.setSearchKeyword() 를 통해서 자동으로 value를 넣어준다.
> 덧붙임 : 객체 층위에 유의할 것
//javascript에서 보낼 때
let dataVal = null;
if(type == 1) {
dataVal = {
searchKeyword = $('#searchKeyword').val();
dateStart = $('#dateStart').val();
dateEnd = $('#dateEnd').val();
};
} else {
return false;
}
$.ajax({
url: 'searchList',
data: { param : dataVal }
method: 'POST',
success: function(result) {
console.log(result);
}
});
//java - controller
public String searchController(SearchParamDTO param) {
//do something
}
이렇게 되면 객체를 한 번 더 싸 버리는 게 된다.
ajax 안에 보내는 값을 아래처럼 넣으면
data: { param : dataVal }
이 값을 풀어 쓰면 아래처럼 된다.
data :
{
param :
{
searchKeyword = $('#searchKeyword').val();
dateStart = $('#dateStart').val();
dateEnd = $('#dateEnd').val();
}
}
이러면 객체를 한 번 더 싼 게 되므로
controller에서 받을 때 방법도 바뀌어야 한다.
data에 넣어줄 때 객체의 층위에 주의해야 한다.
-220407