Tiny Bunny
본문 바로가기
⚙️Backend/DB

[DB] MyBatis vs. JPA

by soonybutter 2024. 10. 16.
728x90

 

백엔드에서 데이터베이스를 사용하는 프레임워크에는 가장 흔하게 MyBatisJPA가 있다.

 

MyBatis와 JPA의 차이에 대해 정리해보자! 

 


 

1. DB와 연동하기 위한 기술

DB와 연동하기 위한 기술에는 두 가지가 있다.  (프레임워크)

 

1) SQL Mapper 

2) ORM (Object Relational Mapping)    

 

 

SQL Mapper

: 개발자가 작성한 SQL 실행 결과를 객체에 매핑함.

ORM (Object Relational Mapping)

: 객체, DB데이터를 자동으로 매핑한다

 

 

-> 두 기술은 DB에 데이터를 저장한다는 공통점을 가지지만, 서로 다른 접근 방식을 가진다.

 


 

 

 2. MyBatis vs. JPA

 

MyBatisSQL Mapper 기술을 제공하며,

JPAORM 을 제공한다.

 

 

 

 

MyBatis

  • JDBC 를 단순화하여 Java 코드에서 SQL문을 분리해서 별도의 XML 파일로 저장하고, XML 파일- Java 파일 둘을 연결하는 기능을 제공한다.
  • MyBatis 에서 Java 메소드와 Sql을 서로 매핑시킨다.
  • 따라서 개발자는 Java 메소드 선언, SQL문만 만들어주면 MyBatis 가 자동으로 연결해준다.
  • SQL문이 Java 파일에서 분리된 형태임으로 관리가 편하다.
  • 동적 SQL 생성 기능 : 프로그램 실행 중에 입력되는 파라미터에 따라 서로 다른 SQL문을 동적으로 생성하는 기능을 제공함.
  • MyBatis 내에 if문, choose, when 등 사용 가능하다. = 동적인 SQL 문 생성 가능
<select id="findActiveBlogwithTitleLike"
            resultType="Blog">
            
	SELECT * FROM BLOG
	WHERE state = 'ACTIVE'
	
    <if test= "title != null" >
	AND title like #{title}

 	</if>

<select>

 

 

 

- xml 파일 예시

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.my.myboard">
	
	<resultMap type="MyBoardDto" id="MyBoardMap">
		<result property="myno" column="MYNO"/>
		<result property="myname" column="MYNAME"/>
		<result property="mytitle" column="MYTITLE"/>
		<result property="mycontent" column="MYCONTENT"/>
		<result property="mydate" column="MYDATE"/>
	
	</resultMap>
	
	<select id="selectAll" resultType="com.my.model.dto.MyBoard">
		SELECT *
		FROM MYBOARD
		ORDER BY MYNO DESC
	</select>
	
	<select id="selectOne" resultMap="MyBoardMap">
		SELECT *
		FROM MYBOARD
		WHERE MYNO = ${myno}
	</select>
	
	<!-- resultType => 필요없어요 -->
	<insert id="">
		INSERT INTO MYBOARD
		VALUES(SEQ_MYBOARD.NEXTVAL, #{myname), #{mytitle}, #{mycontent}, CURRENT_DATE)
	</insert>	
	
</mapper>

 

 

- xml 파일로 sql 문이 분리된 java 파일

//전체출력
	public List<MyBoard> selectAll(){
		List<MyBoard> res = new ArrayList<>();
		SqlSession session = null;
		
		session = getSqlSessionFactory().openSession(true);
		res = session.selectList("com.my.myboard.selectAll");
		
		session.close();
		
	    return res;
	}

 

 

 

 

- MyBatis 사용 안했다면 이런형태였을 것 ( Java 파일 안에 sql 문 ㅇ) 

//전체출력
	public List<MyBoard> selectAll(){
		try {
			con= DriverManager.getConnection(url,username,password);
			System.out.println("02.계정연결");
			
		}catch(SQLException e) {
			System.out.println("02.계정연결 실패");
			e.printStackTrace();
		}
		
		Statement stmt = null;
		ResultSet rs = null;
		String sql = "SELECT * FROM MYBOARD";
		List<MyBoard> res = new ArrayList<>();
		
		try {
			stmt = con.createStatement();
			System.out.println("03. query준비: "+sql);
			
			rs = stmt.executeQuery(sql);
			System.out.println("04. query 실행 및 리턴");
			
			while(rs.next()) {
				MyBoard tmp = new MyBoard(rs.getInt(1),rs.getString(2), rs.getString(3),rs.getString(4),rs.getDate(5));
				
				res.add(tmp);
			}

		}
		catch(SQLException e){
			System.out.println("3/4 단계 에러");
			e.printStackTrace();
			
		}
		finally {
			try {
				rs.close();
				stmt.close();
				con.close();
				System.out.println("05. db종료 \n");
			}
			catch(SQLException e) {
				System.out.println("05. db종료에러");
				e.printStackTrace();
			}
		}
	    return res;
	}

 

 

 

 


 

 

JPA ( Java Persistence API )

  • Java의 객체와 DB의 entity( 테이블) 자체를 그대로 매핑해서 처리할 수 있는 접근방식을 사용함
  • DB - 데이터중심구조 / Java - 객체지향적 구조 이 둘사이의 변환이 어려웠는데, JPA 사용하면 쉽게 가져오고 저장할 수 있음.
  • 객체와 데이터베이스 간의 매핑기술을 사용함으로서 객체지향 관점에서 코드를 개발하도록 도움.

출처: https://www.elancer.co.kr/blog/detail/231?seq=231

 

  • Java와 DB 데이터 간의 매핑을 자동화 -> 개발자는 SQL문을 작성할 필요 X
  • ORM 내부적으로 java 메소드에 적합한 SQL 문이 자동으로 생성이 되어 실행된다.

 

 

 

*학습 후 예제 코드 추가 예정

 

 

 


 

  • 객체 지향적 접근, 간단한 매핑 -> JPA
  • 복잡한 쿼리, SQL 제어가 필요한 경우 -> MyBatis 

물론 정답은 없고, 이런 특성을 가진다 정도로 이해하자.

개발자의 선호도와 프로젝트 특성에 따라 사용.

728x90

TOP

Designed by 티스토리