ORM(Object-Relational Mapping)이란 무엇인가요?

김상욱·2024년 12월 14일

ORM(Object-Relational Mapping)이란 무엇인가요?

Object-Relational Mapping(ORM)은 객체 지향 프로그래밍(Obect-Oriented Programming) 언어에서 사용하는 객체와 관계형 데이터베이스(Relational Database)의 데이터 매핑(mapping)하여 상호 변환을 가능하게 하는 기술 또는 도구. 즉, 객체 지향 언어의 객체와 데이터베이스 테이블 간의 데이터를 자동으로 변환해 주는 일종의 다리 역할

현대 소프트웨어 개발에서는 객체 지향 프로그래밍과 관계형 데이터베이스를 함께 사용하는 경우가 많음. 하지만 객체와 데이터베이스는 근본적으로 다른 구조와 개념을 가지고 있기 때문에 이를 직접적으로 연동하는 것은 복잡하고 오류가 발생하기 쉬운 작업. ORM은 이러한 문제를 해결하기 위해 등장. 개발자가 데이터베이스와 상호 작용할 때 객체 지향적인 방식으로 작업할 수 있게 해줌

  • 클래스와 데이터베이스의 테이블을 매핑하여, 객체를 데이터베이스에 저장하거나 데이터베이스에서 객체로 불러올 수 있게 함
  • 개발자가 직접 SQL 쿼리를 작성하지 않아도 ORM이 자동으로 필요한 SQL 문으로 생성하고 실행
  • 데이터베이스 트랜잭션을 관리하여 데이터의 일관성과 무결성을 유지
  • 데이터베이스 접근을 최소화하기 위해 캐시를 활용하여 성능을 향상
  • 객체 간의 관계(일대일, 일대다, 다대다)를 설정하고 관리

장점

  • SQL을 직접 작성하지 않아도 되므로 개발 속도 빨라짐
  • 데이터베이스 스키마 변경 시 객체 모델만 수정하면 되어 유지보수가 쉬워짐.
  • 데이터베이스 작업을 객체 지향적으로 처리할 수 있어 코드의 일관성과 재사용성이 높아짐.
  • ORM은 SQL 인젝션과 같은 보안 위협을 방지하는데 도움을 줄 수 있음.

단점

  • ORM이 자동으로 SQL을 생성하고 관리하기 때문에, 복잡한 쿼리의 경우 성능이 저하될 수 있음.
  • ORM 프레임워크이 사용법과 개념을 익히는 데 시간이 필요할 수 있습니다.
  • 특정 복잡한 데이터베이스 작업이나 최적화가 필요한 경우 ORM이 제공하는 기능으로는 한계가 있을 수 있다.

대표적 ORM 프레임 워크
Java : Hibernate, EclipaseLink
Python : SQLAlchemy, Django ORM
Ruby : ActiveRecord
C# : Entity Framework
PHP : Doctrine, Eloquent


ORM(Object-Relational Mapping)이란?

ORM(Object-Relational Mapping)은 객체 지향 프로그래밍 언어에서 사용하는 객체와 관계형 데이터베이스(RDB)의 테이블을 매핑(mapping)하여 데이터 조작을 객체 지향적으로 처리할 수 있게 해주는 기술입니다.

간단히 말해, SQL을 직접 작성하지 않고도 객체를 통해 데이터베이스를 다룰 수 있도록 하는 방법입니다.


왜 ORM을 사용하는가?

  1. SQL 작성 부담 감소: SQL 대신 객체 지향적으로 데이터를 다룰 수 있음.
  2. 생산성 증가: 코드의 재사용성과 유지보수성이 향상.
  3. DB 독립성: 특정 데이터베이스에 종속되지 않고 코드의 이식성이 증가.
  4. 보안 강화: SQL Injection과 같은 보안 문제 방지.
  5. 효율적 관계 관리: 엔티티(Entity) 간 관계를 객체 지향적으로 처리.

실습 아이디어: 신입 및 취준생을 위한 ORM 실습

1. 기본 CRUD 예제

JPA를 이용해 간단한 CRUD(Create, Read, Update, Delete) 애플리케이션을 만들어보세요.

주제: 사용자 관리 시스템

  • 엔티티: User (id, name, email, createdAt)
  • 기능:
    • 사용자 등록
    • 사용자 목록 조회
    • 사용자 정보 수정
    • 사용자 삭제

2. 관계 매핑 실습

JPA의 엔티티 간 관계 설정을 연습해보세요.

주제: 게시판 애플리케이션

  • 엔티티:
    • User (id, name, email)
    • Post (id, title, content, createdAt, userId)
  • 관계:
    • UserPost: 일대다 관계 (One User -> Many Posts)
  • 기능:
    • 사용자 등록
    • 사용자가 작성한 게시글 목록 조회
    • 게시글 등록, 수정, 삭제

3. 페이징과 정렬

Spring Data JPA를 사용하여 페이징과 정렬을 구현해보세요.

주제: 게시판 페이징

  • 엔티티: Post (id, title, content, createdAt)
  • 기능:
    • 게시글을 페이지별로 나눠서 조회
    • 게시글을 생성 날짜 기준으로 정렬

사용 기술:

  • Pageable 인터페이스 활용
  • Page 객체를 반환하는 findAll(Pageable pageable) 메서드 사용

4. JPQL(Java Persistence Query Language) 실습

JPQL을 활용하여 복잡한 쿼리를 작성해보세요.

주제: 사용자와 게시글 통계 조회

  • 기능:
    • 특정 사용자가 작성한 게시글 수 조회
    • 특정 날짜 이후 작성된 게시글 목록 조회

5. Native Query와 JPA 비교

Native SQL과 JPA의 JPQL을 비교하며 학습해보세요.

주제: Native Query와 JPQL을 사용하여 동일한 데이터 조회

  • 실습:
    • Native Query로 작성한 SQL과 JPQL로 작성한 쿼리 비교
    • 성능 및 코드 간결성 분석

6. 트랜잭션 관리 실습

JPA와 Spring의 트랜잭션 관리 기능을 활용해 트랜잭션을 구현해보세요.

주제: 은행 시스템

  • 엔티티:
    • Account (id, ownerName, balance)
  • 기능:
    • 계좌 간 송금
    • 송금 도중 오류 발생 시 롤백

7. 다양한 Fetch 전략 실습

JPA에서 지연 로딩(Lazy Loading)즉시 로딩(Eager Loading)의 차이를 학습합니다.

주제: 블로그 시스템

  • 엔티티:
    • Blog (id, title, content)
    • Comment (id, content, blogId)
  • 관계:
    • BlogComment: 일대다 관계
  • 실습:
    • Lazy와 Eager 로딩 설정에 따른 쿼리 실행 차이 분석
    • N+1 문제 확인 및 해결

8. 캐싱 실습

JPA의 캐싱 기능을 활용하여 성능 최적화를 학습하세요.

주제: 캐시를 활용한 조회 성능 최적화

  • 실습:
    • 1차 캐시와 2차 캐시의 작동 방식 학습
    • 데이터베이스 쿼리가 실행되지 않고 캐시에서 데이터를 가져오는 시점 확인

실습을 위한 기술 스택

  • IDE: IntelliJ IDEA 또는 Eclipse
  • ORM 도구: JPA (Hibernate)
  • 데이터베이스: H2, MySQL, PostgreSQL 중 선택
  • 빌드 도구: Maven 또는 Gradle
  • Spring Boot: spring-boot-starter-data-jpa 사용

추가 학습 방향

  • Spring Data JPA: JPA를 쉽게 사용할 수 있도록 제공되는 Spring의 추상화 계층.
  • Querydsl: 타입 안전한 동적 쿼리 작성을 위한 ORM 도구.
  • Advanced Topics:
    • 엔티티 생명주기 (@PrePersist, @PostLoad 등)
    • @Query를 활용한 사용자 정의 쿼리
    • 최적화: JPA 배치 처리(Batch Processing), Fetch Join 활용

추천 학습 자료

  • : "자바 ORM 표준 JPA 프로그래밍" by 김영한
  • 강의: 인프런의 "스프링 부트와 JPA 실습" 강좌
  • 문서: Spring Data JPA 공식 문서

이 실습을 통해 ORM에 대한 기초부터 고급 활용까지 체계적으로 익히고, 프로젝트에서 ORM을 활용한 데이터베이스 관리에 자신감을 가질 수 있을 것입니다. 🚀

0개의 댓글