[MyBatis] MyBatis란? 개념 및 구조

yunSeok·2023년 10월 19일
0

MyBatis

목록 보기
2/4

Mybatis란?

  • Mybatis는 자바 오브젝트와 SQL사이의 자동 매핑 기능을 지원하는 ORM(Object relational Mapping)프레임워크입니다.

  • SQL, 동적 쿼리, 저장 프로시저 그리고 고급 매핑을 지원하는 SQL Mapper입니다.

  • MyBatis는 JDBC를 통해 RDBMS에 액세스하는 작업을 캡슐화하고 기존 JDBC의 중복작업을 간소화해줍니다.

  • XML 파일의 형태인 Mapper를 통해 프로그램 코드로부터 SQL 쿼리가 분리되는 환경을 제공하고 Java 객체와 매핑하는 작업을 도와줍니다.
    💨


Mybatis 특징

  1. 기존 JDBC보다 사용하기 편리

    ✔️ JDBC의 모든 기능을 Mybatis가 대부분 제공한다.

    ✔️ 수동적인 파라미터 설정과 쿼리 결과에 대한 맵핑 구문을 제거할 수 있다.

    ✔️ 기존 JDBC를 이용하여 프로그래밍을 하는 방식은 프로그램 소스안에 SQL문을 작성하는 방식으로 생산성이 좋지 않다.

    ✔️ 또, JDBC는 세부적인 작업이 가능하게 작업별로 각각의 메소드를 호출하게된다. 이러한 사항들은 다수의 메소드를 호출하고 관련된 객체를 해제해야하는 단점이 있다.

아래는 JDBC 예제 코드입니다.

//STUDENT 테이블의 학생정보를 출력하는 JDBC 프로그램 
public class SelectStudentApp {
	public static void main(String[] args) {
		Connection con=null;
		Statement stmt=null;
		ResultSet rs=null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
            //
            String url="jdbc:oracle:thin:@localhost:1521:xe";
			String user="scott";
			String password="tiger";
            //
			con=DriverManager.getConnection(url, user, password);
            //
			stmt=con.createStatement();
            //
			String sql="select * from student order by no";
            //
			rs=stmt.executeQuery(sql);
            //
			if(rs.next()) {
				do {
					int no=rs.getInt("no");
					String name=rs.getString("name");					
					String phone=rs.getString("phone");					
					String address=rs.getString("address");		
					String birthday=rs.getString("birthday");
                    //
					System.out.println("학번 = "+no);
					System.out.println("이름 = "+name);
					System.out.println("전화번호 = "+phone);
					System.out.println("주소 = "+address);
					System.out.println("생년월일 = "+birthday.substring(0, 10));
				} while(rs.next());
			} else {
				System.out.println("검색된 학생정보가 없습니다.");
			}
		} catch (ClassNotFoundException e) {
			System.out.println("[에러] OracleDriver 클래스를 찾을 수 없습니다.");
		} catch (SQLException e) {
			System.out.println("[에러] JDBC 오류 = "+e.getMessage());
		} finally {
			try {
				if(rs!=null) rs.close();
				if(stmt!=null) stmt.close();
				if(con!=null) con.close();
			} catch (SQLException e) {}
		}
	}
}

위의 예제 코드처럼 Connection을 맺고, SELECT 명령을 전달+실행해서 ResultSet 객체에 저장 후, rs.next()을 이용하여 ResultSet 처리행을 하나씩 이동시켜 받아오는 구조로 복잡하다...
  1. SQL문과 프로그래밍 코드의 분리로 이식성이 좋다.

    ✔️ SQL에 변경이 있을 때마다 자바 코드를 수정하거나 컴파일하지 않아도 된다.

    ✔️ SQL을 별도의 파일로 분리해서 관리하게 해준다.

  2. 간단함

    ✔️ 객체 프로퍼티로 파라미터와 결과를 객체(DTO, Map 등)로 자동 매핑을 지원합니다.

    ✔️Spring 연동 모듈을 제공해주기 때문에 Spring 설정이 간단합니다.

  1. 다양한 프로그래밍 언어로 구현가능

    ✔️ Java, C#, .NET, Ruby


Mybatis 구현 순서 !!코드 작성하기

  1. DB 테이블 생성 및 설정

  2. 도메인 객체( ex) DTO ) 설계 및 클래스 작성

  3. DAO 인터페이스 / 실행 기능 인터페이스 정의

  4. XML Mapper 생성 및 SQL문 작성

  5. MyBatis에 작성한 XML Mapper 인식 설정 (Spring과 연동)

  6. DAO 인터페이스 구현한 클래스 작성

  7. 스프링에 DAO 등록


Mybatis3의 Database Access 프로세스

(1) ~ (3) 응용 프로그램 시작시 수행되는 프로세스

  1. 응용 프로그램이 SqlSessionFactoryBuilder를 위해 SqlSessionFactory를 빌드하도록 요청합니다.

  2. SqlSessionFactoryBuilder는 SqlSessionFactory를 생성하기 위한 Mybatis 구성 파일을 읽습니다.

  3. SqlSessionFactoryBuilder는 Mybatis 구성 파일의 정의에 따라 SqlSessionFactory를 생성합니다.

(4) ~ (10) 클라이언트의 각 요청에 대해 수행되는 프로세스

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

  2. 응용 프로그램은 SqlSessionFactoryBuilder를 사용하여 빌드된 SqlSessionFactory에서 SqlSession을 가져옵니다.

  3. SqlSessionFactory는 SqlSession을 생성하고 이를 애플리케이션에 반환합니다.

  4. 응용 프로그램이 SqlSession에서 매퍼 인터페이스의 구현 개체를 가져옵니다.

  5. 응용 프로그램이 매퍼 인터페이스 메서드를 호출합니다.

  6. 매퍼 인터페이스의 구현 개체가 SqlSession 메서드를 호출하고 SQL 실행을 요청합니다.

  7. SqlSession은 매핑 파일에서 실행할 SQL을 가져와 SQL을 실행합니다.


MyBatis-Spring의 구성요소

✅ Spring 프로젝트 구성에 따라서 root-context.xml 이나 servlet-context.xml 에서 설정합니다.


  • org.mybatis.spring.SqlSessionFactoryBean

    • SqlSessionFactory를 작성하고 Spring DI 컨테이너에 개체를 저장하는 구성 요소.

    • 표준 Mybatis에서 SqlSessionFactory는 Mybatis 구성 파일에 정의된 정보를 기반으로 합니다.

    • 그러나 SqlSessionFactoryBean을 사용하면 Mybatis 구성파일이 없어도 SqlSessionFactory를 빌드할 수 있습니다.
   <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactoryBean">
   </bean>

  • org.mybatis.spring.mapper.MapperFactoryBean

    • 싱글톤 Mapper 개체를 만들고 Spring DI 컨테이너에 개체를 저장하는 구성 요소.

    • Mybatis 표준 매커니즘에 의해 생성된 Mapper 객체는 스레드가 안전하지 않습니다. 따라서 각 스레드에 대한 인스턴스를 할당해야 했습니다.

    • Mybatis-Spring 구성 요소에 의해 생성된 Mapper 개체는 안전한 Mapper 개체를 생성할 수 있습니다. 따라서 Service등 싱글톤 구성요소에 DI를 적용할 수 있습니다.

  • org.mybatis.spring.SqlSessionTemplate

    • SqlSession 인터페이스를 구현하는 싱글톤 버전의 SqlSession 구성 요소.

    • Mybatis 표준 메커니즘에 의해 생성된 SqlSession 개체가 스레드에 안전하지 않습니다. 따라서 각 스레드에 대한 인스턴스를 할당해야 했습니다.

    • Mybatis-Spring 구성 요소에서 생성된 SqlSession 개체는 안전한 스레드 SqlSession 개체를 생성할 수 있습니다.

    • 따라서 Service 등 싱글톤 구성요소에 DI를 적용할 수 있습니다.
    <bean class="org.mybatis.spring.SqlSessionTemplate" id="sqlSession" destroy-method="clearCache">
		<constructor-arg ref="sqlSessionFactoryBean" />
	</bean>

MyBatis-Spring의 Database Access 프로세스

(1) ~ (4) 응용 프로그램 시작시 수행되는 프로세스

  1. SqlSessionFactoryBean은 SqlSessionFactoryBuilder를 위해 SqlSessionFactory를 빌드하도록 요청합니다.

  2. 응용 프로그램은 SqlSessionFactoryBuilder를 사용하여 빌드된 SqlSessionFactory에서 SqlSession을 가져옵니다.

  3. SqlSessionFactoryBuilder는 MyBatis 구성 파일의 정의에 따라 SqlSessionFactory를 생성합니다. 따라서 생성된 SqlSessionFactory는 Spring DI 컨테이너에 의해 저장됩니다.

  4. MapperFactoryBean은 안전한 SqlSession(SqlSessionTemplate) 및 스레드 안전 매퍼 개체(Mapper 인터페이스의 프록시 객체)를 생성합니 다. 따라서 생성되는 매퍼 객체는 스프링 DI 컨테이너에 의해 저장되며 서비스 클래스 등에 DI가 적용됩니다. 매퍼 개체는 안전한 SqlSession(SqlSessionTemplate)을 사용하여 스레드 안전 구현을 제공합니다.

(5) ~ (11) 클라이언트의 각 요청에 대해 수행되는 프로세스

  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을 사용합니다.on 메서드를 호출하고 SQL 실행을 요청합니다.

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




    참고 사이트
    https://jangjjolkit.tistory.com/42
    https://byul91oh.tistory.com/232

0개의 댓글