ORM이란?

2coconut·2025년 7월 16일

백엔드 개발을 하다 보면 반드시 데이터베이스와 연동해야 하는 순간이 온다. 이때 등장하는 것이 바로 ORM(Object-Relational Mapping)이다. ORM이 무엇인지, 왜 필요한지, 어떤 장단점이 있는지 차근차근 알아보자.

영속성(Persistence)이란?

영속성(Persistence)은 프로그램이 종료되어도 데이터가 사라지지 않는 특성을 말한다.

예를 들어, 메모리에 저장된 변수는 프로그램이 끝나면 사라지지만, 데이터베이스에 저장된 데이터는 프로그램이 종료되어도 계속 남아있다. 이처럼 데이터를 영구적으로 보존하는 것이 영속성이다.

데이터베이스 접근 방법의 발전

Java에서 데이터베이스에 접근하는 방법은 다음과 같이 발전해왔다

  1. JDBC: SQL을 직접 작성 (복잡하고 반복적)
  2. Spring JDBC: JDBC 단순화 (여전히 SQL 직접 작성)
  3. Persistence Framework:
    • SQL Mapper (MyBatis): SQL 중심
    • ORM (JPA/Hibernate): 객체 중심

ORM이란?

ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스를 자동으로 연결해주는 기술이다.

간단한 예시

// 기존 SQL 방식
String sql = "SELECT * FROM users";
// 복잡한 JDBC 코드...

// ORM 방식  
List<User> users = userRepository.findAll();

ORM을 사용하면 SQL을 직접 작성하지 않고도 데이터베이스 작업을 할 수 있다.

ORM의 핵심 역할

  • 자동 매핑: 객체 ↔ 테이블, 필드 ↔ 컬럼
  • 자동 SQL 생성: 메서드 호출을 SQL로 변환
  • 타입 변환: 언어 타입 ↔ DB 타입 자동 변환

왜 ORM이 필요할까?

1. 객체지향과 관계형 DB의 패러다임 불일치

객체지향 프로그래밍은 클래스와 상속, 다형성을 사용하지만, 관계형 데이터베이스는 테이블과 외래키를 사용한다. 이 두 모델 간에는 근본적인 차이가 있다.

2. 반복적인 CRUD 코드

기존 JDBC 방식에서는 매번 동일한 패턴의 코드를 반복해서 작성해야 했다:

// JDBC 방식 - 반복적인 코드
String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setLong(1, userId);
ResultSet rs = pstmt.executeQuery();
// ResultSet을 User 객체로 변환하는 코드...

3. SQL에 의존적인 개발

테이블 구조가 변경되면 관련된 모든 SQL을 수정해야 하는 문제가 있었다.

ORM의 장점

1. 생산성 향상

// ORM 방식 - 간단한 메서드 호출
User user = userRepository.findById(userId);
List<User> users = userRepository.findAll();
userRepository.save(user);
userRepository.delete(user);

복잡한 SQL 작성 없이 간단한 메서드 호출만으로 데이터베이스 작업이 가능하다.

2. 유지보수성

  • 테이블 구조 변경 시 매핑 정보만 수정하면 됨
  • SQL 직접 수정이 불필요
  • 코드의 가독성과 재사용성 향상

3. 데이터베이스 독립성

  • 특정 데이터베이스에 언제나 종속되지 않는다
  • MySQL에서 PostgreSQL로 변경해도 코드 수정 최소화
  • 방언(Dialect) 설정으로 DB별 차이 해결

4. 객체지향적 개발

  • 비즈니스 로직에 집중 가능
  • 데이터베이스 세부사항을 추상화
  • 도메인 모델 중심의 개발

ORM의 단점

1. 학습 비용

  • ORM 자체의 문법과 개념 학습 필요
  • 복잡한 쿼리 작성 시 어려움
  • 내부 동작 원리 이해 필요

2. 성능 이슈

  • 자동 생성된 SQL이 비효율적일 수 있음
  • N+1 문제 등의 성능 문제 발생 가능
  • 복잡한 조인이나 집계 함수 사용 시 한계

3. 복잡한 쿼리의 한계

  • 통계나 리포팅용 복잡한 쿼리는 직접 SQL 작성이 필요
  • 성능이 중요한 부분에서는 네이티브 쿼리 사용

주요 ORM 기술들

Java

JPA (Java Persistence API)

  • Java의 ORM 표준 명세
  • 인터페이스의 집합으로, 실제 구현체가 필요함

Hibernate

  • JPA의 가장 인기 있는 구현체
  • Spring Boot의 기본 JPA 구현체
  • 가장 성숙하고 안정적인 ORM

JavaScript/Node.js

Sequelize

// Sequelize 예시
const users = await User.findAll();
const user = await User.findByPk(1);
await User.create({ name: 'John', email: 'john@example.com' });
  • MySQL, PostgreSQL, SQLite 등 지원
  • Promise 기반의 비동기 처리

TypeORM

  • TypeScript를 완벽 지원하는 ORM
  • 데코레이터 기반의 엔티티 정의

Python

Django ORM

# Django ORM 예시
users = User.objects.all()
user = User.objects.get(id=1)
User.objects.create(name='John', email='john@example.com')
  • Django 프레임워크에 내장된 ORM
  • 파이썬스러운 문법으로 쉬운 사용

SQLAlchemy

  • Python의 가장 강력한 ORM
  • Core와 ORM 두 가지 사용 방식 제공

ORM vs SQL Mapper

ORM (Object-Relational Mapping)

  • 객체 중심: 객체를 조작하면 자동으로 SQL 생성
  • 예시: JPA/Hibernate, Django ORM
  • 장점: 높은 생산성, 객체지향적 개발
  • 단점: 복잡한 쿼리 작성 어려움

SQL Mapper

  • SQL 중심: 개발자가 직접 SQL을 작성
  • 예시: MyBatis
  • 장점: 세밀한 SQL 제어 가능
  • 단점: 더 많은 코드 작성 필요
profile
컴공학생

0개의 댓글