Springboot Controller에 Null 질문입니다

조회수 3313회

다른 테이블인 Member와 Vote가 있습니다. DB에 등록은 되지만 아래 로그와 같이 등록이 되어버리고, 문제가 무엇인지 찾아보니 controller에 null이 발생하는 것을 알게 되었습니다. 공부 중인데 해결이 안되고 있어서 이렇게 질문 올립니다.

Controller

    @RequestMapping(value = "member/insert", method = RequestMethod.GET) 
    public String memberInsertForm() {
        return "member/memberInsert";
    }

    @RequestMapping(value = "member/insert", method = RequestMethod.POST)
    public @ResponseBody int memberInsert( Map<String, Object> dto) throws Exception{

        HashMap<String, Object> map = new HashMap<>();
        MemberDTO dto2 = new MemberDTO();
        int reVal = 0;
        reVal = memberService.memberInsert(dto);
        System.out.println("name : >>>>> " + dto2.getName());
        if (reVal > 0) {
            map.put("result", "success");
            memberService.voteInsert(map);
        } else {
            map.put("result", "failed");
        }
        return reVal;
    }

Mapper.xml

<insert id="memberInsert" parameterType="Map">
    INSERT INTO MEMBER (
              id
            , name
            , regdate
    ) VALUES (
            (SELECT NVL(MAX(id),0)+1 FROM MEMBER)
            , #{name}
            , sysdate
    )
    </insert>
    <insert id="voteInsert" parameterType="Map">
    INSERT INTO VOTE (
              vid
            , vTitle
            , vContent
            , regdate
    ) VALUES (
            (SELECT NVL(MAX(vid),0)+1 FROM VOTE)
            , #{vTitle}
            , #{vContent}
            , sysdate
    )
    </insert>

Mapper.java

    public int memberInsert(Map<String, Object> map) throws Exception;

    public int voteInsert(Map<String, Object> map) throws Exception;

Service.java

    public int memberInsert(Map<String, Object> map) throws Exception {
        return mapper.memberInsert(map);
    }

    public int voteInsert(Map<String, Object> map) throws Exception {
        return mapper.voteInsert(map);
    }

insert

function insertSubmit(){

    if(!confirm("제출하시겠습니까?")){return;}

    if(!$("#name").val()){
        alert("이름을 입력해주세요");
        return;
    }
    if(!$("#vTitle").val()){
        alert("투표제목을 입력해주세요");
        return;
    }
        $.ajax({
            type: "POST", 
            url : insertVote,
            dataType : 'json',
            contentType : "application/json;charset=UTF-8",
            cache : false,
            async: false,
            data: $("#form1").serialize(),
            success : function(result) {
                alert("success 진입");
                if(result.result == 'success'){
                    alert("제출이 완료되었습니다");
                    location.href="/member/list";
                } else {
                    alert("제출에 실패했습니다")
                }
        }
    });
}

Log

c.v.b.mapper.MemberMapper.memberInsert   : ==>  Preparing: INSERT INTO MEMBER ( id , name , regdate ) VALUES ( (SELECT NVL(MAX(id),0)+1 FROM MEMBER) , ? , sysdate ) 
DEBUG 7336 --- [p-nio-80-exec-1] c.v.b.mapper.MemberMapper.memberInsert   : ==> Parameters: null
DEBUG 7336 --- [p-nio-80-exec-1] c.v.b.mapper.MemberMapper.memberInsert   : <==    Updates: 1
name : >>>>> null
DEBUG 7336 --- [p-nio-80-exec-1] c.v.boot.mapper.MemberMapper.voteInsert  : ==>  Preparing: INSERT INTO VOTE ( vid , vTitle , vContent , regdate ) VALUES ( (SELECT NVL(MAX(vid),0)+1 FROM VOTE) , ? , ? , sysdate ) 
DEBUG 7336 --- [p-nio-80-exec-1] c.v.boot.mapper.MemberMapper.voteInsert  : ==> Parameters: null, null
DEBUG 7336 --- [p-nio-80-exec-1] c.v.boot.mapper.MemberMapper.voteInsert  : <==    Updates: 1

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • @RequestBody Map< String, Object> dto 를선언해주셔야 값을 전달받을수 있습니다.

    그래도 해결되지 않으신다면 디버깅을좀더 해보셔야할 것 같습니다.

    ajax를 전송하기 전에 $("#form1").serialize() 값이 제대로 닮겻는지 아마 console.log(json.stringify($("#form1").serialize())); 출력해보시면 될듯합니다.

    여기에 값이 제대로 닮겻다면 Controller단에서 Map dto에 값이 닮겻는지 체크해보시면 될듯합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 답변 감사합니다. 그런데 질문이 있습니다. @RequestBody를 사용하려면 ajax에서 json.stringify를 사용해야하는 것 같은데 @RequestBody를 선언해주니까 Unrecognized token '컬럼명': was expecting ('true', 'false' or 'null') 이 발생합니다. 그래서 data: JSON.stringify(form1),로 바꿔주고 실행을 해보니 MAP : {0={}, 1={}, 2={}, 3={jQuery1111007516916403027585=1}, 4={}} 과 같이 값이 있었습니다. 알 수 없는 사용자 2019.3.25 17:18
    • 음... 저도 데이터 파싱 부분에 대해선 체계적으로 적립 되어있지 않아 구체적인 답변을 드리기가 어렵네요. 이 부분은 공부하셔서 지식쌓기를 추천드립니다. 제가 아는 한도내에서 설명을 드리자면 ajax부분에서 dataType : 'json' 으로 선언하셨기 때문에 발생하는 오류일 겁니다. serialize함수를 사용하시면 name=111&vTitle=222 이런식으로 데이터가 넘어가기 때문에 json.stringify를 사용하여 json파싱이 되어 해결 되신 걸겁니다. json.stringify를 사용하지 않으시려면 dateType에서 text라든지 html이라든지 맞는형태를 찾으셔서 설정해주셔야 합니다. 알 수 없는 사용자 2019.3.25 17:38
    • 감사합니다. 그런데 Controller에 Map dto에서 dto를 찍어보니 MAP : {0={}, 1={}, 2={}, 3={jQuery1111007516916403027585=1}, 4={}} 와 같이 나옵니다. 어느 부분을 확인해야 할까요? 알 수 없는 사용자 2019.3.26 13:57
    • serializeComponent로 값을 넘기면 해결될것 같습니다. 좋은예제가 여기 있네요 https://zzznara2.tistory.com/761 알 수 없는 사용자 2019.3.26 14:03
    • .serializeComponent()가 메서드인가요? 블로그에는 해당 메서드가 안보여서요 알 수 없는 사용자 2019.3.26 14:39
    • 예. 메소드가 아니라 함수라고하는게 맞습니다. 제가 링크한 블로그 add.jsp 5번째줄에 보이네요 알 수 없는 사용자 2019.3.26 14:43
    • 내장함수라는 말씀이신지.. TypeError(...) serializeComponent is not a function 가 나타납니다.. 알 수 없는 사용자 2019.3.26 14:46
    • jquery 내장 함수인걸로 알고있습니다만 stringify대신 serializeArray를 사용하셔도 될 것같습니다. 우선 map에 데이터를 담기 위해선 서버에 넘길 데이터를 json형태로 가공해서 넘겨줘야합니다. 제가 링크해놓은 글을 보시면 data : {"code":"BLUE","codeNm":"하늘색","codeDiv":"COLOR"} 이런식으로 데이터가 가공되었는지 체크해보셔야 됩니다. 알 수 없는 사용자 2019.3.26 15:27
    • 저는 글쓴이 분의 실력이 어느정도인지 판단이 힘듭니다. 다만 제생각에 input type="text" 이부분에서 id="name"만 선언하시고 name="name" 이 부분을 빼먹으신 것 같은데요. id는 jquery에선 호출이 가능하나 서버로 넘길 form에선 name값을 읽어 서버에 보냅니다. 결론적으로 제가 일일이 하나씩 나는 오류마다 다 체크를 해드릴수가 없습니다. ajax를 이용한 mvc패턴 map에 값 넘기기 이런식으로 구글링하셔서 많은 글들을 참조해보시길 권합니다. 알 수 없는 사용자 2019.3.26 15:30

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)