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을 사용하시면 됩니다^^
댓글