본문 바로가기
개발/JAVA

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

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

Mybatis는 동적쿼리를 작성할 수 있는 기능을 제공한다.

어떠한 원리로 동적쿼리인지 아닌지 판단하는건지 궁금해서 Mybatis 소스를 분석해보았다.

Mapper 등록과정은 아래에서 보실 수 있습니다.

csy7792.tistory.com/301

 

[Mybatis] Mapper는 어떻게 등록되는 것일까 ?

Mybatis를 처음 접하게되면 xml 또는 JAVA로 설정만 해주면 어디서든 가져다쓸 수 있다는것이 마법같이 느껴질 수 있다. 어떠한 원리로 그렇게 사용할 수 있는지 알아보도록 하겠다. MybatisConfiguration.

csy7792.tistory.com

 

지금부터는 작성한 쿼리가 동적쿼리인지 아닌지 어떻게 판단하는지 알아보겠습니다.

 

1.XMLConfigBuilder.mapperElement

등록할 때 XMLMapperBuilder 의 parse 메소드를 호출합니다.

 

2. XMLMapperBuilder.builder

이 메소드는 configurationElement 메소드를 호출합니다.

3. XMLMapperBuilder.configurationElement

이 메소드는 buildStatementFromContext 메소드를 호출합니다.

 

4. XMLMapperBuilder.buildStatementFromContext

이 메소드는 XMLStatementBuilder의 parseStatementNode 메소드를 호출합니다.

5. XMLStatementBuilder.parseStatementNode

이 메소드에서 드디어 동적쿼리인지 아닌지 판단하는 SqlSource를 생성합니다.

7. XMLLanguageDriver.createSqlSource

XMLScriptBuilder의 parseScriptNode 메소드를 통하여 SqlSource를 생성 후 반환합니다.

8. XMLScriptBuilder.parseScriptNode 

parseDynamicTags를 통해 Dynamic 인지 아닌지 판단하고 아래 if문을 이용하여 동적쿼리라면 DynamicSqlSource를 아니라면 RawSqlSource를 생성하여 반환합니다.

XMLScriptBuilder.parseDynamicTags를 보면 NodeType이 1이거나 TestSqlNode가 동적쿼리일 때 동적쿼리라고 판단하고 있습니다.

TestSqlNode가 동적쿼리일 때는 파싱하면서 판단합니다. (참고 : GenericTokenParser.parse)

반응형

댓글