ORM(Object-Relational Mapping)
ORM(Object-Relational Mapping)은 객체 지향 프로그래밍 언어를 사용하여 관계형 데이터베이스를 다룰 수 있도록 중간 매핑 역할을 해주는 기술입니다. 객체 모델과 데이터베이스의 관계 모델 간 불일치를 해결하고 데이터베이스 작업을 코드로 추상화하는 것이 핵심입니다. Java에서는 ORM 도구로 Hibernate, JPA(Java Persistence API), MyBatis 등이 자주 사용됩니다.
주요 개념
- 객체 지향 세계: Java 클래스와 객체는 데이터와 행동(메서드)을 캡슐화합니다.
- 관계형 데이터베이스: 데이터는 테이블, 행, 열로 구조화되어 저장됩니다.
- ORM은 객체의 속성과 데이터베이스 테이블 간 매핑을 정의하여 데이터베이스를 객체처럼 다룰 수 있게 합니다.
장점
- 생산성: SQL을 직접 작성하지 않아도 되므로 개발자가 객체를 사용해 더 높은 수준의 추상화로 작업할 수 있습니다.
- 유지보수성: 객체와 매핑된 테이블 간 변경 사항을 관리하기 쉽습니다.
- 독립성: 데이터베이스에 종속되지 않는 코드 작성이 가능해 데이터베이스를 변경해도 코드의 수정이 최소화됩니다.
- 캐싱: 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();
}
}
공식 문서
- JPA 공식 문서 (Oracle): https://docs.oracle.com/javaee/7/tutorial/persistence-intro.htm
- Hibernate 공식 문서: https://hibernate.org/documentation/
사용 시 주의점
- 지연 로딩(Lazy Loading):
- 필요할 때 데이터를 로드하므로 성능에 유리하지만, 예상치 못한 LazyInitializationException이 발생할 수 있습니다.
- N+1 문제:
- 데이터베이스 쿼리가 비효율적으로 생성될 수 있으므로 페치 전략을 조정해야 합니다.
- 데이터베이스 종속성:
- ORM이 SQL 생성 규칙을 따르므로 데이터베이스의 고유 기능은 사용이 제한될 수 있습니다.
This post is licensed under CC BY 4.0 by the author.