ORM이란
객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것
객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용하여 둘 사이에 불일치가 존재한다.
그러나 ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성함으로써, 불일치를 해결할 수 있다.
장점
- ORM을 이용하면 SQL Query가 아닌 메서드로 데이터를 조작할 수 있다.
- 재사용과 유지보수가 편리하다.
- 객체마다 코드를 별도로 작성하기 때문에 코드의 가독성이 높아진다.
- SQL의 절차적이고 순차적인 접근이 아닌 객체지향적인 접근으로 인해 생산성을 높여준다.
- DBMS에 대한 종속성이 저하된다.
-> 프로그래머는 Object에 집중함으로 극단적으로 DBMS를 교체하는 거대한 작업에도 비교적 적은 리스크와 시간이 소요된다. - 자바에서 가공할 경우 equals, hashCode의 오버라이드 같은 자바의 기능을 이용할 수 있고, 간결하고 빠른 가공이 가능하다.
단점
- 동적 쿼리를 작성해야 하거나, 복잡한 조건을 조회하는 등 완벽하게 ORM 만으로는 서비스를 구현하기 어렵다.
-> JPQL이나 QueryDSL을 사용해 부족한 부분을 메꾸는 경우가 많다.
SQL Mapper와 ORM
- ORM은 DB 테이블을 자바 객체로 매핑함으로써 객체간의 관계를 바탕으로 SQL을 자동으로 생성하지만 Mapper는 SQL을 명시해주어야 한다.
- ORM은 RDB의 관계를 Object에 반영하는 것이 목적이라면, Mapper는 단순히 필드를 매핑시키는 것이 목적이라는 점에서 지향점의 차이가 있다.
JPA란
Java 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용하는 인터페이스 모음이며,
Hibernate, OpenJPA 등 에서 구현된다. JAVA에서 제공하는 API고, 스프링에서 제공하는 것이 아니다.
JPA는 애플리케이션과 JDBC(자바에서 DB에 접근할 수 있도록 제공하는 api)사이에서 동작한다.
개발자가 JPA를 사용하면, JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신한다.
JPA의 동작 과정
insert
MemberDAO에서 객체를 저장하고 싶을 때 개발자는 JPA에 Member 객체를 넘긴다.
JPA는 Member 엔티티를 분석, INSERT SQL을 생성하고 JDBC API를 사용하여 SQL을 DB에 날린다.
find
개발자는 member의 pk 값을 JPA에 넘긴다.
JPA는 엔티티의 매핑 정보를 바탕으로 적절한 SELECT SQL을 생성하고, JDBC API를 사용하여 SQL을 DB에 날린다.
이후 DB로부터 결과를 받아 와 결과(ResultSet)를 객체에 모두 매핑한다.
JPA를 사용하는 이유
- SQL 중심적인개발에서 객체중심적인 개발이 가능하다.
- DB 종류를 변경하는 것이 기존 SQL Mapper에 비해 쉽다. (DB 종류별로 SQL이 다른 경우가 많다)
- 생산성이 증가한다
간단한 메서드로 CRUD가 가능해진다
SQL을 작성하고 JDBC API를 사용하는 반복적인 일을 대신 처리해준다. - 유지보수가 쉽다
기존 : 필드 변경 시 모든 SQL문 수정
JPA : 필드만 추가하면 된다. SQL은 JPA가 처리한다 - Object와 RDB간의 패러다임 불일치 해결
상속 / 연관관계 / 객체 그래프 탐색 / 비교하기 같은 패러다임 불일치를 해결한다.
Java에서 존재하는 상속관계를 객체의 상속 관계를 지원하지 않는 데이터베이스에서 JPA가 아래와 같은 방식으로해결한다.
참고자료
'Spring boot > JPA' 카테고리의 다른 글
JPA N+1 문제 (0) | 2023.04.17 |
---|---|
JPA 영속성 컨텍스트 (0) | 2023.04.17 |