일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- JPA
- lambda
- Spring
- 컴퓨터시스템
- FunctionalInterfaces
- 빌드툴
- ApplicationContext
- hibernate
- springboot
- java
- beanfactory
- String
- 프록시
- springwebmvc
- 토비의스프링
- AutoConfiguration
- Immutable
- IOC
- exception
- Kotlin for Java Developers
- gradle
- 토비의스프링3.1
- ORM
- DesignPattern
- 링킹
- 클린코드
- 자바
- 링커
- 메이븐
- DispatcherServlet
- Today
- Total
엔지니어로 가는 길
ORM이란 무엇이며 어떤 문제를 해결하는가 본문
ORM이란 무엇인가
Object-relational mapping, ORM은 객체와 관계형 데이터베이스 사이에 존재하는 패러다임 불일치를 해소해준다. '패러다임 불일치'라는 어려운 단어 속에 많은 것이 압축되어 있다. 하나씩 살펴보자.
패러다임 불일치
객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르므로 둘의 기능과 표현 방법도 서로 다르다. 따라서 객체를 관계형 데이터베이스에 저장할 때, 관계형 데이터베이스에 있는 데이터를 객체로 가져와 조작하고 싶을 때 문제가 발생하고 이 문제는 개발자가 (ORM이 없다면 더 많은) 시간과 비용을 들여 해결해야 한다. 패러다임 불일치의 예를 살펴보자.
상속
- 객체 세상에는 상속이라는 개념이 존재한다.
- 테이블은 상속이라는 개념이 없다. 상속 관계의 객체를 저장하기도, 조회하기도 어렵다.
=> JPA를 사용하면 개발자는 마치 자바 컬렉션에 저장하듯이 JPA에 객체를 저장하면 된다.
연관관계
- 객체는 참조를 사용해서 다른 객체와 연관관계를 가지고 참조에 접근해서 연관된 객체를 조회한다.
- 테이블은 외래 키를 사용해서 다른 테이블과 연관관계를 가지고 조인을 사용해서 연관된 테이블을 조회한다.
=> JPA를 이용하면 참조를 이용하여 관계를 맺은 다른 객체에 접근하듯 데이터베이스에 있는 데이터를 가져올 수 있다.
객체 그래프 탐색
- 객체 A가 있을 때 A가 참조하는 다른 객체 B, C, D 등을 A를 통해 참조하는 것을 객체 그래프 탐색이라고 한다. (참조를 사용해서 연관관계를 탐색하는 것을 객체 그래프 탐색이라 한다.)
- SQL을 직접 다루면 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해진다. 예를 들어 SQL이 B와 C까지만 조회하는 SQL이라면 B나 C까지만 참조할 수 있다. 이처럼 어디까지 객체 그래프 탐색이 가능한지 알아보려면 DAO를 열어서 SQL을 직접 확인해야 한다. 그렇다고 A와 관련된 모든 객체를 조회해서 메모리에 올려두는 것은 현실성이 없다. 결국 DAO에 A를 조회하는 여러 메소드를 만들어야 한다.
=> JPA를 이용하면 객체 그래프를 마음껏 탐색할 수 있다. JPA는 연관된 객체를 사용하는 시점에 적절한 SELECT SQL을 실행하기 때문이다. 이 기능은 실제 객체를 사용하는 시점까지 데이터베이스 조회를 미룬다고 해서 지연 로딩이라 한다.
A를 사용할 때마다 B를 함께 사용한다면 A를 조회하는 시점에 조인을 이용해서 B까지 함께 조회하는 것이 효과적이다. JPA는 연관된 객체를 즉시 함께 조회할지 아니면 실제 사용되는 시점에 지연해서 조회할지를 간단한 설정으로 정의할 수 있다.
비교
- 객체는 동등성, 동일성 비교가 모두 가능하다.
- 데이터베이스의 같은 행을 조회해도 객체의 동일성 비교에는 실패한다
=> JPA는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장한다.
SQL을 직접 사용하면?
개발자가 객체지향 애플리케이션과 데이터베이스 중간에서 SQL과 JDBC API를 사용해서 변환 작업을 직
접 해주어야 한다. 많은 시간과 비용이 드는 일이다. 개발의 중심이 객체가 아닌 데이터(SQL)로 이동하기 쉽다.
=> JPA를 이용하면 개발자는 데이터 중심인 관계형 데이터베이스를 사용해도 객체지향적으로 애플리케이션을 개발할 수 있다.
다시, ORM이란 무엇인가
객체와 관계형 데이터베이스 사이에 존재하는 패러다임 불일치를 해소해준다. 또한 지루하고 반복적인 CRUD SQL을 알아서 처리해줄 뿐만 아니라 객체 모델링도 손쉽게 할 수 있도록 도와준다. ORM을 통해 개발자는 더 중요한 일에 집중할 수 있다.
JPA
JPA란 자바 진영에서 Hibernate를 기반으로 만든 ORM 표준이다.
참고
자바 ORM 표준 JPA 프로그래밍(김영한)
'프로그래밍 > ORM' 카테고리의 다른 글
HibernateException: Illegal attempt to associate a collection with two open sessions 원인과 해결방법 (0) | 2021.07.14 |
---|---|
hibernate.hbm2ddl-auto 옵션이 제대로 동작하지 않을 때 (0) | 2021.07.07 |