티스토리 뷰
ORM이란 무엇인가? JPA 포함 개념 정리와 SQL과의 차이
Java나 Spring Boot를 공부하다 보면 JPA, Hibernate, Entity, 영속성 컨텍스트 같은 용어를 자주 보게 됩니다. 그런데 이 용어들을 제대로 이해하려면 가장 먼저 ORM부터 정확히 잡아야 합니다.
많은 분들이 JPA = ORM 정도로 이해하지만, 정확히는 다릅니다.
이번 글에서는 ORM이 무엇인지, 왜 필요한지, SQL과 어떤 차이가 있는지, 그리고 JPA와 Hibernate는 어떤 관계인지까지 흐름대로 정리해보겠습니다.
ORM은 Object Relational Mapping의 약자입니다. 우리말로 하면 객체-관계 매핑입니다.
쉽게 말하면,
자바 객체와 관계형 데이터베이스 테이블을 연결해서, 데이터를 SQL 문자열보다 객체 중심으로 다루게 해주는 방식
입니다.
예를 들어 데이터베이스에는 아래처럼 member 테이블이 있다고 가정해보겠습니다.
CREATE TABLE member (
id BIGINT PRIMARY KEY,
name VARCHAR(100),
age INT
);
자바에서는 보통 이렇게 객체로 표현합니다.
public class Member {
private Long id;
private String name;
private int age;
}
ORM은 이 둘 사이를 연결합니다.
- 테이블의 한 행(row)을 객체 하나로 보고
- 컬럼(column)을 객체의 필드로 보고
- CRUD 작업을 객체 조작 중심으로 처리하게 도와줍니다.
자바 애플리케이션은 객체지향으로 동작하지만, 데이터베이스는 테이블 중심으로 동작합니다. 문제는 이 둘의 사고방식이 꽤 다르다는 점입니다.
즉, ORM은 단순 편의 기능이 아니라 객체 세계와 DB 세계 사이의 구조적 차이를 줄이기 위한 도구입니다.
ORM 없이 JDBC나 MyBatis처럼 SQL 중심으로 작업하면, 개발자가 직접 아래를 계속 처리해야 합니다.
- SQL 작성
- 파라미터 바인딩
- ResultSet 매핑
- 객체 생성 및 필드 세팅
- 연관관계 데이터 조립
예를 들어 저장 로직은 보통 이런 흐름이 됩니다.
String sql = "INSERT INTO member(name, age) VALUES (?, ?)";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, member.getName());
ps.setInt(2, member.getAge());
ps.executeUpdate();
조회도 직접 매핑해야 합니다.
String sql = "SELECT id, name, age FROM member WHERE id = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setLong(1, id);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
Member member = new Member();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
member.setAge(rs.getInt("age"));
}
이 방식은 제어가 명확하다는 장점이 있지만, 프로젝트가 커질수록 반복 코드와 매핑 코드가 빠르게 늘어납니다.
ORM을 사용하면 데이터를 다루는 중심이 SQL 문자열에서 객체로 이동합니다.
예를 들어 JPA를 쓰면 저장은 이렇게 할 수 있습니다.
Member member = new Member();
member.setName("Kim");
member.setAge(30);
entityManager.persist(member);
조회도 객체 중심입니다.
Member member = entityManager.find(Member.class, 1L);
즉,
- 개발자는 객체를 저장하고
- ORM이 적절한 SQL을 생성하고
- DB 결과를 다시 객체로 매핑합니다.
바로 이 지점이 ORM의 핵심 가치입니다.
정리하면 아래 3단으로 이해하면 됩니다.
즉,
ORM은 큰 개념이고JPA는 자바 진영의 표준이며Hibernate는 그 표준을 구현한 대표 엔진입니다.
그래서 JPA = ORM 그 자체라고 보기보다는, 자바에서 ORM을 쓰는 표준 규약이 JPA라고 이해하는 편이 정확합니다.
오히려 SQL을 더 전략적으로 다루게 해주는 기술에 가깝습니다.
| 구분 | 직접 SQL 중심 | ORM 중심 |
|---|---|---|
| 개발 관점 | 테이블과 쿼리 중심 | 객체와 도메인 중심 |
| 장점 | 정밀한 제어와 예측 가능성이 높습니다. | 생산성이 높고 반복 코드를 줄이기 쉽습니다. |
| 단점 | 매핑 코드와 SQL 관리 부담이 커집니다. | 추상화 뒤에 숨은 성능 문제를 놓치기 쉽습니다. |
| 잘 맞는 상황 | 복잡한 조회, 통계, 집계, 리포트 | 일반 CRUD, 서비스 로직, 도메인 모델 중심 개발 |
실무에서는 둘 중 하나만 고집하기보다, ORM을 기본으로 사용하되 필요한 구간에서 직접 SQL을 병행하는 방식이 가장 현실적입니다.
아래처럼 Member 엔티티가 있다고 가정해보겠습니다.
import jakarta.persistence.*;
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int age;
protected Member() {
}
public Member(String name, int age) {
this.name = name;
this.age = age;
}
}
저장은 이렇게 할 수 있습니다.
Member member = new Member("Park", 29);
entityManager.persist(member);
조회는 이렇게 합니다.
Member findMember = entityManager.find(Member.class, member.getId());
수정도 객체 상태를 바꾸면 됩니다.
findMember.changeName("Kim");
여기서 중요한 점은 개발자가 직접 UPDATE member SET ...를 쓰지 않아도, ORM이 상태 변화를 감지해서 필요한 SQL을 실행할 수 있다는 것입니다. 이걸 변경 감지(Dirty Checking) 라고 합니다.
ORM을 단순히 “SQL을 안 써도 되는 기술”로만 배우면 금방 막힙니다. 처음부터 아래 개념은 같이 보는 게 좋습니다.
- 엔티티(Entity)
- 영속성 컨텍스트(Persistence Context)
- 1차 캐시
- 지연 로딩(Lazy Loading)
- 즉시 로딩(Eager Loading)
- 변경 감지(Dirty Checking)
- flush
- N+1 문제
특히 JPA를 공부한다면, ORM 기초 → 엔티티 매핑 → 영속성 컨텍스트 → 연관관계 매핑 순서로 들어가면 훨씬 이해가 쉽습니다.
ORM이 잘 맞는 구간
- 기본 CRUD
- 도메인 모델 중심 로직
- 생성/수정/단건 조회 중심 기능
- 생산성이 중요한 서비스 로직
직접 SQL이 더 나은 구간
- 복잡한 통계 쿼리
- 대용량 배치 처리
- 다중 조인 기반 리포트
- 성능 튜닝이 민감한 조회
즉, ORM과 SQL은 경쟁 관계가 아니라 역할 분담 관계로 보는 편이 맞습니다.
실무에서 강한 개발자는 ORM만 아는 사람이 아니라, ORM이 잘하는 일과 SQL이 잘하는 일을 구분해서 쓰는 사람입니다.
초보 단계에서는 우선 이렇게 기억하면 충분합니다.
ORM은 객체와 DB를 연결해 주는 다리이고, JPA는 자바에서 그 다리를 건너는 표준입니다.
'IT > SQL·DB' 카테고리의 다른 글
| 실행계획(Execution Plan) 보는 방법, 느린 쿼리 잡는 핵심 (0) | 2026.03.25 |
|---|---|
| 데이터베이스 정규화 vs 반정규화, 언제 써야 할까? (0) | 2026.03.25 |
| 데이터베이스 Key 종류 총정리, 기본키·외래키·후보키·슈퍼키 쉽게 이해하기 (0) | 2026.03.25 |
| SQL JOIN 완벽 정리, INNER JOIN·LEFT JOIN·RIGHT JOIN 차이 한 번에 이해하기 (0) | 2026.03.24 |
| [MariaDB] CentOS7에 MariaDB 설치 (0) | 2022.08.04 |

