본문 바로가기
Spring

Spring - MyBatis

by icblue21 2022. 11. 21.
728x90

MyBatis

지난 포스트에서 데이터베이스에 접근하는 방법으로 복잡하고 반복되는 알고리즘을 대신 처리해주는 API, JdbcTemplate에 대해 다룬 적 있습니다. 오늘은 JdbcTemplate보다 더 편하게 데이터를 매핑하고 액세스할 수 있는 MyBatis에 대해 알아보도록 하겠습니다.

MyBatis는 SQL 기반 웹 애플리케이션을 개발할 때 많이 사용되는 SQL Mapper / ORM 프레임워크이며 스프링과는 상관없는 독립적인 프레임워크입니다.

ORM 이란 Object Relational Mapping의 약어로 자바 객체 필드와 관계형데이터베이스(RDB) 데이터를 자동으로 매핑해주는 것을 말합니다. 객체 지향 프로그래밍은 클래스를 사용하고 관계형 데이터베이스는 테이블을 사용하기 때문에 객체 모델과 관계형 모델 간의 불일치가 존재할 수 있습니다. ORM은 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 이러한 불일치를 해결할 수 있습니다. ORM은 데이터 CRUD를 다루는 Persistence Layer 프레임워크라 Persistence API라고 부르기도 합니다.

MyBatis의 장점

  1. 코드가 간결하고 접근이 쉬움
    • JDBC의 대부분의 기능을 제공합니다.
    • JDBC의 기능을 자동으로 제공해줘서 깔끔한 코드를 유지할 수 있습니다.
  2. 빠른 개발로 인한 성능 향상
  3. 프로그램 코드와 SQL문의 분리로 간결성 및 유지보수성 향상
  4. JAVA, C++, .NET, Ruby와 같은 다양한 프로그래밍 언어 사용 가능
  5. 조회 결과를 사용자 정의 클래스로 매핑 가능

그럼 JdbcTemplate이랑 MyBatis랑 뭐가 더 좋을까?

Mybatis에서도 JdbcTemplate처럼 SQL문을 수행해주는 PreparedStatement를 직접 생성하지 않고 내부적으로 자동 처리합니다. ? 처리 마저도 #{필드명} 매핑을 통해 자동으로 처리가 됩니다. 그렇다면 이 둘의 차이점은 무엇일까요? 바로 쿼리문 관리 방법에서 차이가 있습니다. MyBatis는 JdbcTemplate 보다 더 분할화하여 SQL쿼리문은 XML을 이용하도록 구현되어있으며, AOP,자바,객체지향프로그래밍의 특성을 살려 해당 쿼리문들을 객체화하고 묶어서 관리합니다. 이 방식의 장점은 SQL문을 완전히 분리하여 사용하기 때문에 향후 SQL문에 대한 유지보수성이 향상된다는 점입니다.

MyBatis3 구성 요소

MyBatis3의 구성 요소는 다음과 같습니다.

  • MyBatis configuration file
    • MyBatis3의 작업 설정을 설명하는 XML 파일
    • 데이터베이스의 연결 대상, 매핑 파일의 경로, MyBatis3 작업 설정 등과 같은 세부 사항을 설명하는 파일
    • Spring과 통합하여 사용할 때 데이터베이스의 연결 대상과 매핑 파일 경로 설정을 구성 파일에 지정할 필요 없음
  • SqlSessionFactoryBuilder
    • MyBatis3 구성 파일을 읽고 생성하는 SqlSessionFactory 구성 요소
    • 스프링과 통합되어 사용할 때 애플리케이션 클래스에서 직접 처리하지 않음
  • SqlSessionFactory
    • SqlSession을 생성하는 구성 요소
    • 스프링과 통합되어 사용할 때 애플리케이션 클래스에서 직접 처리하지 않음
    • sqlSessionFactory 이나 sqlSessionTemplate 중 하나가 없으면 오류 발생
    • Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
  • SqlSession
    • SQL 실행 및 트랜잭션 제어를 위한 API를 제공하는 구성 요소
    • MyBatis3를 사용하여 데이터베이스에 액세스할 때 가장 중요한 역할을 하는 구성 요소
    • 스프링과 통합되어 사용할 때 애플리케이션 클래스에서 직접 처리하지 않음
  • Mapper Interface 개발자 구현
    • 정의된 SQL을 호출하는 인터페이스
    • Mybatis-Spring 을 이용하는 경우 인터페이스 + 어노테이션 / XML으로 작성할 수 있음
    • Mapper 인터페이스를 보고 Mybatis가 SQL을 자동으로 생성해서 알아서 처리해 줌
  • Mapping file 개발자 구현
    • SQL 및 O/R 매핑 설정을 설명하는 XML 파일
  • MyBatis3 주요 구성 요소가 Database Access 하는 순서
    • 응용 프로그램 시작시 수행되는 프로세스 (스프링 시작 시 수행되는 프로세스)
      1. 응용 프로그램이 SqlSessionFactoryBuilder를 위해 SqlSessionFactory를 빌드하도록 요청함
      2. SqlSessionFactoryBuilder는 SqlSessionFactory를 생성하기 위한 MyBatis 구성 파일을 읽음
      3. SqlSessionFactoryBuilder는 MyBatis 구성 파일의 정의에 따라 SqlSessionFactory를 생성함
    • 클라이언트의 각 요청에 대해 수행되는 프로세스
      1. 클라이언트가 응용 프로그램에 대한 프로세스를 요청함
      2. 응용 프로그램은 SqlSessionFactoryBuilder를 사용하여 빌드된 SqlSessionFactory에서 SqlSession을 가져옴
      3. SqlSessionFactory는 SqlSession을 생성하고 이를 애플리케이션에 반환함
      4. 응용 프로그램이 SqlSession에서 Mapper 인터페이스의 구현 개체를 가져옴
      5. 응용 프로그램이 매퍼 인터페이스 메서드를 호출함
      6. 매퍼 인터페이스의 구현 개체가 SqlSession 메서드를 호출하고 SQL 실행을 요청함
      7. SqlSession은 매핑 파일에서 실행할 SQL을 가져와 SQL을 실행함

MyBatis-Spring 컴포넌트 구조

  • SqlSessionFactoryBean

    • SqlSessionFactory를 작성하고 Spring DI 컨테이너에 개체를 저장하는 구성 요소
    • 표준 MyBatis3에서 SqlSessionFactory는 MyBatis 구성 파일에 정의된 정보를 기반으로 함
    • SqlSessionFactoryBean을 사용하면 MyBatis 구성 파일 없이 SqlSessionFactory를 빌드할 수 있음
    • MyBatis의 Mapper 인터페이스의 주입을 가능하게 하는 MapperFactoryBean을 SqlSessionTemplate로 설정
  • SqlSessionTemplate

    • SqlSession 인터페이스를 구현하는 Singleton 버전의 SqlSession 구성 요소
    • SqlSessionTemplate빈은 thread safe하게 SqlSession 객체를 제공함
    • 여러 개의 스프링 빈에서 동일한 SqlSessionTemplate 객체를 공유할 수 있음
    • 개념적으로는 SqlSessionTemplate이 JdbcTemplate과 동일함
  • MapperFactoryBean

    • MyBatis Mapper 인터페이스 주입이 가능하도록 하는 객체
    • SqlSessionFactory 나 SqlSessionTemplate가 필요함
    • SqlSessionTemplate가 있으면 SqlSessionFactory 무시됨
  • MyBatis-Spring 프로세스

    • 응용 프로그램 시작시 수행되는 프로세스 (스프링 시작 시 수행되는 프로세스)
      1. SqlSessionFactoryBean은 SqlSessionFactoryBuilder를 위해 SqlSessionFactory를 빌드하도록 요청함
      2. SqlSessionFactoryBuilder는 SqlSessionFactory를 생성하기 위한 MyBatis 구성 파일을 읽음
      3. SqlSessionFactoryBuilder는 MyBatis 구성 파일의 정의에 따라 SqlSessionFactory를 생성하고 생성된 SqlSessionFactory는 Spring DI 컨테이너에 의해 저장됨
      4. MapperFactoryBean은 안전한 SqlSession (SqlSessionTemplate) 및 스레드 안전 매퍼 개체(Mapper 인터페이스의 프록시 객체)를 생성하고 생성되는 매퍼 객체는 스프링 DI 컨테이너에 의해 저장되며 서비스 클래스 등에 DI가 적용됨
        • 여기서, 매퍼 개체는 안전한 SqlSession (SqlSessionTemplate)을 사용하여 스레드 안전 구현 제공
    • 클라이언트의 각 요청에 대해 수행되는 프로세스

      1. 클라이언트가 응용 프로그램에 대한 프로세스를 요청함

      2. 어플리케이션 (서비스)은 DI 컨테이너에서 주입한 매퍼 개체 (매퍼 인터페이스를 구현하는 프록시 개체)의 방법을 호출함

      3. 매퍼 객체는 호출된 메소드에 해당하는 SqlSession (SqlSessionTemplate) 메서드를 호출함

      4. SqlSession (SqlSessionTemplate)은 프록시 사용 및 안전한 SqlSession 메서드를 호출함

      5. 프록시 사용 및 스레드 안전 SqlSession은 트랜잭션에 할당된 MyBatis3 표준 SqlSession 사용함
        트랜잭션에 할당된 SqlSession이 존재하지 않는 경우 SqlSessionFactory 메서드를 호출하여 표준 MyBatis3의 SqlSession을 가져옴

      6. SqlSessionFactory는 MyBatis3 표준 SqlSession을 반환함

        반환된 MyBatis3 표준 SqlSession이 트랜잭션에 할당되기 때문에 동일한 트랜잭션 내에 있는 경우 새 SqlSession을 생성하지 않고 동일한 SqlSession을 사용함
        메서드를 호출하고 SQL 실행을 요청함

      7. MyBatis3 표준 SqlSession은 매핑 파일에서 실행할 SQL을 가져와 실행함

'Spring' 카테고리의 다른 글

Spring - Filter / Interceptor  (0) 2022.11.23
Spring - Transaction Manager  (0) 2022.11.21
Spring - JdbcTemplate  (0) 2022.11.21
Spring - ConnectionPool  (0) 2022.11.21
Spring - Log4j2  (0) 2022.11.21

댓글