본문 바로가기
JAVA

Mybatis (DB 연동 프레임워크)

by yororing 2024. 9. 25.

00 개요

  • 회사에서 코드분석 시 쿼리문들이 담겨있는 .xml 파일들에서 mybatis를 사용하는데 (<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">) 이에 대한 정리

01 MyBatis란

1. 정의

  • Java 기반데이터베이스 연동 프레임워크
  • 오픈 소스 ORM(Object-Relational Mapping) 프레임워크
  • SQL 쿼리를 직접 작성하여 데이터베이스와의 상호작용을 효율적으로 처리할 수 있도록 도와주는 라이브러리
  • SQL Mapper, 즉 데이터베이스와 객체 간의 자동 매핑(ORM, Object Relational Mapping)을 지원하는 도구
  • 기존 JDBC를 통해 RDBMS에 액세스하는 작업을 캡슐화하고 기존 JDBC의 중복작업 간소화

1) 동작 원리

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

2) JDBC와의 비교

  • 기존 JDBC보다 사용하기 편리
    • JDBC의 모든 기능을 Mybatis가 대부분 제공
    • 수동적인 파라미터 설정과 쿼리 결과에 대한 맵핑 구문을 제거 가능
    • 기존 JDBC를 이용하여 프로그래밍을 하는 방식은 프로그램 소스안에 SQL문을 작성하는 방식으로 생산성이 좋지 않음
    • JDBC는 세부적인 작업이 가능하게 작업별로 각각의 메소드를 호출하게 됨, 이러한 사항들은 다수의 메소드를 호출하고 관련된 객체를 해제해야하는 단점이 있음 
  • JDBC 예제 코드:
    • 아래 예제 코드처럼 Connection을 맺고, SELECT 명령을 전달+실행해서 ResultSet 객체에 저장 후, rs.next()을 이용하여 ResultSet 처리행을 하나씩 이동시켜 받아오는 구조로 복잡함 
//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) {}
		}
	}
}

 

 

3. 특징

  • SQL문과 프로그래밍 코드의 분리
    • SQL문 직접 사용: Hibernate와 같은 다른 ORM 프레임워크는 자동으로 SQL 쿼리를 생성해 주지만, MyBatis는 사용자가 직접 SQL을 작성하고 제어할 수 있어, 복잡한 쿼리를 다루는 데 좋음
    • 동적 SQL 지원: XML 또는 애노테이션을 통해 동적 SQL 구성 가능. 조건에 따라 쿼리가 달라질 경우 매우 유용
    • SQL에 변경이 있을 때마다 자바 코드를 수정하거나 컴파일하지 않아도 됨 
    • SQL을 별도의 파일로 분리해서 관리함 
  • 자동 매핑: 객체 프로퍼티로 파라미터와 결과 (SQL 실행 후 결과)를 객체(DTO, Map 등)로 자동 매핑 지원
  • 간단한 설정: Spring 연동 모듈을 제공해주기 때문에 Spring 설정이 간단함 
  • 유연성: 다양한 데이터베이스와 함께 사용 가능, 트랜잭션 관리 등과도 잘 통합됨; 다양한 프로그래밍 언어로 구현 가능 (Java, C#, .NET, Ruby)

MyBatis는 SQL에 대한 강력한 제어가 필요한 프로젝트에서 많이 사용되며, 복잡한 비즈니스 로직과 SQL 쿼리를 쉽게 관리할 수 있는 장점이 있습니다.

 

 

참조

  1. https://velog.io/@cyseok123/MyBatis
  2. https://ccomccomhan.tistory.com/130
  3. https://www.elancer.co.kr/blog/view?seq=231
  4.  

'JAVA' 카테고리의 다른 글

extends vs implements (자바 키워드, 파이썬과 비교)  (0) 2024.09.30
throws (자바 키워드)  (0) 2024.09.30
ArrayList vs LinkedList (자바 데이터 타입)  (0) 2024.09.30
로그 레벨 (log4j)  (0) 2024.05.07