본문 바로가기
개발/JAVA

[Mybatis] 쿼리를 어떻게 실행하는 것일까?

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

Mybatis는 Mapper 또는 xml을 이용하여 쿼리를 작성해놓고 코드로 실행 시키기만 하면 알맞는 쿼리를 실행하도록 한다.

이번에는 어떠한 원리로 xml로 작성한 쿼리가 실행되는지 알아보도록 하겠다.

Mapper 등록 원리는 아래에서 볼 수 있습니다.

csy7792.tistory.com/301

 

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

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

csy7792.tistory.com

바로 시작하겠습니다

 

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으로 작성된 쿼리가 어떻게 실행되는지 알아보았습니다.

반응형

댓글