본문 바로가기
Mybatis

[Mybatis] parameterType이 중요한 이유 (오류해결)

by ungyuun 2023. 9. 14.

Ajax에서 controller에게 form데이터를 전송하고, 해당 map 타입을 받았다.

$.ajax({
        url: "/comment/addComment",
        type: "POST",
        contentType: "application/json",
        data: JSON.stringify({
            commentContent: $('textarea[name="commentContent"]').val(),
            password: $('input[name="password"]').val(),
            prodNo: ${product.prodNo},
            postNo: $('input[name="postNo"]').val()
        }),
        success: function (comments) {
            console.log(comments);
        },
    });

 

컨트롤러에서 @RequestBody(Map<String,Object>  requestMap)으로 JSON을 받아서 

Mybatis에 map을 파라미터로, 댓글을 삽입하고, 시퀀스로 저장한 해당 댓글의 넘버를 리턴받으려고 했다.

<insert id="addComment" parameterType="map">
    INSERT INTO COMMENTS (COMMENT_NO, USER_ID, COMMENT_CONTENT, PASSWORD, PROD_NO, REG_DATE)
    VALUES (SEQ_COMMENT_NO.nextval, #{userId}, #{commentContent}, #{password}, #{prodNo}, CURRENT_TIMESTAMP)
    <selectKey keyProperty="commentNo" resultType="Integer" order="AFTER">
        SELECT SEQ_COMMENT_NO.currval AS commentNo FROM dual
    </selectKey>
</insert>

 

그러나 쿼리 실행후, comment.commentNo을 디버깅한 결과, 0으로 고정되어 나오는 것이다. 

 

Mybatis docs에서 인용하였다.

<insert id="insertUser" parameterType="User">
  insert into users (id, username, password)
  values (#{id}, #{username}, #{password})
</insert>

 

User타입의 파라미터 객체가 구문으로 전달되면 User 객체의 idusernamepassword 필드를  구문의 #{} 플레이스홀더에 대응하여 데이터베이스에 삽입한다. 그후 리턴값은 parameterType에 넘겨준 객체에 넘어간다. 결국 <insert> 구문이 실행된 뒤 User 객체에는 데이터베이스에 삽입한 데이터와 동일한 값들이 세팅된다.



이전에 나는 map타입으로 파라미터를 줬기때문에 근본적으로 Comment객체에 리턴값을 넘길수 없었던것이다.

도메인 네임과 같게 parameterType= comment로 문제를 해결했다.

 

 


참고자료_ Property 파트

https://mybatis.org/mybatis-3/ko/sqlmap-xml.html

 

MyBatis – 마이바티스 3 | 매퍼 XML 파일

Mapper XML 파일 마이바티스의 가장 큰 장점은 매핑구문이다. 이건 간혹 마법을 부리는 것처럼 보일 수 있다. SQL Map XML 파일은 상대적으로 간단하다. 더군다나 동일한 기능의 JDBC 코드와 비교하면

mybatis.org