일단 결론부터 말하면 하루종일 머리 쥐어뜯다가 성공하긴했다! 너무 신나서 눈물 쪼끔 남...
이걸 ... 어떻게 말로 잘 풀어서 설명하지... 우선 내가 구현해야 하는 건 게시글에 유저 정보가 여러 개 달린 형태다.
예를 들어 게시글 하나를 작성했을때, 해당 게시글에 참조 유저를 n명 추가해서 게시글 업로드를 해야 함.
(업무하다 깨닫게 된 내용을 각색해서 쓰는 중이라 나오는 모든 변수명과 값은 허구임)
처음에는 ajax를 하려다가... form으로 전송해서 vo객체로 자동매핑되는걸 받는게 훨씬 수월할 것 같았고, form으로 작성해서 컨트롤러단으로 보내는데... 중간에 문제가 많았다... 나는 vo 자동매핑만 믿고 계속 보냈는데 계속 알 수 없는 에러가 나서 ㅠ_ㅠ 심지어 개발환경이 에러페이지는 자동으로 에러화면으로 넘어가고 에러가 보이지 않는 상황이라... (이거부터 고치고 싶은데 그럴 시간이 없어서 너무 막무가내식으로 개발하고 있다는 생각 지울수가 없음)
알고보니까 spring 이랑 jsp를 form으로 오갈 때, vo 객체 내부 변수의 타입이 안 맞으면 에러남(ㅋㅋ) 예를 들어 vo에 int score;라고 선언해둔걸 form input name=score의 value가 null일 경우 에러가 남. 이 당연한걸 가지고 한 3시간 동안 고생을 했다. 폼 데이터가 10개 남짓 되어서... 하나하나 전부 다 지우면서 어디서 에러가 나는지 찾아봤다. 진작 했으면 1시간안에 끝났을텐데 전혀 다른곳에서 원인을 찾고 있어서 안 됐던 거였음.
어쨌든 위와 같은 문제를 해결하고 난 후, 객체 리스트를 받아오기 위해 vo에는 List<userVO> userList; 라고 선언해두고 jsp단에서는 유저 리스트가 추가될 때 마다 userList=[]에 user={"name":name, "score":score}를 append를 해줬다. 그리고 form을 submit 하기 전에 input name userList value에다가 userList를 집어넣은다음 전송을 했는데? 에러가? 쨘!
처음에는 vo 내부 변수명에 오타가 있다거나, parameter로 vo를 받아올 수 없는 상태인 줄 알고 코드 하나하나 뜯어보며 문자맞추기를 했는데 안 되길래 구글링을 조금 해보니까, 객체 리스트 List<uservo> 같은 형태를 저런식으로 보낼 수 없다고 한다. 그래서 몇 가지를 시도해봤다.
1. form 한번에 객체는 두 개가 될까 싶어서 parameter에 vo를 두 개 적음 -> 안됨
2. vo에 적어둔 객체 타입을 list가 아니라 object로 바꿔서 받아온 후 캐스팅을 시전 -> 캐스팅 불가능
3. jsp에서 보낼 때 list를 string으로 바꿔서 보낸 후 컨트롤러에서 uservo로 캐스팅 -> 캐스팅 불가능
4. jackson이나 gson을 이용하고 싶었는데 개발환경을 바꾸다가 오류가 나면 돌이킬 수 없어질 것 같아서 맘을 접음. 왜냐면 지금 업무 개발환경이 최신 스프링이 아니라 전자정부프레임워크와 스프링이 애매하게 혼합되어 만들어진 오래된... 친구라서... 버전이 맞지 않으면 오류가 나는 걸 몇번이나 겪었기 때문에 모험을 잠시 접어두고 다른 방법을 탐색함.
사실 개발이란걸 하게 되면서 세상에 안 되는건 없다 난 포기를 모르는 미친놈이지 존X 시간복잡도 안중에도 없이 더럽게라도 하면 된다<는 마인드(물론 가능한 최대한 효율적으로 설계하려고 생각함)였는데 컨디션 난조로 슬슬 지치기 시작함... 그러다가 객체를 보내는 방법을 적어둔 블로그 몇 개를 발견했다. 객체를 리스트 형태로 보내면 되는데 이게 append나 그냥 집어넣는건 안 되고 배열주소를 적어서 해주면 된다고 함.
1
|
<input name="userList" value="[ { "name" : "abemaria", "score" : "2" } , { "name" : "holymoly", "score" : "4" } ]" type="text" />
|
cs |
그러니까 위와 같은 방식은 안 되고
1
2
3
4
|
<input name="userList[0].name" value="abamaria" type="text" />
<input name="userList[0].score" value="2" type="text" />
<input name="userList[1].name" value="holymoly" type="text" />
<input name="userList[1].score" value="4" type="text" />
|
cs |
이렇게 보내야 하는 것임 !!!!!!!!
근데 여기서 문제가 발생한다. 내가 만들어야 하는 기능은, 게시글에 참조되는 유저의 수가 정해져 있지 않다는 것...
심지어 유저 정보를 팝업창에서 검색한 다음 추가되는 형식인지라 여기서 잠깐 아찔해졌는데 이내 방법을 찾았다. 애초에 게시글을 작성하면서 참조하는 유저 정보가 수정이 가능해야 했기 때문에 유저 정보를 가진 전역변수 리스트를 선언해두고 있었는데 폼에 전송하기 전에 해당 리스트를 포문돌려서 form에 appendChild 해주면 됨.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//request_list 객체가 날아가지 않아서 포문을 돌림
for(var i=0; i < userAllList.length; i++){
var userName = document.createElement('input');
var userScore = document.createElement('input');
// make name input
request_mem_id.setAttribute("type", "hidden");
request_mem_id.setAttribute("name", "userList["+i+"].userName");
request_mem_id.setAttribute("value", userAllList[i].userName );
// make score input
request_reason.setAttribute("type", "hidden");
request_reason.setAttribute("name", "userList["+i+"].userScore ");
request_reason.setAttribute("value", userAllList[i].userScore );
// add to form
coop_frm.appendChild(userName);
coop_frm.appendChild(userScore);
}
|
cs |
이렇게 하면 form에 유저 리스트가 생성되어서 컨트롤러단으로 예쁜 객체리스트가 전송된다.
혹시나 틀린 게 있다면 지적 언제든지 환영합니다.
끝.
'개발공부 > 개발하다_발견함' 카테고리의 다른 글
javascript a태그에서 this.id를 사용하고 싶을때는 onclick을 이용합시다! (0) | 2022.04.07 |
---|---|
Javascript로 새 Element를 생성했을때 form에 직접 붙이지 않고 form 내부의 요소에 붙이게 될 경우 form 전송이 되지 않는다. (0) | 2022.04.06 |
ajax가 제대로 동작하지 않아서 오만짓을 다 했는데 기존 코드를 뜯어보다 발견한 방법이 있어서 백업했더니 아니었고, 재시도하다가 결국엔 방법을 찾아냄 (0) | 2022.03.29 |
Unknown system variable 'tx_isolation' (0) | 2022.03.25 |
Mixed Content: This request has been blocked; (0) | 2022.03.18 |
댓글