Mybatis는 Mapper 또는 xml을 이용하여 쿼리를 작성해놓고 코드로 실행 시키기만 하면 알맞는 쿼리를 실행하도록 한다.
이번에는 어떠한 원리로 xml로 작성한 쿼리가 실행되는지 알아보도록 하겠다.
Mapper 등록 원리는 아래에서 볼 수 있습니다.
바로 시작하겠습니다
1. SqlSession.query
아래 메소드를 실행하게 된다면 현재 만들어진 Session에 알맞는객체 (대부분 DefaultSqlSession)의 method가 실행된다.
SelectOne도 결국은 selectList를 이용하여 쿼리를 날리며 size가 2이상이면 Error를 발생시킨다.
statement는 실행할 쿼리의 id이다.
2. Configuration.getMappedStatement
SqlSessionFactory를 만들면서 Query의 정보들을 Configuration.mappedStatements에 등록해놓는다.
getMappedStatement는 등록되어있는 Query의 정보를 가져온다.
3. Executor.query
SqlSessionFactory를 만들면서 만들어진 Executor객체를 통하여 query 메소드를 실행한다.
필자는 CachingExecutor.query가 실행됨.
sql 을 가져오고 Cachekey를 생성하고 query 메소드를 실행하는 역할을 한다.
4. Delegate.query
CachingExecutor는 캐싱된정보가 없다면 필드로 들고있는 Executor의 query를 실행시키는 객체이다.
따라서 Delegate로 등록된 Executor의 query를 실행한다. (이 예제에서는 BaseExecutor이다)
이 method에서 queryFromDatabase를 실행한다.
5. BaseExecutor.queryFromDatabase
local cache에 정보를 삽입하고 doQuery 메소드를 실행한다.
6. SimpleExecutor.doQuery
현재의 설정을 가지고 Handler를 생성하고 handler를 통해 파라미터를 setting 한다.
세팅된 Statement를 가지고 query를 실행한다.
7. PreparedStatementHandler.query
6번에서 handler.query를 실행하게되면 PreparedStatementHandler의 query가 실행된다.
ps는 프록시객체로 ps.execute를 실행하게되면 PreparedStatementLogger의 invoke 메소드가 실행된다.
8. PreparedStatementLogget.invoke
해당 메소드의 method.invoke부분에서 driver class로 넘겨주게된다.
이 다음부터는 사용하시는 Driver class마다 상이할것이므로 여기까지만 설명하겠습니다...!
이상으로 xml으로 작성된 쿼리가 어떻게 실행되는지 알아보았습니다.
'개발 > JAVA' 카테고리의 다른 글
[Mybatis] Mybatis는 어떻게 동적쿼리인지 판단할까? (0) | 2020.12.31 |
---|---|
[Mybatis] StatementType (0) | 2020.12.28 |
[Mybatis] Parameter not found. Available parameters are [arg0, param1] (0) | 2020.12.27 |
[Mybatis] Mapper는 어떻게 등록되는 것일까 ? (1) | 2020.12.27 |
[Mybatis] Interface를 이용하여 Query 날리기 (0) | 2020.12.27 |
댓글