📌 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이 자동으로 번역해주는 역할을 한다.
'JAVA' 카테고리의 다른 글
| [Java] equals 재정의 할 때 HashCode도 재정의 해야 하는 이유 (0) | 2025.07.16 |
|---|---|
| [JAVA] 예외(Exception) 정리 (1) | 2025.06.01 |
| [JAVA] JDBC 정리 (0) | 2025.05.27 |
| [JAVA] 스레드(Thread) 정리 (0) | 2025.03.01 |
| [JAVA] 컬렉션(Collection) 정리 / Map (0) | 2025.02.27 |