ORM이란?
- ORM이란 용어에도 나와있듯이 객체(Object)와 관계(Relation)을 연결(Mapping)해 주는 개념이다.
- 객체와 테이블 시스템(RDBMSs)을 변형 및 연결해주는 작업이라 말 할 수 있다.
- ORM을 이용한 개발은 객체와 데이터베이스의 변형에 유연하게 대처할 수 있도록 해준다.
- ORM을 객체 지향 프로그래밍 관점에서 생각해보면, 관계형 데이터베이스에 제약을 최대한 받지 않으면서, 객체를 클래스로 표현하는 것과 같이 관계형 데이터베이스를 객체처럼 쉽게 표현 또는 사용하자는 것이다.
- 데이터베이스 연동에 사용되는 기술은 JDBC, 스프링 DAO, Mybatis, HIbernate 같은 ORM에 이르기까지 매우 다양하다.
- Hibernate 같은 ORM은 애플리케이션에서 사용하는 SQL까지도 프레임워크에서 제공하기 때문에 개발자가 처리해야 할 일들을 엄청나게 줄여주기 때문에 Hibernate 이후에 수 많은 ORM 프레임워크가 등장했으며, 이런 ORM들을 보다 쉽게 사용할 수 있도록 표준화시킨 것이 JPA(Java Persistence API)다.
- 스프링 데이터 JPA는 스프링 부트에서 JPA를 쉽게 사용할 수 있도록 지원하는 Module이고, 스프링 데이터 JPA를 사용하면 JPA를 사용하는 데 필요한 라이브러리나 XML 설정은 신경 쓸 필요가 없다.
✓ SQL을 직접 다루지 않는 기술
- 개발자가 SQL을 직접 다루지 않는 대표적인 기술이 Hibernate 같은 ORM인데, ORM은 VO가 가지고 있는 정보를 데이터베이스가 아닌 java.util.Map 같은 Collection에 저장하는 것과 동일한 개념이다.
- VO 객체가 가지고 있는 값들을 테이블과 매핑하기 위해 복잡한 SQL구문들을 사용할 필요 없이 VO 객체를 데이터베이스가 아닌 Map과 같은 Collection에 저장하고 관리한다면 복잡한 SQL이 필요없을뿐더러 데이터 관리 자체가 매우 쉬워진다.
JPA란?
1) JPA 개념
- HIbernate는 기존의 EJB(Enterprise Java Beans) 기술인 엔티티 빈이 가지는 여러 문제들을 대체하기 위한 오픈소스 프레임워크로 등장했다.
- Hibernate는 비록 자바 표준은 아니지만 가장 많은 개발자들이 사용하는 ORM이고, Hibernate 개발자들이 중심이 되어 만든 ORM 표준이 바로 JPA(Java Persistence API)이다.
- JPA는 마치 JDBC 프로그램에서 JDBC API와 같은 개념으로 이해하면 쉽다. JDBC API는 java.sql 패키지로서, JDBC 인터페이스를 이용하여 데이터베이스 연동을 처리하면 실제로 실행될 때는 인터페이스를 구현한 드라이버 객체가 동작한다. 이렇게 구현해야 나중에 데이터베이스를 변경할 때, 데이터베이스에 종속적인 드라이버만 교체하면 애플리케이션 소스는 수정하지 않아도된다.
- JPA도 마찬가지로 JPA가 제공하는 인터페이스를 이용하여 데이터베이스를 처리하면 실제로는 JPA를 구현한 구현체가 동작하는 것이다. JPA를 구현한 구현체는 Hibernate, EclipseLink, DataNucleus 등 여러 가지가 있는데 스프링 부트에서는 기본적으로 Hibernate를 JPA 구현체로 이용한다.
- 결국 JPA를 이용하면 애플리케이션을 개발하는 시점에는 Hibernate를 사용하다가 실제 서비스가 시작될 때, 다른 ORM 기술로 변경이 가능하다.
2) JPA 동작 원리
- JPA는 자바 객체를 Collection에 저장하고 관리하는 것과 비슷한 개념이지만, 결국 Collection에 저장된 객체를 테이블의 ROW와 매핑하기 위해서는 누군가가 JDBC API를 이용해서 실직적인 연동 작업을 처리해야 한다.
- JPA는 자바 애플리케이션과 JDBC 사이에 존재하면서 JDBC의 복잡한 절차를 대신 처리해주기 때문에 개발자는 복잡한 API를 모르고도 데이터베이스를 사용이 가능하다.
- JPA는 데이터베이스 연동에 사용되는 코드뿐만 아니라 SQL까지 제공한다. 따라서 JPA를 이용해서 데이터베이스 연동을 처리하면 개발 및 유지보수의 편의성이 극대화된다.
- JPA는 어떤 매커니즘으로 SQL을 생성하는 것일까? 실제로 애플리케이션을 개발하는 상황에서 사용하는 테이블이 10개 있다면 각 테이블마다 CRUD에 해당하는 SQL이 필요할 것이고, 이 SQL은 대부분 비슷하게 작성될 것이다. 따라서 테이블과 VO 클래스 이름을 똑같이 매핑하고, 테이블의 칼럼을 VO 클래스의 멤버 변수와 매핑하면 얼마든지 VO 클래스를 기준으로 어느 정도 획일화된 SQL을 생성이 가능하다.
'Java > SpringBoot' 카테고리의 다른 글
[SpringBoot] Test(1) 스프링 부트에서 테스트하기(@SpringBootTest) (0) | 2020.03.21 |
---|---|
[SpringBoot] Starter로 의존성 관리하기 (0) | 2020.03.04 |
[SpringBoot] Springboot의 자동설정 (0) | 2020.02.21 |
[SpringBoot] SpringBoot의 구조와 실행 (0) | 2020.02.20 |
[SpringBoot] Spring Framework와 Spring Boot 장점 정리 (0) | 2020.02.19 |