기존 iBatis를 사용하는 전자정부프레임워크를 myBatis로 컨버팅중에 나온 오류.


returnType="egovMap" 로 선언된 부분에서 Data가 있음에도 불구하고 리턴되지 않아 한참을 고생.


<typeAlias  alias="egovMap" type="egovframework.rte.psl.dataaccess.util.EgovMap"/>


<select id="BBSManageDAO.selectList" returnType="egovMap">

...

</select>


iBatis에서는 정상으로 작동하지만 myBatis에서는 정상작동하지 않습니다.

원인은 myBatis에 추가되는 option설정때문인데요....(iBatis에서는 이 설정이 없는듯 합니다.)


sqlMapConfig.xml 에 다음과 같이 추가합니다.

<configuration>

    <typealias .../>


    <settings>

        <setting name="mapUnderscoreToCamelCase" value="true"/> <== default는 false 임

<setting name="jdbcTypeForNull" value="NULL"/> <== NULL 처리를 위해 NVL, IFNULL 등을 하지 않아도 됨

    </settings>


</configuration>


myBatis에는 의외로 많은 설정들이 존재합니다.  

바꿔말하면 아래의 다양한 옵션들을 환경하에서 개발하다가 Default로 설정된 환경에서 변경할 경우 이전에 잘 돌아가던 코드가 제대로 작동을 하지 않는 경우가 발생할텐데, 이러한 설정의 차이를 인지하지 못할 경우 낭패(엄청난 삽질)를 당할수 있다는 것입니다. 

꼼꼼히 보고 체크해야 할듯 합니다.


아래는 링크는 mybatis공식페이지에 정의된 매퍼설정내용들입니다.


http://www.mybatis.org/mybatis-3/ko/configuration.html

.




myBatis 1:N 의 결과를 select 하기

Posted 2013. 12. 9. 02:28

이전 iBatis에서의 방법과는 많이 달라진 myBatis의 모습. 그중에서 적응이 쉽지 않았던 것 중에 one to many 즉, 1:N  데이터의 처리였다.

iBatis에서의 처리방법(여러개의 테이블을 조인한 결과는 어디에 담지?) 은 N+1 의 문제를 않고 있었던 내용이었다.

 

myBatis로 넘어오면서 이부분에 대한 고민의 흔적이 있었던것 같다.

myBatis에서의 on to many는  collection을 이용하는 방법이다.

 

예제를 통해 알아보자. myBatis 공식사이트에서 언급하고 있는 블로그 관련 예제이다.

 

우선 블로그글 한개당 여러개의 태그가 나온다고 한다면 이전 iBatis에서는

 

select

blog_id,

blog_title,

(select post_id, subject from post  where blog_id = a.blog_id) as post_list

from blog a

 

와 같은 형태의 쿼리를 실행해야만 했다. 당연히 성능면에서 문제가 되는 쿼리다.

 

myBatis에서 이를 사용하려면 아우터 조인을 이용한 해결방법이다.

공식사이트를 보면서 제일 헤맸던 부분이 키에 대한 처리였다. 즉 <id property"" column=""/> 부분이다.

 

이전 iBatis에서의 기억때문에 더 헷갈렸는지도 모른다.

 

Class Blog {

 

   private List<Post> postList;

   public List<Post> getPostList(){...}

 

   public void setPostList(....){}

}

 

Class Post{

  private int blog_id;

  private int post_id;

}

 

 

<select id="selectBlog" parameterType="int" resultMap="blogResult">
  select
  B.blog_id ,
  B.title as blog_title,
  P.post_id,
  P.subject as post_subject,
  P.body as post_body,
  from Blog B
  left outer join Post P on B.blog_id = P.blog_id
  where B.blog_id = #{id}
</select>

 

 

<resultMap id="blogResult" type="Blog">
  <id property="id" column="blog_id" />
  <result property="title" column="blog_title"/>
  <collection property="posts" ofType="Post">
    <id property="id" column="post_id"/>
    <result property="subject" column="post_subject"/>
    <result property="body" column="post_body"/>
  </collection>
</resultMap>

post_id를 기준으로 한 subQuery의 결과를 리턴하기 때문에 이전 iBatis의 기억 때문에 post_id 대신에 blog_id를 넣고 한참이나 해멨었다. 계속 결과값이 1개만 나와서...

 

 

자세한 참고사항은 아래를 참고하자.

http://mybatis.github.io/mybatis-3/ko/sqlmap-xml.html

 

 

 

 

 

 

 

 

 

 



nested exception is org.apache.ibatis.builder.BuilderException: Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}

 

myBatis를 사용하다보면 이러한 오류를 한두번쯤은 만나게 될 것입니다.

개발자들이 가장 찾기 어렵다는 오타에 의한 오류입니다.

 

#{parameter}  를 표현하는데, 오타에 의해 Brace({,}, 중괄호) 가 아닌 괄호 ()를 사용하거나 할 경우에 발생합니다.

 

즉 Improper, 부적절한 포맷을 사용했다는 표현입니다. 처음엔 저 단어의 의미를 대충 해석해서 버그를 찾는데 애를 먹었던 기억이 있습니다.

 

정말 코드상에서 중괄호(brace)와 괄호를 구분하기 쉽지 않네요.

 

 



« PREV : 1 : 2 : 3 : 4 : 5 : ··· : 7 : NEXT »