JPA를 사용해서 얻은 가장 큰 성과
"왜 객체 지향의 장점을 포기하고 객체를 단순히 테이블에 맞추어 데이터 전달 역할만 하도록 개발할까?"
애플리케이션을 SQL이 아닌 객체 중심으로 개발하니 생산성과 유지보수가 좋아지고 테스트를 작성하기도 편리함.
개발 단계에서 MySQL 데이터베이스를 사용하다가 오픈 시점에 오라클 데이터베이스를 사용하게 되는 경우 JPA를 사용하면 코드를 거의 수정하지 않고 데이터베이스를 손쉽게 변경할 수 있음
SQL을 직접 다룰 때 발생하는 문제점
객체를 데이터베이스에 CRUD하려면 너무 많은 SQL과 JDBC API를 코드로 작성해야함.
Member 객체가 연관된 Team객체를 사용할 수 있을지 없을지는 전적으로 사용하는 SQL에 달려 있음. 이런 방식의 가장 큰 문제는 데이터 접근 계층을 사용해서 SQL을 숨겨도 어쩔 수 없이 DAO를 열어서 어떤 SQL이 실행되는지 확인해야한다는 점.
Member나 Team처럼 비즈니스 요구사항을 모델링한 객체를 엔티티라 하는데, SQL에 모든 것을 의존하는 상황에서는 개발자들이 엔티티를 신뢰하고 사용할 수 없다.
애플리케이션에서 SQL을 직접 다룰 때 발생하는 문제점 요약
- 진정한 의미의 계층 분할이 어렵다
- 엔티티를 신뢰할 수 없다.
- SQL에 의존적인 개발을 피하기 어렵다.
패러다임의 불일치
객체와 관계형 데이터베이스는 지향하는 목적이 다르므로 둘의 기능과 표현 방법도 다르다. 이것을 객체와 관계형 데이터베이스의 패러다임 불일치 문제라 한다. 따라서 객체 구조를 테이블 구조에 저장하는 데는 한계가 있다.
객체 모델과 관계형 데이터베이스 모델은 지향하는 패러다임이 서로 다르다. 문제는 이 패러다임의 차이를 극복하려고 개발자가 너무 많은 시간과 코드를 소비한다는 점.
더 어려운 문제는 객체지향 애플리케이션답게 정교한 객체 모델링을 할수록 패러다임의 불일치 문제가 더 커진다는 점.
JPA란 무엇일까?
JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준이다. JPA는 그림 1.6처럼 애플리케이션과 JDBC 사이에서 동작한다.
ORM(Object-Relational Mapping)은 이름 그대로 객체와 관계형 데이터베이스를 매핑한다는 뜻이다.
ORM 프레임워크는 단순히 SQL을 개발자 대신 생성해서 데이터베이스에 전달 해주는 것뿐만 아니라 앞서 이야기한 다양한 패러다임의 불일치 문제들도 해결해준다.
JPA는 자바 ORM기술에 대한 API 표준 명세다.
자바 ORM 표쥰 JPA 프로그래밍 책에서는 JPA 2.1버전에 하이버네이트 프레임워크를 사용한다.
왜 JPA를 사용해야하는가
생산성
JPA를 사용하면 자바 컬렉션에 객체를 저장하듯이 JPA에게 저장할 객체를 전달하면 된다.
데이터베이스 설계 중심의 패러다임을 객체 설계 중심으로 역전시킬 수 있다.
유지보수
개발자가 작성해야 했던 SQL과 JDBC API 코드를 JPA가 대신 처리해주므로 유지보수해야 하는 코드 수가 줄어든다.
패러다임의 불일치 해결
JPA는 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 패러다임의 불일치 문제를 해결해준다.
성능
JPA는 애플리케이션과 데이터베이스 사이에서 동작한다.
JDBC API를 사용해서 코드를 작성했다면 조회할 때마다 SELECT SQL을 사용해서 데이터베이스와 두 번 통신했을 것이다. JPA를 사용하면 조회하는 SELECT SQL을 한 번만 데이터베이스에 전달하고 두 번째는 조회한 객체를 재사용한다.
데이터 접근 추상화와 벤더 독립성
JPA는 그림 1.10처럼 애플리케이션과 데이터베이스 사이에 추상화된 데이터 접근 계층을 제공해서 애플리케이션이 특정 데이터베이스 기술에 종속되지 않도록 한다.
예를 들어 JPA를 사용하면 로컬 개발환경은 H2 데이터베이스를 사용하고 개발이나 상용 환경을 오라클이나 MySQL 데이터베이스를 사용할 수 있다.
표준
JPA는 자바 진영의 ORM 기술 표준이다. 앞서 이야기했듯이 표준을 사용하면 다른 구현 기술로 손쉽게 변경할 수 있다.
'Server > JPA' 카테고리의 다른 글
[JPA] Soft Delete를 위한 @SQLDelete, @Where (0) | 2023.01.06 |
---|---|
[JPA] Delete와 DeleteById 차이 (0) | 2023.01.02 |
[JPA] 01. JPA 시작 (0) | 2022.09.15 |