본문 바로가기
개발/JAVA

[Mybatis] 동적쿼리를 어떻게 만들까?

by 상용최 2020. 12. 31.
반응형

동적쿼리를 어떻게 판단할까?에 이은 동적쿼리를 어떻게 생성하는지를 알아보겠습니다.

어떻게 판단하는지는 아래 게시물에 나와있으니 참고 부탁드립니다.

csy7792.tistory.com/307

 

[Mybatis] Mybatis는 어떻게 동적쿼리인지 판단할까?

Mybatis는 동적쿼리를 작성할 수 있는 기능을 제공한다. 어떠한 원리로 동적쿼리인지 아닌지 판단하는건지 궁금해서 Mybatis 소스를 분석해보았다. Mapper 등록과정은 아래에서 보실 수 있습니다. csy7

csy7792.tistory.com

 

아래와 같은 동적쿼리가 있을 때 어떻게 동작하는지 알아보도록 하겠습니다.

   <select id="selectTest" parameterType="java.util.Map" resultType="hashmap">
        select
            id, col1, col2, col3
        from dynamic_query
        <where>
            <if test="test1 != null">
            col1=#{test1}
            </if>
            <if test="test2 != null">
            AND col2=#{test2}
            </if>
            <if test="test3 != null">
            AND col3=#{test3}
            </if>
        </where>
    </select>

 

1. select

첫번째로는 쿼리를 실행한다고 알려줍니다.

2. DefaultSqlSession.selectList

현재 실핼하려고 하는 쿼리의 정보를 가져와서 MappedStatement 변수에 담아줍니다.

그리고 현재 등록되어있는 executor 객체의 query 메소드를 실행합니다.

3. BaseExecutor.query

query 메소드안에서 MappedStatement객체의 getBoundSql 메소드를 실행합니다.

4. MappedStatement.getBoundSql

getBoundSql 메소드안에서 현재 등록되어있는 SqlSource의 getBoundSql 메소드를 실행합니다.

이 때 SqlSource는 동적쿼리라면 DynamicSqlSource 아니라면 RawSqlSource를 가지게 됩니다.

5. DynamicSqlSource.getBoundSql

SqlNode의 apply 메소드를 실행합니다.

이때 MixedSqlNode 객체의 apply가 실행됩니다.

6. MixedSqlNode.apply

현재 가지고 있는 SqlNode들의 apply를 실행합니다.

동적쿼리라면 IfSqlNode 객체를 가지고 있을겁니다.

IfSqlNode.apply를 실행합니다.

7. IfSqlNode.apply

이 부분이 핵심로직입니다.

sql에서 test안에 넣었던 조건이 일치하면 추가하고 true를 리턴하고 일치하지않으면 아무것도 추가하지 않은채 false를 리턴합니다.

 

지금까지 동적쿼리를 어떻게 만드는지 알아보았습니다.

반응형

댓글