⚡ Hibernate ?
하이버네이트(Hibernate)는 자바 언어로 작성된 오픈 소스 ORM(Object-Relational Mapping) 프레임워크다. 하이버네이트의 설계 목표는 SQL과 JDBC를 사용한 수동 데이터 지속성 관련 프로그래밍 작업의 95%를 개발자가 해방시키는데 있다고 한다. 그렇다고 해서 SQL을 모르면 안 되며 오히려 더 많은 기술과 지식에 대한 투자가 필요하다.
객체 지향 프로그래밍에서 사용되는 클래스와 관계형 데이터베이스 테이블 간의 매핑을 단순화하고 추상화하여 개발자가 데이터베이스를 다루는 작업을 더욱 편리하게 하기 위해서 만들어졌다. 조금 더 쉽게 설명해서 JAVA 클래스를 통해서 Oracle, mssql, mraia 등의 DB에 상관없이 일관된 코드로 데이터 베이스 작업을 할 수 있도록 도와준다고 생각하면 된다.
⭕ ORM (Object - Relational Mapping: 객체 관계 매핑)
ORM(Object-Relational Mapping)은 객체 지향 프로그래밍 언어와 관계형 데이터베이스 간의 데이터를 변환하는 기술이다. 객체 지향 언어에서 사용되는 객체를 관계형 데이터베이스의 테이블로 매핑하고, 객체 간의 관계를 관계형 데이터베이스의 관계로 매핑하는 것을 의미한다.
[핵심 개념 정리]
- 객체-관계 매핑(Object-Relational Mapping)
▶ 객체 지향 프로그래밍 데이터 모델링 : 클래스, 객체, 상속, 다형성등
▶ 관계형 데이터 베이스 데이터 모델링 : 테이블, 레코드, 관계등
ORM은 서로 다른 차이를 극복하고 개발자가 객체를 사용해서 데이터 베이스를 조작하도록 도와준다 - 객체 관리(Object Management)
객체의 생명주기를 관리 한다. 객체의 상태 변화를 감지하고 데이터베이스에 반영하는 것을 담당한다
(데이터 베이스를 DB에 저장하거나 업데이트, 다시 조회 하는 작업을 포함한다.) - 쿼리 작성과 실행
SQL 쿼리를 자동으로 생성하고 실행한다. 쿼리를 직접 작성하는 대신 ORM이 제공하는 객체 지향적인 인터페이스를 사용하여 데이터를 CRUD 한다. 대신 개발자 입장에서 객체를 통해서 데이터 베이스를 조작 가능 하도록 API를 제공 해준다. - 성능 최적화
성능 최적화를 위한 다양한 기능을 제공한다.
ex)캐싱, 지연로딩, 배치 처리 등
자체적으로 해준다고 하더라도 대용량 데이터를 처리 할때는 그냥 JDBC를 통해서 데이터 베이스를 조작 하는게 성능에는 좋다고 생각한다. - 데이터베이스 독립성
다양한 종류의 데이터베이스와 호환 된다. 데이터베이스를 변경하더라도 코드를 수정할 필요가 없다:)
ORM의 강력한 무기중 하나라고 생각이 되며, 데이터 베이스를 변경 했을때 코드를 수정하는 경우도 있다.
각 데이터 베이스에서 기본적으로 제공되는 함수가 아닌 다른 기능을 써야 한다면 따로 설정을 해야 하는데 이때 코드를 수정해야 하는 경우가 발생한다.
(기본적인 방언만 설정 하고 사용 한다면 코드를 수정하는 경우는 발생하지 않음)
개발자가 데이터 베이스에 접근해서 SQL을 작업 하는 부분에 대해서 생산성과 효율성을 높이려고 했다고 볼수 있다.
⭕ JPA (Java Persistence API)
Java 에서 제공 해주는 ORM 기술 표준으로 사용하는 인터페이스 모음 이다.
인터페이스이기때문에 JPA를 이용해서 구현한 구현체가 필요하며 대표적으로 Java 에서 사용하는 구현체는 Hibernate가 있다.
[핵심 구성 요소]
- Entity 클래스
데이터베이스의 테이블과 1:1로 맵핑되는 Entity 클래스를 정의한다.
JAVA | DB |
클래스 | 레코드 |
필드 | 컬럼 |
@Getter
@Setter
// Entity 사용 어노테이션 추가.
@Entity
// 해당 Entity와 맵핑되는 테이블 이름 지정.
@Table(name = "user")
public class User {
// 주요 식별자 (테이블의 기본키)
@Id
// 자동 증가값인 경우 선언 한다. (옵션 확인 필요)
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="uid")
private Long uid;
// @Column 어노테이션에도 다양한 옵션이 있으니 확인 필요.
@Column(name="user_name")
private String userName;
}
- EntityManager
JAP에서 가장 중요한 인터페이스 중 하나이다. Entity의 CRUD 작업을 수행한다.
// EntityManagerFactory를 bean으로 생성 해야한다.
@Test
public void test() {
private final EntityManager entityManager;
public testEntityManager() {
// 조회
User userSelect = entityManager.find(User.class, 1L);
entityManager.getTransaction().begin();
// 저장
User newUser = new User();
newUser.setUid(1L);
newUser.setUserName("test");
entityManager.persist(newUser);
entityManager.getTransaction().commit();
// 수정
User userUpdate = entityManager.find(User.class, 1L);
userUpdate.setUserName("testUpdate");
// 삭제
User userDelete = entityManager.find(User.class, 1L);
entityManager.remove(userDelete);
entityManager.getTransaction().commit();
entityManager.close();
}
}
간단하게 EntityManager 를 사용해서 CRUD를 사용하는 방법에 대해서 적어보았다. 개념적으로 어떻게 사용하는지 보여주기 위해서 작성을 했기 때문에 실제 동작을 하게 하려면 팩토리도 생성해줘야 한다. 자세한 내용은 나중에 실제 설정 하고 구현한 샘플 데이터를 공유 하도록 하겠다.
🔥 추가 내용 🔥
JPA와 Spring Data JPA 는 같다고 생각하면 안된다.
Spring Data JPA는 Sping에서 JPA 기반 개발을 더 편하게 해주는 라이브러리이다.
간단하게 차이점에 대해서 얘기 하면 개발을 할때 Repository를 사용 하면 Sping 라이브러리를 사용하고 있는거다.
아마 바로 Spring 라이브러리를 썼다면 EntityManager에 대해서 사용해본적이 없을것이다.
⚡ 동작 방식
동작방식에 대해서 설명을 하려고 내용을 정리 했지만 뭔가 설명 보다는 이미지가 좋다고 생각을 했고 찾아보는 과정에서 발견했으며 참조해서 이해하면 좋을거 같다.
'Java' 카테고리의 다른 글
[JAVA] stream forEach 에 관한 내용 정리 (0) | 2023.09.16 |
---|---|
[JAVA] String isEmpty 및 isBlank 사용 정리 (0) | 2023.07.29 |
[Java] Wrapper Class 의 캐싱에 대한 내용 정리 (0) | 2023.04.16 |
[JAVA] Stream에 대한 사용법 및 내용 정리 (0) | 2023.02.26 |
[JPA] QueryDsl에서 Date Type 사용 방법 정리 (0) | 2023.02.05 |