티스토리 뷰

300x250

ORM이란 무엇인가? JPA 포함 개념 정리와 SQL과의 차이

Java나 Spring Boot를 공부하다 보면 JPA, Hibernate, Entity, 영속성 컨텍스트 같은 용어를 자주 보게 됩니다. 그런데 이 용어들을 제대로 이해하려면 가장 먼저 ORM부터 정확히 잡아야 합니다.

많은 분들이 JPA = ORM 정도로 이해하지만, 정확히는 다릅니다.

먼저 핵심부터
ORM은 객체와 관계형 데이터베이스를 매핑하는 방식입니다.
JPA는 자바에서 ORM을 사용하기 위한 표준 명세입니다.
Hibernate는 JPA를 실제로 동작하게 만드는 대표 구현체입니다.

이번 글에서는 ORM이 무엇인지, 왜 필요한지, SQL과 어떤 차이가 있는지, 그리고 JPA와 Hibernate는 어떤 관계인지까지 흐름대로 정리해보겠습니다.

ORM은 정확히 무엇일까?
객체와 테이블을 연결하는 방식부터 먼저 이해하면 뒤가 훨씬 쉬워집니다.

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은 이 둘이 서로 번역되도록 도와주는 중간 계층입니다.
728x90
왜 ORM이 필요할까?
객체지향 애플리케이션과 관계형 DB는 생각하는 방식 자체가 다릅니다.

자바 애플리케이션은 객체지향으로 동작하지만, 데이터베이스는 테이블 중심으로 동작합니다. 문제는 이 둘의 사고방식이 꽤 다르다는 점입니다.

객체 세계 관계형 DB 세계
참조, 상속, 캡슐화, 상태와 행동 중심 테이블, 컬럼, PK/FK, 조인 중심
객체 간 관계를 필드와 참조로 표현 관계를 외래 키와 조인으로 표현
코드 구조와 도메인 의미가 중요 데이터 정합성과 조회 효율이 중요

즉, ORM은 단순 편의 기능이 아니라 객체 세계와 DB 세계 사이의 구조적 차이를 줄이기 위한 도구입니다.

ORM 없이 개발하면 어떤 일이 생길까?
직접 SQL 중심 개발은 분명한 장점이 있지만, 반복 작업도 많이 생깁니다.

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을 없애는 것이 아니라, 반복되는 매핑 작업을 줄이고 도메인 중심으로 코드를 짜게 하는 데 있습니다.
ORM을 쓰면 무엇이 달라질까?
SQL 문자열 중심에서 객체 중심으로 사고가 옮겨갑니다.

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의 핵심 가치입니다.

JPA는 ORM과 어떤 관계일까?
여기서 가장 많이 헷갈립니다. 개념, 표준, 구현체를 분리해서 보면 쉽습니다.

정리하면 아래 3단으로 이해하면 됩니다.

ORM
객체와 관계형 DB를 매핑해서 다루는 개념 또는 방식
JPA
자바에서 ORM을 사용하기 위한 표준 명세
Hibernate
JPA를 실제로 동작하게 만드는 대표 구현체

즉,

  • ORM은 큰 개념이고
  • JPA는 자바 진영의 표준이며
  • Hibernate는 그 표준을 구현한 대표 엔진입니다.

그래서 JPA = ORM 그 자체라고 보기보다는, 자바에서 ORM을 쓰는 표준 규약이 JPA라고 이해하는 편이 정확합니다.

ORM의 장점과 단점은 무엇일까?
실무에서는 장점만 보고 들어가면 중간에 반드시 막히게 됩니다.
장점 단점
객체 중심 개발이 가능하고 반복 SQL/매핑 코드를 크게 줄일 수 있습니다. 내부 동작을 모르면 성능 문제와 디버깅 난도가 빠르게 올라갑니다.
기본 CRUD와 도메인 모델 중심 개발에서 생산성이 높습니다. 복잡한 조회, 집계, 대용량 처리에서는 결국 SQL 이해가 필요합니다.
변경 감지, 1차 캐시, 지연 로딩 같은 편의 기능을 활용할 수 있습니다. 추상화가 복잡함을 숨겨서 N+1 같은 문제를 늦게 발견하기 쉽습니다.
정말 중요한 포인트
ORM은 SQL을 몰라도 되는 기술이 아닙니다.
오히려 SQL을 더 전략적으로 다루게 해주는 기술에 가깝습니다.
SQL 중심 개발과 ORM 중심 개발은 무엇이 다를까?
둘은 경쟁 관계라기보다 역할 분담 관계로 보는 편이 맞습니다.
구분 직접 SQL 중심 ORM 중심
개발 관점 테이블과 쿼리 중심 객체와 도메인 중심
장점 정밀한 제어와 예측 가능성이 높습니다. 생산성이 높고 반복 코드를 줄이기 쉽습니다.
단점 매핑 코드와 SQL 관리 부담이 커집니다. 추상화 뒤에 숨은 성능 문제를 놓치기 쉽습니다.
잘 맞는 상황 복잡한 조회, 통계, 집계, 리포트 일반 CRUD, 서비스 로직, 도메인 모델 중심 개발

실무에서는 둘 중 하나만 고집하기보다, ORM을 기본으로 사용하되 필요한 구간에서 직접 SQL을 병행하는 방식이 가장 현실적입니다.

JPA 예제로 보면 ORM 감각이 더 빨리 잡힌다
개념만 보면 추상적으로 느껴질 수 있어, 저장과 조회 흐름을 함께 보는 편이 좋습니다.

아래처럼 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을 처음 배울 때 같이 알아야 할 개념
이 부분을 빼고 배우면 JPA가 중간부터 갑자기 어려워집니다.

ORM을 단순히 “SQL을 안 써도 되는 기술”로만 배우면 금방 막힙니다. 처음부터 아래 개념은 같이 보는 게 좋습니다.

  • 엔티티(Entity)
  • 영속성 컨텍스트(Persistence Context)
  • 1차 캐시
  • 지연 로딩(Lazy Loading)
  • 즉시 로딩(Eager Loading)
  • 변경 감지(Dirty Checking)
  • flush
  • N+1 문제

특히 JPA를 공부한다면, ORM 기초 → 엔티티 매핑 → 영속성 컨텍스트 → 연관관계 매핑 순서로 들어가면 훨씬 이해가 쉽습니다.

실무에서는 ORM을 어디까지 믿어야 할까?
실무에서 중요한 것은 옳고 그름보다, 어떤 작업에 무엇이 맞는지 구분하는 감각입니다.

ORM이 잘 맞는 구간

  • 기본 CRUD
  • 도메인 모델 중심 로직
  • 생성/수정/단건 조회 중심 기능
  • 생산성이 중요한 서비스 로직

직접 SQL이 더 나은 구간

  • 복잡한 통계 쿼리
  • 대용량 배치 처리
  • 다중 조인 기반 리포트
  • 성능 튜닝이 민감한 조회

즉, ORM과 SQL은 경쟁 관계가 아니라 역할 분담 관계로 보는 편이 맞습니다.

실무에서 강한 개발자는 ORM만 아는 사람이 아니라, ORM이 잘하는 일과 SQL이 잘하는 일을 구분해서 쓰는 사람입니다.

마무리 정리
ORM은 객체와 관계형 DB 사이의 차이를 줄여서, 개발자가 객체 중심으로 데이터를 다룰 수 있게 도와주는 방식입니다. 그리고 JPA는 자바에서 그 ORM을 쓰기 위한 표준 명세입니다.
ORM = 객체와 테이블을 매핑하는 개념
JPA = 자바 ORM 표준
Hibernate = JPA 구현체
핵심 시각 = SQL은 사라지는 것이 아니라 여전히 중요하다

초보 단계에서는 우선 이렇게 기억하면 충분합니다.

ORM은 객체와 DB를 연결해 주는 다리이고, JPA는 자바에서 그 다리를 건너는 표준입니다.
728x90
댓글
반응형
최근에 올라온 글
글 보관함
«   2026/04   »
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