MyBatis
현재 문서에서는 MyBatis의 개념과 , 아키텍쳐만 설명하므로, 기타 메서드에대한 설명은 MyBatis.pdf문서를 참조하세요.
1. MyBatis

MyBatis는 Java에서 SQL을 "명시적"으로 제어하고 관리하기 위한 영속성 프레임워크(Persistence Framework)이다.
JDBC 기반에서 반복적으로 작성하던 코드를 제거하고, SQL을 XML 또는 애노테이션으로 분리하여 코드의 생산성과 가독성을 높여준다.
특히, 복잡한 조인 쿼리나 조건 분기 등이 필요한 엔터프라이즈 환경에서, SQL을 직접 컨트롤할 수 있는 점은 MyBatis의 큰 장점이다.
영속성 프레임워크 ?
데이터와 관련된 각종 기능들을 정의해둔 프레임워크를 지칭
MyBatis의 주요 특징
SQL을 명시적으로 제어 가능
명시적제어? 개발자가 직접 실행할 SQL문을 작성하고 , 제어하는 방식.
XML/Annotation 방식으로 SQL 분리
반복되는 JDBC 코드 제거로 생산성 향상
Connection생성, PreparedStatment생성, 데이터 바인딩 등
ResultMap을 통한 세밀한 결과 매핑 지원
조건문, 반복문을 통한 동적 SQL 처리
현재 문서에서는 XML기반의 MyBatis의 동작방식에 대해서 다룬다.
2. MyBatis 구성요소

1. SqlSessionFactoryBuilder
Mybatis Config file을 읽어 SqlSessionFactory를 생성하는 빌더 객체.
이미지상에는 없지만 내부적으로 MappedStatement를 생성한다.
서버 가동 중 1회만 실행
2. MyBatis Config File
MyBatis 사용을 위한 설정 파일
연결할 DB의 정보 , 환경설정, 등록할 Mapper들의 경로 등이 존재
3. SqlSessionFactory
SqlSession을 생성하는 객체.(팩토리패턴)
공장처럼 에서 물건을 뽑아내듯 객체를 생성하는 클래스들을 팩토리클래스 라고 부름.
서버 가동 중 1회만 생성되며, 클라이언트의 요청시 마다 새로운 SqlSession을 생성하여 반환해준다.
4. SqlSession
SQL을 실행하고 트랜잭션을 처리하는 핵심 객체
SELECT, INSER, UPDATE, DELETE 등 SQL문을 실행하기 위한 각종 기능을 정의해두었다.
5. Mapper XML(mapping file)
실행할 SQL문들을 정의하고 보관하는 파일.
MyBatis-Config상에 MapperXML의 경로를 기술해두면 Mapper객체로 생성된다.
내부에는 Mybatis의 sql태그(
<select>, <insert>,<update>,<delete>
) 와 동적 sql태그(<if>,<for>
)등을 사용할 수 있다.예시)
<mapper namespace="userMapper">
<select id="selectMember" resultMap="memberResultSet" parameterType="member">
SELECT *
FROM MEMBER
WHERE USER_ID = #{userId}
AND STATUS = 'Y'
</select>
</mapper>
SqlSession의 메서드에서 Mapper XML에 정의한 sql문을 실행할 수 있다.
ex) sqlSession.selectOne("userMapper.selectMember",userId);
첫번째 매개변수 : MappedStatment의 id
두번째 매개변수 : 쿼리문을 완성하는데 필요한 매개인자
6. MappedStatement

Mapper XML에서
<select>
태그등을 통해 정의한 SQL문장을 객체형태로 저장하는 컴포넌트.myBatis- config.xml의 설정정보를 읽으면서 SqlSessionFactory Builder가 생성될 때 함께 생성된다.
namespace. id를 key값으로, 실행하고자하는 SQL의 파라미터타입, 결과타입, 동적SQL문 포함 여부등 을 저장한다.
백그라운드에서 MyBatis에 의해 자동으로 관리되며 개발자가 직접 데이터를 관리할 필요가 없다.
7. TypeHandler
Java타입과 JDBC타입 간의 변환처리가 필요한 경우 사용하는 객체
ParameterHandler와 ResultSetHandler에서 DB의 자료형을 Java의 자료형으로 바꾸거나, Java의 자료형을 db로 바꿀 때 사용된다.
EX) CHAR, VARCHAR2 --> String OR int, long --> Number
단 , 기본 제공 타입 외에, 사용자가 정의한 타입과 매핑이 필요한 경우 TypeHandler인터페이스를 직접 구현해주어야한다.
EX) 자바의 Enum타입과 JDBC의 VARCHAR2간의 변환시 등.
3. MyBatis 동작 흐름

1. SqlSession에서 qurey()호출
SqlSession을
sqlSession.selectOne("userMapper.selectMember", userId)
등의 메서드 호출.SqlSeesion은 "userMapper.selectMember"를 id로 하는 MappedStatement를 찾음.
selectAll, selectOne메서드 호출시 query()메서드가 자동으로 호출되며 , MappedStatement에 저장된 쿼리문, 파라미터 타입 , 리턴타입등을 Executor에 전달
2. Executor에서 prepare()호출
StatementHandelr를 활용하여 Statement, PreparedStatement, CallableStatement객체를 생성
3. Executor에서 parameterize()호출
StatementHandler에서 setParameters()함수를 호출하여 실제 값을 바인딩한다.
바인딩 시 ParameterHandler가 호출됨.
4. Executor에서 쿼리문 실행
5. ResultSetHandler에서 결과값을 매핑(handleResultSet)
결과값을 자바의 객체로 매핑하여 변환 후 반환
Last updated