ORM(Object-Relational Mapping)이란?
객체와 관계형 데이터베이스(RDB)를 매핑해주는 기술이다.
(ORM = 객체 관계형 매핑)
왜 ORM이 필요할까?
객체 지향 언어(Java)는 '객체' 중심이고, 관계형 DB는 '테이블' 중심이다. 이 둘은 서로 구조 자체가 다르기 때문에, 데이터를 주고받을 때 복잡한 SQL을 직접 작성해야 하는 번거로움이 있다.
예를 들어 객체 지향 언어와 관계형 DB의 구조는 아래와 같은 차이가 있다. 이 둘은 각자의 속성을 중심으로 데이터를 다룬다.
- 객체 지향 : 객체, 캡슐화, 상속, 다형성
- 관계형 DB : 테이블, 컬럼, FK, JOIN
아래 예시를 보면 구조의 차이가 있기에 매핑이라는 절차가 필요하다는 것을 알 수 있다. 이 두 세계는 데이터를 바라보는 관점 자체가 다르기 때문에, 개발자가 중간에서 SQL을 하나하나 작성하며 데이터를 매핑하는 과정이 매우 번거롭고 오류가 생기기 쉽다.
객체 지향 언어
class Member {
Team team;
}
관계형 DB
member 테이블
- team_id (FK)
즉, ORM은 객체 지향 언어의 객체와 관계형 DB의 테이블을 매핑해서, SQL을 직접 쓰지 않고도 DB를 다룰 수 있게 해주는 기술이다.
ORM 이전에는 어떻게 데이터를 다뤘을까?
Spring 환경에서 JPA(ORM)이 대중화되어 쓰이기 이전에는 JDBC → JdbcTemplate → MyBatis 같은 SQL 매퍼 방식으로 데이터를 다뤘다.
기존 SQL 중심 개발의 한계 (ORM 이전)
- 테이블 구조나 컬럼명 변경 시 SQL 전부 수정해야 함
- DB에 종속적인 SQL 작성 (자바 객체 만들고, DB에 저장하기 위해 매번 복잡한 SQL문을 직접 작성해야 함)
- DB에서 데이터를 가져올 때도 SQL-객체 매핑 시 번거로움.
- 비즈니스 로직 + SQL 섞임 -> 유지보수 면에서 효율적이지 않음!
- 매핑 코드가 다음과 같이 중복됨.
// ResultSet으로 결과를 받아와 하나씩 객체에 옮겨 담는 노가다 시절
User user = new User();
user.setId(rs.getLong("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
ORM을 사용했을 때 뭐가 좋을까?
- 생산성 향상: 반복적인 CRUD SQL을 직접 작성하지 않아도 됨
- 객체지향적인 코드: 개발자는 객체만 다룸으로써 비즈니스 로직에 더 집중할 수 있으며, 코드를 좀 더 직관적으로 작성 가능
- 유지보수 용이: 테이블 설계가 변경되어도 클래스의 필드만 수정하면 됨.
- DB 독립성: 데이터베이스 종류가 바뀌어도(예: MySQL -> PostgreSQL) 설정만 바꾸면 됨. SQL 문법의 미세한 차이를 ORM이 알아서 처리해 준다.
ORM이나 JPA이나 똑같은거 아닌가?
ORM은 객체와 관계형 DB를 매핑하는 개념이고, JPA는 Java 진영에서 그 ORM 개념을 표준화한 명세이다. 그러므로 JPA가 ORM 그 자체라고 볼 수는 없다. JPA는 ORM을 어떻게 쓰는지에 대한 Java 표준이다.
ORM에서의 핵심 개념들
ORM의 핵심은 SQL을 대신 써주는 게 아니라, 엔티티의 상태 변화를 영속성 컨텍스트가 관리하고, 그 결과를 트랜잭션 시점에 SQL로 반영하는 구조이다. 이 과정을 가능하게 만드는 핵심적인 개념들은 아래와 같다.
엔티티
- DB 테이블과 매핑되는 객체
- ORM이 추적해야 할 대상
- 필드 <-> 컬럼
- 클래스 <-> 테이블
@Entity
class User {
@Id Long id;
String name;
}
영속성 컨텍스트
엔티티를 관리하는 1차 캐시 공간
1차 캐시
User u1 = em.find(User.class, 1L);
User u2 = em.find(User.class, 1L);
// SQL 1번만 실행
변경 감지(Dirth Checking)
User user = em.find(User.class, 1L);
user.setName("변경");
// commit 시점에 자동 UPDATE
쓰기 지연
- SQL을 모아뒀다가 commit 시점에 실행
- 성능 최적화
em.persist(user1);
em.persist(user2);
// 아직 INSERT 안 날아감
transaction.commit();
// 이때 한 번에 INSERT
| Entity | DB와 동기화할 관리 대상 객체 |
| 영속성 컨텍스트 | 객체 상태를 추적·관리하는 런타임 공간 |
| 쓰기 지연 | SQL 실행 시점을 제어하는 동기화 전략 |
참고
https://aws.amazon.com/ko/what-is/object-relational-mapping/
객체 관계형 매핑(ORM)이란 무엇인가요? - 객체 관계형 매핑 설명됨 - AWS
객체 관계형 매핑(ORM)이란 무엇이며, 기업에서 객체 관계형 매핑(ORM)을 사용하는 방법과 이유, AWS에서 객체 관계형 매핑(ORM)을 사용하는 방법에 대해 알아보세요.
aws.amazon.com
https://eun-jeong.tistory.com/31
[DB] ORM (Object Relational Mapping) 사용 이유, 장단점
ORM (Object Relational Mapping) 객체지향적 구조? 모든 데이터는 객체이며, 각 객체는 독립된 데이터와 독립된 함수를 지님 SQL 구조? 데이터는 테이블 단위로 관리되며 객체들을 조회하기 위한 명령어
eun-jeong.tistory.com
'TIL' 카테고리의 다른 글
| [TIL] JPA 엔티티 생명주기 (0) | 2026.01.28 |
|---|---|
| [TIL] JPA 동작 원리 (0) | 2026.01.27 |
| [TIL] AWS와 k8s (0) | 2025.10.28 |
| [TIL] 무중단배포에 대해 (0) | 2025.10.28 |
| [TIL] jakarta vs springframework Transactional (0) | 2025.10.02 |