Post

ORM(Object-Relational Mapping)

ORM(Object-Relational Mapping)은 객체 지향 프로그래밍 언어를 사용하여 관계형 데이터베이스를 다룰 수 있도록 중간 매핑 역할을 해주는 기술입니다. 객체 모델과 데이터베이스의 관계 모델 간 불일치를 해결하고 데이터베이스 작업을 코드로 추상화하는 것이 핵심입니다. Java에서는 ORM 도구로 Hibernate, JPA(Java Persistence API), MyBatis 등이 자주 사용됩니다.

주요 개념

  • 객체 지향 세계: Java 클래스와 객체는 데이터와 행동(메서드)을 캡슐화합니다.
  • 관계형 데이터베이스: 데이터는 테이블, 행, 열로 구조화되어 저장됩니다.
  • ORM은 객체의 속성과 데이터베이스 테이블 간 매핑을 정의하여 데이터베이스를 객체처럼 다룰 수 있게 합니다.

장점

  1. 생산성: SQL을 직접 작성하지 않아도 되므로 개발자가 객체를 사용해 더 높은 수준의 추상화로 작업할 수 있습니다.
  2. 유지보수성: 객체와 매핑된 테이블 간 변경 사항을 관리하기 쉽습니다.
  3. 독립성: 데이터베이스에 종속되지 않는 코드 작성이 가능해 데이터베이스를 변경해도 코드의 수정이 최소화됩니다.
  4. 캐싱: ORM 도구는 1차 및 2차 캐싱을 통해 성능을 향상시킬 수 있습니다.

Java에서 ORM 예시: JPA와 Hibernate

JPA(Java Persistence API)

JPA는 Java EE의 표준 ORM 사양입니다. 인터페이스만 정의하며, Hibernate, EclipseLink 등 구현체를 통해 동작합니다.

Hibernate

Hibernate는 JPA의 구현체로, Java에서 가장 널리 사용되는 ORM 도구입니다.

간단한 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity *// 이 클래스는 데이터베이스 테이블과 매핑됩니다.*
public class User {
    @Id *// 이 필드는 Primary Key로 사용됩니다.*
    private Long id;
    private String name;
    private String email;

    *// Getters and Setters*
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}

Repository를 사용한 데이터 접근

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class UserRepository {
    private EntityManagerFactory emf = Persistence.createEntityManagerFactory("example-unit");

    public void saveUser(User user) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin(); *// 트랜잭션 시작*
        em.persist(user);           *// 데이터베이스에 객체 저장*
        em.getTransaction().commit(); *// 트랜잭션 커밋*
        em.close();
    }
}

공식 문서

사용 시 주의점

  1. 지연 로딩(Lazy Loading):
    • 필요할 때 데이터를 로드하므로 성능에 유리하지만, 예상치 못한 LazyInitializationException이 발생할 수 있습니다.
  2. N+1 문제:
    • 데이터베이스 쿼리가 비효율적으로 생성될 수 있으므로 페치 전략을 조정해야 합니다.
  3. 데이터베이스 종속성:
    • ORM이 SQL 생성 규칙을 따르므로 데이터베이스의 고유 기능은 사용이 제한될 수 있습니다.
This post is licensed under CC BY 4.0 by the author.