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타입 간의 변환처리가 필요한 경우 사용하는 객체

  • ParameterHandlerResultSetHandler에서 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에 전달

  • Executor?

    • SQL을 실제로 실행하고 제어하는 객체.

    • StatementHandler를 통해 실제 SQL문 실행을 한다.

2. Executor에서 prepare()호출

  • StatementHandelr를 활용하여 Statement, PreparedStatement, CallableStatement객체를 생성

  • StatementHandler?

    • 실행할 SQL문에 맞춰 JDBC의 Statement, PreparedStatement, CallableStatement객체를 생성하고 SQL문을 실행하는 객체

    • 파라미터 바인딩을 위해 내부적으로 ParameterHandler를 사용한다.

3. Executor에서 parameterize()호출

  • StatementHandler에서 setParameters()함수를 호출하여 실제 값을 바인딩한다.

  • 바인딩 시 ParameterHandler가 호출됨.

  • ParameterHandler?

    • Java객체를 Statement에 바인딩해주는 객체

    • WHERE USER_ID = #{userId}
      • 위 코드에서 #{userId}는 pstmt.setString(1, userId);로 변환되어처리된다.

4. Executor에서 쿼리문 실행

5. ResultSetHandler에서 결과값을 매핑(handleResultSet)

  • 결과값을 자바의 객체로 매핑하여 변환 후 반환

Last updated