ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] jpa, Hibernate, mybatis 란? 그리고 SQL Mapper와 ORM
    Server/Spring 2020. 4. 19. 18:12

    목차

    🍓 1. 계층

    🍓 2. SQL Mapper와 ORM

    🍓 3. JDBC(Java Database Connectivity)

    🍓 4. JPA (Java Persistence API)

    🍓 5. Hibernate

    🍓 6. Mybatis


    1. 계층 - 영속성(Persistence)

    image

    계층 참고

    프레젠테이션 계층 (Presentation layer) - UI 계층 (UI layer) 이라고도 함
    애플리케이션 계층 (Application layer) - 서비스 계층 (Service layer) 이라고도 함
    비즈니스 논리 계층 (Business logic layer) - 도메인 계층 (Domain layer) 이라고도 함
    데이터 접근 계층 (Data access layer) - 영속 계층 (Persistence layer) 이라고도 함

    • Persistence Framework
      JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있으며 안정적인 구동을 보장한다.
      Persistence Framework는 SQL Mapper와 ORM으로 나눌 수 있다.
      아래 참고
      Ex) JPA, Hibernate, Mybatis 등

    2. SQL Mapper와 ORM

    Persistence Framework는 SQL Mapper와 ORM으로 나눌 수 있다.

    ORM은 데이터베이스 객체를 자바 객체로 매핑함으로써 객체 간의 관계를 바탕으로 SQL을 자동으로 생성해주지만 SQL Mapper는 SQL을 명시해줘야 한다.
    ORM은 관계형 데이터베이스의 ‘관계’를 Object에 반영하자는 것이 목적이라면, SQL Mapper는 단순히 필드를 매핑시키는 것이 목적이라는 점에서 지향점의 차이가 있다.

    • SQL Mapper
      SQL <—매핑—> Object 필드
      SQL Mapper는 SQL 문장으로 직접 데이터베이스 데이터를 다룬다.
      즉, SQL Mapper는 SQL을 명시해줘야 한다.
      Ex) Mybatis, JdbcTempletes 등
    • ORM(Object-Relational Mapping), 객체-관계 매핑
      데이터베이스 데이터 <—매핑—> Object 필드
      객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.
      객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.
      ORM을 이용하면 SQL Query가 아닌 직관적인 코드(메서드)로 데이터를 조작할 수 있다.
      객체 간의 관계를 바탕으로 SQL을 자동으로 생성한다.
      Persistant API라고도 할 수 있다.
      Ex) JPA, Hibernate 등
      ORM의 장단점 참고

    3. JDBC(Java Database Connectivity)

    image

    JDBC는 DB에 접근할 수 있도록 Java에서 제공하는 API이다.
    모든 Java의 Data Access 기술의 근간
    즉, 모든 Persistence Framework는 내부적으로 JDBC API를 이용한다.
    JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.
    Plain JDBC vs Spring JDBC 참고


    4. JPA (Java Persistence API)

    image

    • 자바 ORM 기술에 대한 API 표준 명세로, Java에서 제공하는 API이다.

      • 자바 플랫폼 SE와 자바 플랫폼 EE를 사용하는 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API이다.
      • 즉, JPA는 ORM을 사용하기 위한 표준 인터페이스를 모아둔 것이다.
      • 기존에 EJB에서 제공되던 엔터티 빈(Entity Bean)을 대체하는 기술이다.
    • 자바 어플리케이션에서 관계형 DB를 사용하는 방식을 정의한 인터페이스. 라이브러리가 아니다.

    • JPA 구성 요소 (세 가지)

      • 1) javax.persistance 패키지로 정의된 API 그 자체
      • 2) JPQL(Java Persistence Query Language)
      • 3) 객체/관계 메타데이터
    • 사용자가 원하는 JPA 구현체를 선택해서 사용할 수 있다.

      • JPA의 대표적인 구현체로는 Hibernate, EclipseLink, DataNucleus, OpenJPA, TopLink Essentials 등이 있다.
      • 이 구현체들을 ORM Framework라고 부른다.
    • JPA 처리를 담당하는 Repository는 기본적으로 4가지가 있다.

      (T : @Entity의 타입클래스/ ID : P.K 값의 Type )

    1. Repository<T, ID>

    2. CrudRepository<T, ID>

    3. PagingAndSortingRepository<T, ID>

    4. JpaRepository<T, ID>

    image

    • JPA 사용법

      • @Entity

        DB에 저장하기 위해 유저가 정의한 클래스. Domain

        RDBMS에서 Table을 객체화 시킨 것

      • @Id

        primary key를 가지는 변수 선언

        @GeneratedValue 는 해당 ID값을 어떻게 자동으로 생성할지 전략을 선택할 수 있는데 기본값은 'AUTO' 이다.

      • @Column

        @Column에서 지정한 변수명과 DB컬럼명 다르게 주고 싶은 경우

        (@Column(name=" ") 사용)

        해당 어노테이션을 사용하지 않으면 기본적으로 멤버 변수명과 일치하는 DB컬럼을 매핑한다.

      • *@NotNull *: CharSequence, Collection, Map orArray의 객체가 null일 수 없다. 그러나 empty는 가능하다.

      • @NotEmpty :CharSequence, Collection, Map orArray의 객체가 null과 empty 값(size > 0)이 될 수 없다

      • @NotBlank: 'String'이 null일 수 없으며, legnth가 0보다 커야 한다.

    • JPA는 메소드의 이름만으로 원하는 쿼리(Select)를 실행하는 방법을 제공

      Query 메소드를 추가하여 스프링에게 알릴 수 있다.

      그러기위해서는 규칙에 맞는 메서드를 작성해야 하는데, 그 규칙은 다음과 같다

      • find...By...
      • read...By...
      • query...By...
      • get...By...
      • count...By...

    image

    Query 메소드에 포함할 수 있는 키워드는 다음과 같다.

    image

    Pageable 변수를 추가하면 Page타입을 반환형으로 사용할 수 있다.

    Pageable 객체를 통해 페이징과 정렬을 위한 파라미터를 전달한다.

    Page<Member> getMembers(Pageable pageable){

    위와 같이 작성된 Pageable에서는 다음과 같은 파라미터를 자동 수집한다.

    image

    • 의존성 추가

      <dependencies>
        <dependency>
          <groupId>org.springframework.data</groupId>
          <artifactId>spring-data-jpa</artifactId>
        </dependency>
      <dependencies>

    5. Hibernate

    JPA의 구현체

    image

    • Hibernate는 JPA의 구현체 중 하나이다.
    • Hibernate가 SQL을 직접 사용하지 않는다고 해서 JDBC API를 사용하지 않는다는 것은 아니다.
      • Hibernate가 지원하는 메서드 내부에서는 JDBC API가 동작하고 있으며, 단지 개발자가 직접 SQL을 직접 작성하지 않을 뿐이다.
    • HQL(Hibernate Query Language)이라 불리는 매우 강력한 쿼리 언어를 포함하고 있다.
      • HQL은 SQL과 매우 비슷하며 추가적인 컨벤션을 정의할 수도 있다.
      • HQL은 완전히 객체 지향적이며 이로써 상속, 다형성, 관계등의 객체지향의 강점을 누릴 수 있다.
      • HQL쿼리는 자바 클래스와 프로퍼티의 이름을 제외하고는 대소문자를 구분한다.
      • HQL은 쿼리 결과로 객체를 반환하며 프로그래머에 의해 생성되고 직접적으로 접근할 수 있다.
      • HQL은 SQL에서는 지원하지 않는 페이지네이션이나 동적 프로파일링과 같은 향상된 기능을 제공한다.
      • HQL은 여러 테이블을 작업할 때 명시적인 join을 요구하지 않는다.
    • 장점
      • 객체지향적으로 데이터를 관리할 수 있기 때문에 비즈니스 로직에 집중 할 수 있으며, 객체지향 개발이 가능하다.
      • 테이블 생성, 변경, 관리가 쉽다. (JPA를 잘 이해하고 있는 경우)
      • 로직을 쿼리에 집중하기 보다는 객체자체에 집중 할 수 있다.
      • 빠른 개발이 가능하다.
    • 단점
      • 어렵다. (많은 내용이 감싸져 있기 때문에 알아야 할 것이 많다.)
      • 잘 이해하고 사용하지 않으면 데이터 손실이 있을 수 있다. (persistence context)
      • 성능상 문제가 있을 수 있다. (이 문제 또한 잘 이해해야 해결이 가능하다.)

    6. Mybatis

    image

    • 개발자가 지정한 SQL, 저장 프로시저 그리고 몇 가지 고급 매핑을 지원하는 SQL Mapper이다.
    • JDBC로 처리하는 상당 부분의 코드와 파라미터 설정 및 결과 매핑을 대신해준다.
      기존에 JDBC를 사용할 때는 DB와 관련된 여러 복잡한 설정(Connection)들을 다루어야 했지만 SQL Mapper는 자바 객체를 실제 SQL문에 연결함으로써, 빠른 개발과 편리한 테스트 환경을 제공한다.
    • 데이터베이스 record에 원시 타입과 Map 인터페이스 그리고 자바 POJO를 설정해서 매핑하기 위해 xml과 Annotation을 사용할 수 있다.
    • MyBatis는 원래 Apache Foundation의 iBatis였으나, 생산성, 개발 프로세스, 커뮤니티 등의 이유로 Google Code로 이전되면서 이름이 바뀌었다.
      iBatis와 바뀐 차이점은 아래와 같다.
      JDK 1.5, Annotation
      Dynatic SQL, XML Element
    • 장점
      SQL에 대한 모든 컨트롤을 하고자 할때 매우 적합하다.
      SQL쿼리들이 매우 잘 최적화되어 있을 때에 유용하다.
    • 단점
      애플리케이션과 데이터베이스 간의 설계에 대한 모든 조작을 하고자 할 때는 적합하지 않다.
      애플리케이션과 데이터베이스 간에 서로 잘 구조화되도록 많은 설정이 바뀌어야 하기 때문이다.

    참고

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

    반응형
Designed by Tistory.