티스토리 뷰

Server

[Java] ORM과 JPA, 그리고 Hibernate

니용 2019. 11. 28. 16:21
반응형

어느 개발자들이나 신기술에 대한 갈망은 조금이나마 있을 것이다. 현재 우리나라에서 사용하고 있는 대부분의 프로그램 및 앱들은 SQL을 기반으로 작동하고 있다.

신기술이라고 얘기하기는 애매하지만 이번 글에서는 SQL을 되도록이면 최소화하여 (사용하지 않는 것이 아니다) 작동하는 프로그램의 원리에 대해 간단히 살펴보려고 한다. 가장 먼저 용어를 정리해보아야 한다. 글 제목에 적혀 있는 3개의 용어를 정리해보았다.

 

정의

ORM(Object Relational Mapping) : 객체와 DB 테이블이 매핑을 이루는 것

객체 하나는 하나의 테이블이 된다.

 

JPA(Java Persistent API) : 자바 ORM 기술에 대한 API 표준 명세

(이 링크에서 JPA에 대한 어노테이션을 살펴볼 수 있어요)

 

Hibernate : JPA를 구현하기 위한 ORM 프레임워크 중 하나

 

사용 목적은 다음과 같다.  예를 들어 사용자 테이블의 데이터를 조회하기 위해서는 이와 같은 쿼리를 사용했었다.

SELECT * FROM USER;

 

ORM을 사용하면 다음과 같이 치환된다.

interface UserRepository<T, User extends Serializable> extends CrudRepository<T, User> {
    List<User> findAll(); 
}

public class UserService {
    
    @Autowired
    UserRepository userRepository;
    
    public List<User> selectUserList(){
        return userRepository.findAll();
    }
    
}

@Entity
public class User {

    @Id
    @GenerateValue
    int userId;
    @NotEmpty
    String name;
    String address;
}

정말 간단하게 사용자(User)에 대한 테이블 명세, 조회 쿼리 및 서비스를 제작하였다.

보통 테이블은 Database에 생성하기 마련이지만, JPA에서는 User라는 클래스에 @Entity Annotation이 붙으면서 테이블이 생성된다.

 

기존의 MyBatis를 사용할 때에는 테이블마다 비슷한 쿼리를 Mapper에 작성하였고, 계속 반복적으로 사용하는 일이 많았지만,

JPA는 CrudRepository 내부에 존재하는 메서드를 사용하여 CRUD가 가능하도록 설계되어 있다.

 

 

MyBatis vs Hibernate

 

1. 현재 전세계에서 사용하고 있는  분포도는 해당 링크에서 확인이 가능하다.

아시아는 MyBatis, 유럽과 아메리카는 대부분 Hibernate를 사용한다. 

 

2. MyBatis는 쿼리를 전부 작성해야 하고 컬럼이 추가되면 쿼리를 수정하여야 하는 번거로움이 있다.

하지만 JPA는 객체가 테이블의 모체가 되기 때문에 그렇지 않다. 이는 객체지향적인 부분과도 관련이 있다.

 

3. MyBatis와 Hibernate 모두 각각의 문법이 있다. 학습하기 위해 필요한 시간은 Hibernate가 더 많이 소요된다.

그러므로 생산성은 초반에는 MyBatis가 좋고, 후반으로 가거나 장기 프로젝트의 유지보수인 경우 Hibernate가 좋다.

 

4. 쿼리를 전문적으로 공부한 사람들이 구분하기는 Hibernate보다 MyBatis가 더 수월하다.

MyBatis가 DBA에게 적합하다면 Hibernate는 개발자 지향적이다.

 

5. 성능은 메서드로 쿼리를 호출하는 JPA보다 쿼리를 직접 작성하는 MyBatis가 빠르다.

초창기에는 성능이 비교되지 않았으나 최근 추세에 따르면 많이 발전하였다고 한다.

 

6. DB에도 종류가 Oracle, MySQL, MSSQL 등과 같이 종류가 많아 DB Migration시 MyBatis는 변경해야할 사항이 너무나도 많다.

하지만 Hibernate는 추상화된 데이터 접근 계층을 제공하고 있어 DB에 종속적이지 않다.

 

 

비록 현재 국내 시장에서는 안정성과 유지보수를 위해 MyBatis를 많이 선호하는 추세이다.

왜냐하면 우리나라 시장의 대부분이 SI, 금융 및 공공기관에서 사용해왔는데, 이는 비즈니스 로직이 정말 복잡하고 안정성을 많이 확보하였다는 가정하에 크게 바뀌지 않고 있다는 이유가 지배적이다. 또한, 통계에서 JPA는 효율성이 많이 떨어지기 때문에 그에 대한 보완으로 블록체인 사업이 더 발달하고 있어 Hibernate가 일어설 자리가 많지 않다. 

 

근데 또 찾아보면 막상 그렇지도 않은 것이 이미 전자정부 표준 프레임워크에서도 JPA가 표준 기술로 포함되어 있고, (링크)

실제로 사용하고 있는 회사 목록은 알만한 기업들이 꽤나 있다. (이 링크를 참조하면 좋을듯 합니다.)

 

개발은 어떤 설계 과정을 거쳐 진행하기까지가 개발자의 선택이지만, 새로운 도전을 해보고 싶은 사람에게 좋을듯 하다.

반응형

'Server' 카테고리의 다른 글

SQL에 대해 알아보자  (0) 2019.12.15
[Java] 날짜 생성/변환  (0) 2019.12.06
[Java] 엑셀 변환  (0) 2019.12.03
[Java] NPE와 Optional Class  (1) 2019.10.26
[Java] Lambda와 Stream(2)  (0) 2019.10.15
[Java] Lambda와 Stream(1)  (2) 2019.10.15
댓글
공지사항