본문 바로가기

플밍 is 뭔들/그 외..

ORM과 JPA에 관하여

※ ORM(Object Relational Mapping)
객체와 DB의 테이블 매핑을 이루는 것을 말합니다.
좀 더 자세히 말하면 객체형 데이터(Java Object)와 관계형 데이터(Relational DataBase) 사이에서 개념적으로 일치하지 않는 부분을 해결하기 위해 이 둘 사이를 Mapping한 것을 의미합니다.
SQL문 작성없이 간단한 매핑설정으로 데이터베이스의 테이블 데이터를 Java 객체로 전달받을 수 있습니다.
예를들어 USER테이블의 데이터를 조회하기 위해서는 SELECT * FROM USER; 라는 쿼리를 실행시켜야 하지만 ORM을 사용하면 USER 테이블과 매핑된 객체를 user라 할 때, user.findAll() 이라는 메서드 호출을 통해 데이터 조회가 가능합니다.
죽 쿼리를 직접 작성하지않고 메서드 호출만으로 쿼리가 수행됩니다.
 
  • 장점
생산성 및 유지보수성 향상 - 중복된 JDBC코드를 작성하지 않아도 되며 개발 로직 코드에 집중할 수 있습니다.
독립성 - DBMS에 종속적이지 않아 어느 DB를 사용하든 매핑 설정 일부만 변경해주면 자바코드를 건드릴 일이 없습니다.
 
  • 단점
쿼리가 복잡할 때 - 쿼리가 복잡해지면 ORM으로 표현하는데 한계가 있고, 성능이 raw 쿼리에 비해 느립니다.
 
 
※ JPA(Java Persistent API)
자바 ORM 기술에 대한 API표준 명세를 의미합니다.
JPA는 ORM을 사용하기 위한 인터페이스를 모아둔 것이며 JPA를 사용하기 위해서는 JPA를 구현한 Hibernate, EclipseLink, DataNucleus 같은 ORM 프레임워크를 사용해야 합니다.
 
 
※ 기존 RDB와의 비교
 
Mybatis Vs Hibernate
 
Mybatis
  1. Mybatis를 이용한 개발은 데이터 중심 모델링(테이블 설계)를 우선시하며 객체지향의 장점(추상화,캡슐화,정보은닝,상속,다형성)을 사용하지 않고 객체를 단순히 데이터 전달 목적(VO,DTO)에만 사용 -> 객체지향 언어로 개발을 하지만 전혀 객체지향적이지 않다고 느낌 
  1.  Mybatis를 이용하여 개발해 보면 유사한 CRUD 반복작업이 많으며 테이블에 약간의 수정만 있어도 관련된 DAO들에 변경이 있을 수 있음 -> 데이터베이스와 매우 강한 의존성을 갖고 있음.
 
Hibernate
  1. Hibernate는 SQL을 직접 사용하지 않고 메서드 호출만으로 쿼리가 수행되기 때문에 SQL반복작업을 하지 않음 -> 생산성 향상
  1. Mybatis에서는 테이블 컬럼이 하나 변경되었을 경우 DAO의 파라미터, 결과, SQL등 모두 확인하여 수정해야 하지만 JPA는 이런일을 대신해줌 -> 유지보수 향상
  2. DB벤더마다 쿼리 사용이 조금씩 다르기 때문에 시스템 개발 시 처음 선택한 DB를 나중에 바꾸는것은 매우 어렵지만 JPA는 설정 파일에 어느 DB를 사용하고 있는지 알려주기만 하면 얼마든지 DB변경 가능 -> DB에 종속적이지 않음
 
얼핏 보기에는 Hibernate가 무조건 좋아보이지만 단점도 있습니다. JPA를 잘 사용하기 위해서는 알아야할 것이 많습니다. 또한 복잡한 쿼리를 메서드만으로 해결하는 것은 힘든일입니다. 그래서 SQL과 유사한 기술인 JPQL을 지원하고 SQL자체 쿼리를 작성할 수 있도록 지원하고 있습니다. 마지막으로 지금은 많이 발전하여 좋은 성능을 보여주고 있다고 합니다만 SQL을 직접 작성하지 않고 호출만으로 쿼리를 수행한다는 것은 성능이 떨어질 수도 있습니다.
 
 
※ 마치며
hibernate가 SQL을 직접 사용하지 않는다고 해서 JDBC API를 사용하지 않는것은 아닙니다. Hibernate가 지원하는 메서드 내부에서 동작하고 있으며 단지 개발자가 직접 SQL을 작성하지 않을 뿐입니다. 그렇기 때문에 Hibernate를 사용한다고 해도 쿼리를 잘 알아야하고 비지니스에 따라서 Mybatis를 사용할 지 Hibernate를 사용할 지 상황에 맞는 선택을 해야할 것입니다.