ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 하이버네이트 ORM User guide 1
    Spring/Spring Data JPA 2020. 5. 11. 03:00

    하이버네이트는 자바에서 쓸 수 있는 ORM 설루션이다. ORM이라는 용어는 객체 모델을 관계형 모델로 매핑할 수

     

    있는 기술이다. 혹은 관계형 모델을 객체 모델로 매핑한다거나. 즉 둘 간의 불일치한 패러다임을 일치시켜주는 기술이다.

     

     

    하이버네이트는 매핑 뿐아니라 쿼리도 할 수 있고 데이터를 가져오는 기능도 제공을 한다. 이로써 SQL이나 JDBC를 직접

     

    다루지 않고 하이버네이트로 감싸주다 보니 SQL에 종속적인 개발을 막아준다.

     

     

    하이버네이트가 가장 유용한 경우는 비즈니스 로직이 자바 기반이고 객체 기반의 도메인 모델에서 가장 유용하다고 한다. 

     

     

     

    JDBC위에 하이버네이트가 올라가고 하이버네이트를 한번더 감싼 게 JPA이다.  Hibernate가 제공하는 natvie 한 API를 사

     

    용해서 Hibernate를 쓰거나 JPA를 통해서 Hibernate를 쓸 수 있다. 그 중 JPA를 통해서 Hibernate를 써보자.

     

     

    하이버네이트의 핵심 클래스는 SessionFactory다.  SessionFactory는  하이버네이트에 있으며 thread-safe 한 도메인 모델

     

    매핑을 대변하는 핵심 클래스이다. 이 클래스를 통 해 세션을 가져오고 JPA에 EntityManagerFactory와 같은 역할을 한

     

    다.

     

    ( EntityManager는 안에서 엔티티들의 변화의 상태를 다 캐싱한다. 새 엔티티를 만들어서 save하라고 했다면

     

    내부적으로 EntityManager에게로 가게 된다. 즉 EntityManager가 가지고 있다가 DB에 언제 싱크해야 할지는

     

    EntityManager가 판단한다. 즉  save는 EntityManager에게 전해준 것 .)

     

     

     

    Session은 하이버네이트 SessionFactory에서 가져올 수 있으며 하이버네이트가 DB에서 작업을 할 때의 한 단위다.

     

    이 Session을 통해서 엔티티를 저장하는 등의 일을 할 수 있다.

     


    도메인 모델

     

    도메인 모델은 데이터 모델링에서 왔으며 문제 영역을 어떻게 기술하는지에 대한 내용이다. 

     

    Mapping Types

     

    하이버네이트는 크게 2가지 타입이 있다.

     

    1. Entity Types   2. Value Types

     

     

     

    다음과 같이 Contact라는 테이블이 있고 Contact라는 클래스가 있다. 여기서 이 둘은 서로 맵핑이 되어있다.

     

    @Entity(name = "Contact")는 이 Entity에 이름이다.

     

    이때 아래의 @Embeddable은 value 타입 Contatct 클래스는 Entity로 볼 수 있다.

     

     

    value

     

    value타입 같은 경우는 우선 자신만의 라이프 사이클이 없다. 즉 어딘가에 종속되어있다. 혼자 스스로 쿼리가

     

    된다거나 Name만 따로 집어넣을 일은 없고 위의 예는 Contact의 의존하는 모습을 볼 수 있다. 그리고 Contact

     

    의 라이프 사이클을 따른다. 이 Contact가 지워지면 Name도 지워진다.

     

     

    어떤 클래스가 value타입이냐 아니냐를 결정할 때는 얘만 따로 쿼리를 해야 하나 혹은 ID가 있어야 하나 등을

     

    생각해보면 될 것이다. 주로 Entity타입으로 처리하지만 차이는 반드시 알아두자.

     

     

    Entity

     

    Entity의 모든 상태는 Value 타입으로 이루어져 있다.

     

    Entity타입은 자기 고유의 라이프 사이클이 있다. 어떤 식별자를 사용해서 조회할 수 있고 삭제할 수 있고 수정할

     

    수 있다. 

     

     

     


     

    Naming Strategies

     

    오브젝트 모델을 관계형 데이터베이스로 맵핑하는 과정에서 오브젝트 모델의 이름을 데이터베이스의 테이블이나

     

    칼럼 이름 등으로 어떻게 맵핑할지 에 대한 2가지 전략이다.

     

     

    1. 적절한 logical name을 판단한다.  logical 한 이름은 컬럼이나 테이블을 써서 사용자가 직접 명시하거나 혹은 하이버네

     

    이트가 암묵적으로 판단할 수 있다.  ( ImplicitNamingStrategy ) 

     

    2. logical한 이름을 physical 한 이름으로 실제 찾는 과정을 거친다.  ( PhysicalNamingStrategy )

     

     

    예를 들어 accountNumber을 가지고 acct_num을 찾아가게 해 주는 게 PhysicalNamingStrategy이다.

     

    언더스코어를 더 선호하며 특정한 단어를 약어로 바꾸기도 하기 때문이다.

     

    대문자가 아닌 언더스코어를 쓰는 것을 볼 수 있다.

     

     

    Basic Types

     

    value type의 서브 카테고리가 3개 있는데 그중에 하나가 Basic Types이다. Basic TYpes은 단일 데이터베이스 칼럼으로

     

    매핑이 된다. 하이버네이트는 내부적으로 basic type의 레지스트리를 사용해서 맵핑한다.

     

    (Contact 예시에 name은 단일 데이터베이스 칼럼이 아니기 때문에 Basic 타입이 아니다. )

     

     Hibernate-provided BasicTypes

     

    예로 하이버네이트 타입으로 StringType이 있는데 이는 JDBC의 VARCHAR로 맵핑이 되며 우리는 java에서 String으로

     

    쓴다.

     

     

    Java 8 BasicTypes

     

    자바에서 자주 쓰이는 LocalDateTime 역시 TIMESTAMP로 매핑됨을 알 수 있다.

     


     

     

    The @Basic annotation

     

    @Basic은 생략이 가능하다. 기본적으로 다 달려있다고 가정하기 때문.

     

     

    Basic 어노테이션은 두 가지 애트리뷰트를 정의할 수 있다.

     

    1. Optional - boolean ( 기본값은 true )

     

    - 즉 nullable 인지 아닌지 Id를 제외한 칼럼들은 다 nullable true가 기본값이 된다.

     

    2. Fetch 

     

    - 그 애트리뷰트를 Eagerly fetch 해야 하는지 lazily fetch 해야 하는지.

     

    Eagerly fetch : 가져올 수 있을 때 빨리빨리 가져와야 하는지

    Lazily fetch : 최대한 늦게 가져와야 하는지

     

    Eager는 owner가 fetch 될 때 값들도 fetch 해야 하는 것들을 eager라 한다. 앞선 예로  Contact를 가져올 때 해당

     

    name, notes 들도 다 가져오는 게 eager이다.

     

    근데 LAZY란 이 에트리 뷰트에 접근할 때 가져오는 게 LAZY fetch이다. Contact를 가져오라고 할 때는 접근하지 않지만

     

    Contact에서 notes에 값을 접근해야 할때 그때 가져와라 라고 하는 게 LAZY이다. 

     

    하이버네이트는 바이트코드를 조작하지 않은 이상 fetch 값을 무시한다고 한다.

     

     

     

     

    https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#basic

     

    Hibernate ORM 5.4.15.Final User Guide

    Fetching, essentially, is the process of grabbing data from the database and making it available to the application. Tuning how an application does fetching is one of the biggest factors in determining how an application will perform. Fetching too much dat

    docs.jboss.org

     

     

Designed by Tistory.