JAVA

[JAVA] ORM 이란?

tudamoa 2025. 5. 31. 16:14

📌 ORM(Object-Relational Mapping) 이란?

객체 지향 프로그래밍에서 객체(Object)와 관계형 데이터베이스(Relational DB)를 연결 해주는 기술이다.

 

✅ 객체 vs 테이블

📌 OOP에서는?

  • JAVA에서 Person이라는 객체를 만들려면 아래 방식처럼 쓴다.
Person p = new Person("tudamoa", 180, 70);
p.setPhone("010-1234-5678");

→ 코드로 다루는 단위는 클래스 + 객체이다.

 

📌 DB에서는?

  • DB는 데이터를 테이블에 아래처럼 넣는다.
| id |   name  | height | weight | phone        |
|----|---------|--------|--------|--------------|
| 1  | tudamoa | 180    | 70     | 010-1234...  |

→ DB는 행(Row) 단위로 데이터를 저장하며 객체라는 개념은 없다.

 

⚠️ 문제 = 이질성

  • 개발자는 객체 중심으로 생각하고 코드를 짠다.
  • 하지만 데이터는 관계형 테이블(RDB)에 저장돼야 한다.
  • 그렇기 때문에 매번 아래 방식처럼 해줘야 한다. → 이질성이 발생한다.
String sql = "INSERT INTO person (name, height, weight) VALUES (?, ?, ?)";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, p.getName());
stmt.setInt(2, p.getHeight());
stmt.setInt(3, p.getWeight());

→ 번거롭기도 하고 객체와 테이블 구조가 바뀌면 코드도 바꿔야 한다.

 

💡  그래서 나온 것이 ORM이다

개발자는 객체만 다루고 데이터베이스와의 연결 작업은 ORM이 내부에서 자동으로 SQL 문을 실행하고 테이블과 연결해 준다.

 

  • 대표적인 ORM 기술으로는 JPA가 있다.

예시) JPA (ORM)

Person p = new Person("tudamoa", 180, 70);
entityManager.persist(p);  // 이 한 줄로 DB에 INSERT한다.

 

 

📌 ORM(Object-Relational Mapping)의 장점과 단점

✅ 장점

1. 객체 지향적이고 직관적인 코드

  • SQL 문 없이도 객체만으로 DB에 접근할 수 있어 개발자는 비즈니스 로직에 집중 가능하다.
  • 선언문, Connection/Close 등 부수적인 코드가 줄어들어 개발 속도가 향상된다.
entityManager.persist(new User("tudamoa")); // 단 한 줄로 DB에 저장할 수 있다.
 

2. 생산성 향상

  • 반복적인 CRUD 로직 자동화를 할 수 있다.
  • SQL 개발이 익숙하지 않은 개발자에게 효율적이다.

 

3. 가독성 및 유지보수 용이

  • 코드가 명확하게 분리될 수 있다. (ex: Entity, Repository, Service)
  • 복잡한 SQL 쿼리문 대신 객체 중심의 직관적인 구조를 유지할 수 있다.
  • 선언적 매핑(@OneToMany, @JoinColumn 등)으로 관계 표현이 명확하여 유지보수성이 높다.

 

4. 재사용성과 유연한 구조 설계

  • ORM 객체는 재활용 가능하고 여러 계층에서 재사용 가능하다.
  • 디자인 패턴(MVC 등등)과 조합이 좋다.

 

5. DBMS 독립성 확보

  • 특정 DBMS에 종속되지 않는다.
  • 데이터 타입 매핑까지 자동화된다. (String → VARCHAR, int → INT)
    DBMS 교체 시 리스크 최소화

 

6. 자바의 언어적 이점 활용 가능

  • equals(), hashCode(), toString() 등 Java 메서드를 자연스럽게 사용할 수 있어서 객체 비교, 정렬, 필터링 등 가공 작업을 간단하고 빠르게 처리가 가능하다. 
  • JDBC를 쓸 때는 보통 변수로만 결과를 저장하기 때문에 객체로 비교나 재사용이 힘들다.

 

7. ERD 의존도 감소

  • 명시적인 매핑 정보가 코드에 들어있기 때문에 ERD 없이도 도메인 구조 파악이 가능하다.

단점

1. 설계와 이해가 어렵다

  • 사용은 쉽지만 내부 개념(영속성 컨텍스트, 지연 로딩, Flush 등)을 이해하지 못하면 예기치 않은 문제가 발생한다.
  • 설계가 잘못되면 일관성이나 성능 문제가 심각해질 수 있다.

 

2. 복잡한 쿼리 처리의 한계

  • 동적 SQL, 다중 Join, 집계 쿼리, 윈도우 함수 등은 ORM만으로 구현이 어렵거나 불편하다.
  • 복잡한 조회 성능이 중요한 경우에는 직접 SQL 또는 Stored Procedure(SP)를 병행해야 한다.

 

3. 성능 문제 발생 가능성

  • 잘못된 엔티티 설계나 관계 매핑으로 인해 N+1 문제가 발생할 수 있다.
  • 쿼리를 자동 생성하기 때문에 비효율적인 SQL 문이 작성될 수 있다.

 

4. DBMS 고유 기능 사용의 제한

  • 특정 DBMS에서만 제공하는 고유 기능(예: Oracle의 CONNECT BY 등)은 ORM으로 사용하기 어렵다.
    → 오히려 다양한 DBMS에 대한 이식성이 좋아진다는 말이기도 하다.

 

5. 기존 시스템과의 통합이 어렵다

  • 이미 Stored Procedure가 많은 시스템에서는 ORM 도입이 어렵다.
    → 객체로 재설계해야 하기 때문에 생산성 저하나 리스크가 발생할 수 있다.

 


 

✍️ 마무리 요약

OOP: 객체, 상속 캡슐화 < > DB: 테이블, 열, 행, 외래키
→ 두 영역은 개념이 서로 통하지 않기 때문에 ORM이 자동으로 번역해주는 역할을 한다.