JAVA) MyBatis와 JPA의 차이
본문 바로가기
programming/Java

JAVA) MyBatis와 JPA의 차이

by 코딩하는 핑가 2021. 10. 5.
반응형

* 본 포스팅은 https://mangkyu.tistory.com/20를 참고하여 작성하였음을 밝힙니다.

* MyBatis와 JPA의 차이점을 정리했습니다.

* 오탈자 및 잘못된 정보는 댓글로 알려주시기 바랍니다.

* 본 포스팅을 무단 복제하시거나 배포하지 마시기 바랍니다.

( 게시글 최상단에 본 블로그 출처를 밝히시면 포스팅은 가능합니다. )


1. ORM(Object Relation Mapping) - JPA vs OM (Object Mapping) - MyBatis

ORM이란, 객체(Object)와 DB의 테이블을 Mapping 시켜 RDB 테이블을 객체지향적으로 사용하게 해주는 기술이다.

RDB 테이블은 객체지향적 특성(상속, 다형성, 레퍼런스) 등이 없어서 java와 같은 객체지향적 언어로 접근하는 것이 쉽지 않다.

이러한 상황에서 ORM을 사용하면 보다 객체지향적으로 RDB를 사용할 수 있다.

Java에서 사용하는 대표적인 ORM으로는 JPA와 그의 구현체 Hiberante가 있다.

 

JPA(Java Persistent API)가 등장하기 이전에는 MyBatis라는 Object Mapping 기술을 이용했는데,

MyBatis는 Java 코드와 직접 작성한 SQL 코드를 Mapping 시켜줘야만 했다.

반면, JPA와 같은 ORM 기술은 객체가 DB에 연결되기 때문에, SQL을 직접 작성하지 않고 표준 인터페이스 기반으로 처리한다.

 

2. ORM 활용 예제

[ORM을 사용하지 않은 코드 - JDBC 활용]

아래의 코드는 Java Object와 RDB가 Mapping 되지 않기 때문에 각각의 쿼리 파라미터에 사용자 데이터를 직접 Set해서 DB에 저장하고 있다.

가독성이 떨어지고 작업이 불편한 단점이 있음

  public void insertUser(UserVO userVO){
        String query = " INSERT INTO USER (EMAIL, NAME, PW)"
                + " VALUES (?, ?, ?)";
 
        PreparedStatement preparedStmt = conn.prepareStatement(query);
        preparedStmt.setString (1, userVO.getEmail());
        preparedStmt.setString (2, userVO.getName());
        preparedStmt.setString   (3, userVO.getPW());
 
        // execute the preparedstatement
        preparedStmt.execute();
   }


출처: https://mangkyu.tistory.com/20 [MangKyu's Diary]

 

[ORM을 사용하지 않은 코드 - MyBatis 활용]

MyBatis는 Database 처리를 위한 DAO 클래스와 Mapper 파일을 사용한다.DAO에는 DB 쪽 연결을 도와주는 SqlSession의 인스턴스를 가지고 있으며, sqlSession을 통해 insert를 요청하면 해당 namespace를 갖는 mapper의 쿼리를 실행시키는데, 이때 파라미터로 UserVO의 객채를 넘겨주고 있다.

public class UserDAO {
 
    @Autowired
    private SqlSession sqlSession;
 
    private final String namespace = "mang.blog.user.userMapper.";
 
    public int insertUser(UserVO userVO) {
        return sqlSession.insert(namespace+"insertUser", userVO);
    }
}


출처: https://mangkyu.tistory.com/20 [MangKyu's Diary]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="mang.blog.user.userMapper">
 
    <insert id="insertUser" parameterType = "userVO">
        INSERT USER(
            EMAIL, USER_NAME, USER_PW, 
        )VALUES(
            #{userEmail}, #{userName}, #{userPw}
        )
    </insert>
 
</mapper>


출처: https://mangkyu.tistory.com/20 [MangKyu's Diary]

 

 

[JPA 적용 코드]

JPA는 기본적으로 Repository 단계에서 구현된다.

아래의 예제에는 Service 클래스가 있는데, 사용자를 id 값으로 조회하고 갱신을 해주는데, 별도의 Update 쿼리를 해주고 있지 않다. 이러한 이유는 JPA라는 ORM 기술에 의해 DB에서 조회한 데이터들이 객체로 연결되어 있고, 객체의 값을 수정하는 것은 DB의 값을 수정하는 것이기 때문이다.해당 메소드가 종료될 때 Update 쿼리가 JPA의 Dirty Checking 이후에 나가게 된다.아래는 MyBatis와 달리 쿼리를 직접 작성하지 않음을 확인할 수 있다.

@Service
public class UserService {
 
    private UserRepository userRepository;
 
   @Transactional
    public UserVO findUserAndUpdateName(Long id) {
UserVO user = userRepository.findById(id);
user.setName("변경된 이름");
    }
}


출처: https://mangkyu.tistory.com/20 [MangKyu's Diary]
반응형

댓글