Jpa란

Published: by Creative Commons Licence

ORM? Hibernate? JPA?

1. ORM이란

  • Object-relational- mapping
  • 어떤 어플리케이션을 만든다고 가정하자. 단골손님의 주소록을 만든다고 하자. 사람의 객체에는 이름, 키 몸무게 등이 저장 될 것이고, 주소록 객체에는 전화번호, 사람 번호, 주소 등이 저장되어 객체가 연결 될 것이다. 이렇게 생성된 사람 객체를 영구적으로 저장하기 위해 파일이나 데이터베이스에 저장하고자 하면 테이블에 객체가 가지고 있던 정보를 입력하고, join과 같은 SQL 질의어를 통해 설정을 해 주게 된다. 여기서 이 태이블과 객체간의 이질성이 발생한다.

0. MyBatis (SQL Mapper)

  • 객체와 SQL문을 매핑하여 데이터를 객체화 하는 기술
  • 객체와 관계를 매핑하기 보다는 SQL문의 질의 결과와 객체를 매핑시켜준다.

장점

  • 다른 프레임워크들에 비해 간단하다(SIMPLE)
  • 소스 코드와 SQL의 분리 (생산성, 작업 분배)
  • SQL을 직접 다룰 수 있다. (복잡한 쿼리, 저장 프로시저 등)

단점

  • 반복적인 코드와 CRUD SQL 작업
  • SQL 데이터베이스 벤더에 대한 종속성

1. ORM 장점

  1. 객체 지향적인 코드로 더 직관적이고 비지니스 로직에 더 집중 할 수 있다.
    • SQL의 절차적이고 순차적인 접근이 아닌 객체 지향적인 접근으로 인해 생산성이 향상된다.
  2. 재사용 및 유지 보수의 편리성이 증가한다.
    • ORM은 독립적으로 작성되어 있고, 해당 객체들은 재사용 할 수 있다.
  3. DBMS 에 대한 종속성이 줄어든다.
    • ORM 솔루션은 DB에 종속적이지 않다.
    • 프로그래머는 Object에 집중함으로써, 극단적으로 DBMS를 교체하는 거대한 작업에도 비교적 적은 리스크와 시간이 소요된다.

2. ORM 단점

  1. 완벽한 ORM으로 서비스를 구현하기 어렵다.

    • 사용사기는 편하지만 설계는 매우 신중하게 해야한다.
    • 프로젝트의 복잡성이 커질 경우, 난이도가 올라간다.
    • 잘못된 구현의 경우 속도 저하 및 일관성이 무너지는 문제점이 생길 수 있다.
  2. 프로시저가 많은 시스템에선 ORM의 객체 지항적인 장점을 활용하기 어렵다.

    1. 프로시저가 많은 시스템에선 다시 객체로 바꿔야 하며, 그 과정에서 생산성 저하나 리스크가 발생할 수 있다.

    프로시저란?

    • 특정 작업을 수행하는, 이름이 있는 PL/SQL BLOCK
  3. 장점을 극대화 하기 위하여 알아야 할 게 많다.

JPA와 Hibernate

1. JPA

  • Java Persistence API
    • ORM 전문가가 참여한 EJB 3.0 스펙 작업에서 기존 EJB ORM이던 Entity Bean을 JPA라고 바꾸고 JavaSE, JavaEE를 위한 영속성(persistence) 관리와ORM을 위한 표준 기술
    • JPA는 ORM 표준 기술로 Hibernate, OpenJPA, EclipseLink, TopLink Essentials과 같은 구현체가 있고 이에 표준 인터페이스
장점
  • 생산성
    • JPA를 사용하면 CRUD 용 SQL을 개발자가 직접 작성하지 않아도 된다.
    • Spring Data Jpa를 사용하면 interface 선언만으로 쿼리 구현이 가능
  • 유지 보수
    • 칼럼 추가/삭제 시 관련된 CRUD 쿼리를 모두 수정하는 대신, JPA가 관리하는 Entity만 수정하면 된다.
  • 데이터베이스 접근 추상화와 벤더 독립성
    • 데이터베이스 벤더마다 미묘하게 다른 데이터 타입이나 SQL을 JPA를 이용하면 손쉽게 해결 가능
  • SQL 중심적인 개발에서 객체 중심으로 개발
    • 패러다임 불일치 해결 (상속, 연관 관계, 레퍼런스, 오브젝트 등)

2. Hibernate

  • Jpa 실제 구현체 : Hibernate, EclipseLink, DataNucles
  • Hibernate가 SQL을 직접 사용하지 않는다고 해서 JDBC API를 사용하지 않는다는 것은 아니다.

    • Hibernate가 지원하는 매서드 내부에는 JDBC API가 동작하고 있으며, 단지 개발자가 직접 SQL을 작성하지 않을 뿐이다.
  • HQL
    • Hibernate Query Language

    • SQL과 매우 비슷하며 추가적인 컨벤션을 정의 할 수 있다.

    • HQL은 객체 지항적이며, 상속, 다형성, 관계등의 객체지향의 강점을 누릴 수 있다.

    • HQL은 SQL에서 지원하지 않는 페이지네이션이나 동적 프로파일링과 같은 향상된 기능을 제공한다.


출처

http://www.incodom.kr/ORM#h_702209f3f35878a32ee91352ddc6bbe7

https://www.slideshare.net/dongmyo/mybatis-jpa-123381168

https://khj93.tistory.com/entry/MyBatis-MyBatis%EB%9E%80-%EA%B0%9C%EB%85%90-%EB%B0%8F-%ED%95%B5%EC%8B%AC-%EC%A0%95%EB%A6%AC

https://gmlwjd9405.github.io/2018/12/25/difference-jdbc-jpa-mybatis.html

https://tinkerbellbass.tistory.com/24

https://terasolunaorg.github.io/guideline/5.1.0.RELEASE/en/ArchitectureInDetail/DataAccessJpa.html