⚙️Backend/DB

[DB] MyBatis vs. JPA

soonybutter 2024. 10. 16. 19:11
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