패러다임 불일치
'객체지향 프로그래밍'은 추상화, 캡슐화, 은닉화, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.
'관계형 데이터베이스'는 데이터 중심으로 구조화, 집합적인 사고를 필요로하며, 추상화, 상속다형성 같은 개념이 없다.
객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르므로 둘의 기능과 표현 방법도 다르다.
이것을 객체와 관계형 데이터베이스의 패러다임 불일치 문제라 한다. 따라서 객체 구조를 테이블 구조에 저장하는데는 한계가 있다.
이런 문제를 개발자가 중간에서 해결해야 하는데, 패러다임 불일치 문제를 해결하는데 너무 많은 시간과 코드를 소비한다.
JPA란 무엇인가?
JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준이며, 어플리케이션과 JDBC 사이에서 동작한다.
ORM(Object-Relational Mapping)은 이름 그대로 객체와 관계형 데이터베이스를 매핑한다는 뜻이다.
ORM 프레임워크는 겍체와 테이블을 매핑해서 패러다임 불일치 문제를 개발자 대신 해결해준다.
CRUD 코드
jpa.persist(member); //저장
Member member = jpa.find(memberId); //조회
Member member = jpa.find(memberId);
member.setName("이름변경"); //수정 (별도의 수정 메소스 제공하지 않고 객체를 조회해서 값을 변경만하면 트랜잭션 커밋할 때 UPDATE SQL이 전달됨
jpa.remove(member); //삭제
왜 JPA를 사용해야 하는가?
- 생산성
- 자바 컬렉션에 객체를 저장하듯 JPA에게 저장할 객체를 전달
- INSERT SQL을 작성하고 JDBC API 사용하는 지루하고 반복적인 일을 JPA가 대신 처리
- CREATE TABLE 같은 DDL문 자동생성
- 데이터베이스 설계 중심의 패러다임을 객체 설계 중심으로 역전
- 유지보수
- 기존 JDBC API를 이용할 경우, 엔티티에 필드 추가시 등록, 수정, 조회 관련 코드 모두 변경
- JPA를 사용하면 이런 과정을 JPA가 대신 처리
- 개발자가 작성해야 할 SQL과 JDBC API 코드를 JPA가 대신 처리해줌으로 유지보수 해야하는 코드 수가 줄어듦
- 성능
- 다양한 성능 최적화 기능제공
- 어플리케이션과 데이터베이스 사이에 존재함으로 여러 최적화 시도 가능
- 데이터 접근 추상화와 벤더 독립성
- 데이터베이스 기술에 종속되지 않도록 함
- 데이터베이스를 변경하면 JPA에게 다른 데이터베이스를 사용한다고 알려주면 됨
- ex) 로컬 개발 환경은 H2 데이터베이스를 사용하고 개발이나 상용환경은 오라클이나 MySQL을 사용할 수 있음
ORM에 대한 궁금증과 오해
- ORM 프레임워크를 사용하면 SQL과 데이터베이스는 잘 몰라도 되나요?
- 아닙니다. 데이터는 결국 관계형 데이터베이스에 저장됩니다. 테이블 설계는 여전히 중요하고 SQL도 잘 알아야 합니다.
객체와 테이블을 올바르게 매핑하려면 객체와 관계형 데이터베이스 양쪽을 모두 이해해야 합니다.
따라서 데이터베이스 테이블 설계나 SQL을 잘 몰라서 ORM 프레임워크를 사용한다는 것은 ORM의 본질을 잘못 이해한 것입니다.
- 아닙니다. 데이터는 결국 관계형 데이터베이스에 저장됩니다. 테이블 설계는 여전히 중요하고 SQL도 잘 알아야 합니다.
- 성능이 느리진 않나요?
- 지금 시대에 자바가 느리다고 말하는 것과 비슷하다고 생각합니다.
JPA는 다양한 성능 최적화 기능을 제공해서 잘 이해하고 사용하면 SQL을 직접 사용할 때보다 더 좋은 성능을 낼 수도 있습니다.
- 지금 시대에 자바가 느리다고 말하는 것과 비슷하다고 생각합니다.
- 통계 쿼리처럼 매우 복잡한 SQL은 어떻게 하나요?
- JPA는 통계 쿼리 같이 복잡한 쿼리보다는 실시간 처리용 쿼리에 더 최적화되어 있습니다.
상황에 따라 다르지만 정말 복잡한 통계 쿼리는 SQL을 직접 작성하는 것이 더 쉬운 경우가 많습니다.
따라서 JPA가 제공하는 네이티브 SQL을 사용하거나 마이바티스 같은 SQL 매퍼 형태의 프레임워크를 혼용하는 것도 좋은 방법입니다.
- JPA는 통계 쿼리 같이 복잡한 쿼리보다는 실시간 처리용 쿼리에 더 최적화되어 있습니다.
- 마이바티스와 어떤 차이가 있나요?
- 마이바티스나 스프링 JdbcTemplate을 보통 SQL 매퍼라 합니다. 이름 그대로 객체와 SQL을 매핑합니다.
이런 SQL 매퍼가 편리하긴 하지만 결국 개발자가 SQL을 직접 작성해야 하므로 SQL에 의존하는 개발을 피할 수 없습니다.
반면, ORM은 객체와 테이블을 매핑만하면 SQL을 만들어서 데이터베이스와 관련된 처리를 해주므로 SQL에 의존하는 개발을 피할 수 있습니다.
- 마이바티스나 스프링 JdbcTemplate을 보통 SQL 매퍼라 합니다. 이름 그대로 객체와 SQL을 매핑합니다.
출처도서 : 자바 ORM 표준 JPA 프로그래밍 - 김영한 지음
'JPA' 카테고리의 다른 글
[개념] JPA 프로그래밍 - 07. 고급매핑 (0) | 2019.12.27 |
---|---|
[개념] JPA 프로그래밍 - 06. 다양한 연관관계 매핑 (0) | 2019.12.27 |
[개념] JPA 프로그래밍 - 05. 연관관계 매핑 기초 (0) | 2019.12.27 |
[개념] JPA 프로그래밍 - 04. 엔티티 매핑 (0) | 2019.12.27 |
[개념] JPA 프로그래밍 - 03. 영속성 관리 (0) | 2019.12.27 |