본문 바로가기
프로그래밍 언어/Etc

[스프링] Spring 프레임워크에서 @RequestBody 사용해서 vo를 따로 만들지 않고 Map으로 파라미터 값 자동 매핑(mapping)하기

by 우림 2018. 4. 27.

Spring 프레임웍을 사용하면 보통 vo를 하나 만들어서 자동 매핑을 시킵니다.

스프링 이전의 자바를 사용했던 분들이라면 이 자동매핑 기능이 정말 편리하거든요.

그치만, 이 vo를 만드는 것도 귀찮아서 어떤 프로젝트에서는 vo를 만들지 않고 Map으로 모든 값들을 주고 받더라고요.


그렇다면,,,

어떻게 vo를 만들지 않고 Map으로 값을 받을 수 있을까요?

먼저, jsp 파일에서 자바스크립트, 정확하게는 jquery의 ajax로 값을 저장하는 부분을 구현한다고 해 보겠습니다.


add.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$.ajax({
    type       : 'POST',
    async      : false,
    contentType: 'application/json',
    data        : JSON.stringify($('form[name="codeForm"]').serializeComponent()),
    dataType   : 'json',
    url        : 'saveCode.do',
    error      : function(json){
        alert('저장중 오류가 발생하였습니다');
    },
    success    : function(data){
        if(data.resultFg == "SS" ) {
            alert('저장 하였습니다.');
            window.parent.opener.searchMain();
            self.close();                    
        } else if (data.resultFg == "DU" ){
            alert('메인코드명이 중복 되었습니다.');
            return;
        } else {
            alert('저장중 오류가 발생 하였습니다.');
            return;
        }
    }
});
cs


위 소스에서 saveCode.do라는 url을 호출하면서

data 값을 JSON으로 넘기고 있는 걸 알 수 있습니다.


1
contentType: 'application/json',
cs

이 부분은 꼭 넣어주어야 합니다.

안 그러면 에러가 발생한답니다.


1
data : JSON.stringify($('form[name="codeForm"]').serializeComponent())
cs

이 부분은 codeForm 안에 있는 값들을 JSON으로 변환해서 넘겨주도록 하는 부분이랍니다.


1
data : {"code":"BLUE","codeNm":"하늘색","codeDiv":"COLOR"}
cs

alert로 data 값을 확인해보시면 알겠지만 이런식으로 값이 넘어가게 됩니다.


CodeController.java

1
2
3
4
5
6
@Transactional
@RequestMapping("/saveCode.do")
public @ResponseBody  Map<String , Object> saveCode(@RequestBody Map<String, Object> param) {
    String code = (String) param.get("code");
    String upCode = (String) param.get("upCode");
}
cs


Controller는 이런식으로 구현하면 됩니다만 반드시 아래처럼 @RequestBody를 Map 앞에 추가해 주어야 한답니다.

그래야 넘어온 json 값들이 param변수에 key, value값들이 잘 매핑이 됩니다.

1
@RequestBody Map<String, Object> param
cs


값을 param에서 꺼낼 때는 잘 아시다시피 아래와 같이 하시면 됩니다^^

1
String code = (String) param.get("code");
cs


자, 이제 귀찮게 vo 파일 안 만들고 Map으로 자동매핑하도록 구현을 해볼까요?

vo 파일이 없으므로 DB에서 값을 가져올 때도 Map을 사용하시면 됩니다^^



댓글