728x90
백엔드에서 데이터베이스를 사용하는 프레임워크에는 가장 흔하게 MyBatis와 JPA가 있다.
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
MyBatis 는 SQL Mapper 기술을 제공하며,
JPA는 ORM 을 제공한다.
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 사용하면 쉽게 가져오고 저장할 수 있음.
- 객체와 데이터베이스 간의 매핑기술을 사용함으로서 객체지향 관점에서 코드를 개발하도록 도움.
- Java와 DB 데이터 간의 매핑을 자동화 -> 개발자는 SQL문을 작성할 필요 X
- ORM 내부적으로 java 메소드에 적합한 SQL 문이 자동으로 생성이 되어 실행된다.
*학습 후 예제 코드 추가 예정
- 객체 지향적 접근, 간단한 매핑 -> JPA
- 복잡한 쿼리, SQL 제어가 필요한 경우 -> MyBatis
물론 정답은 없고, 이런 특성을 가진다 정도로 이해하자.
개발자의 선호도와 프로젝트 특성에 따라 사용.
728x90
'⚙️Backend > DB' 카테고리의 다른 글
[DB] 로킹(Locking) 단위 , 로킹과 병행성, DB 로킹 기법 (0) | 2025.02.26 |
---|---|
[DB/OracleDB] Oracle DB 삭제한 데이터 복구하기 (TIMESTAMP) (0) | 2025.01.23 |
[DB/OracleDB] SQL문 조회, 함수 정리 (2) | 2024.09.09 |
[DB/OracleDB] Oracle Cloud , DBeaver 개발 환경 설정하기 (2) | 2024.09.08 |