8월 30, 2023

Spring에서 Hibernate ORM 사용하는 방법

오늘은 Spring에서 Hibernate ORM을 사용할 수 있는 방법, Hibernate ORM 정의, 예시 등을 포스팅해보도록 하겠다.

 

먼저 ORM이 무엇인가부터 알아보아야 하는데,

ORM (Object Relationship Mapper)은 Persistence Framework의 일종으로 간단히 말해서 데이터베이스의 테이블과 객체를 매핑하는 방식이다. Persistence Framework란 영속성을 원활하게 도와주는 framework로, 프로그램이 종료되더라도 데이터를 저장하기 위해 DB와 연결하고 저장하는 방식을 도와주는 프레임워크라고 할 수 있다. Persistence Framework에는 아래와 같이 두 가지 종류가 있다.

  1. SQL Mapper: 말 그대로 SQL과 객체를 매핑하는 방식 ex) JdbcTemplate, MyBatis
  2. ORM: 데이터베이스의 테이블과 객체를 매핑하는 방식 ex) Hibernate ORM

ORM은 Java 객체와 DB 엔티티 사이를 오고가면서 변환을 해주고 Java 객체 사이의 관계와 DB의 관계 사이의 연결을 도와준다. 이러한 마찬가지 방법으로 쿼리 또한 연결해줄 수 있다.


이 중, Hibernate ORM은 데이터베이스의 테이블과 객체를 매핑해주는 ORM 방식의 한 종류라고 생각하면 된다.

 

Hibernate ORM은 JPA를 자바 코드로 구현해놓은 것이라고 생각하면 되는데, 여기서 JPA라는 개념이 새로 등장한다.

JPA (Java Persistence API)는 어려운 개념은 아니고 자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스일 뿐이다. 

 

예시로 이전 글과 같이 Person class를 Hibernate ORM으로 구현해보자.

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.NamedQuery;
import javax.persistence.GeneratedValue;
import javax.persistence.GeneratedType;

@Entity
@Table(name="person")
@NamedQuery(
	name ="findPersonByEmail"
    query = "from Person where email like :email")
public class Person {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id")
    private int id;
    
    @Column(name="first_name")
    private String firstName;
    
    @Column(name="last_name")
    private String lastName;
    
    @Column(name="email")
    private String email;
    
    public Person() {}
 
    public Person(String firstName, String lastName, String email) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getFirstName() {
        return firstName;
    }
 
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
 
    public String getLastName() {
        return lastName;
    }
 
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
 
    public String getEmail() {
        return email;
    }
 
    public void setEmail(String email) {
        this.email = email;
    }
 
    @Override
    public String toString() {
        return "Person [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + "]";
    }
}

 

코드 시작부분에 @Entity라는 annotation을 확인할 수 있는데 @Entity annotation을 통해 ORM에서는 Entity class를 만들어준다. Hibernate ORM은 자바 객체를 DB 테이블과 연결시킬 때 바로 연결시키지 않고 자바 객체를 Entity class로 변환시킨 뒤 그 뒤에 DB 테이블과 연결시킨다. 여기서도 @Entity를 통해 Entity class를 생성한 것이다. 

 

@table, @column은 각각 table과 column 과 연결시키겠다는 것이고, 

 

또 다른 annotation인 

@NamedQuery를 사용하여 JPQL (Java Persistence Query Language) 쿼리를 entity 기반으로 작성하면 된다. 

 

@GeneratedValue(strategy = GenerationType.AUTO)

위의 annotation을 사용하면 주 키를 어떤 방식으로 생성할 것인지 기술할 수 있다. GenerationType.AUTO라는 것은 primary key( 이 경우에는 ID) 가 자동생성되도록 지정하였다는 뜻이다. 

 

여기에는 대표적인 annotation 몇 개들만 소개를 했지만

java.persistence

패키지에 들어가면 더 많은 종류의 annotation들을 확인할 수 있다.