JPA - JPA Introduction

 

1. JPA 기본 개념

JPA는 자바 진영의 ORM 기술 표준으로 애플리케이션과 JDBC 사이에서 작동한다. 여기서 ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스를 매핑한다는 뜻이다.

자바 애플리케이션 --- JPA -- JDBC <-----> DB

ORM 프레임워크는 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 해결해준다. 객체를 데이터베이스에 저장할 때 INSERT SQL을 직접 작성하는 것이 아니라 객체를 마치 자바 컬렉션에 저장하듯이 ORM 프레임워크에 저장하면 된다. 그러면 ORM 프레임워크가 적절한 INSERT SQL을 생성해 데이터베이스에 객체를 저장해준다. 조회할 때도 JPA를 통해 객체를 직접 조회하면 된다.

ORM 프레임워크는 단순히 SQL을 개발자 대신 생성해서 데이터베이스에 전달해주는 것뿐만 아니라 패러다임의 불일치 문제들도 해결해준다. 객체 측먄에서 정교한 모델링을 할 수 있고, 관계형 데이터베이스는 데이터베이스에 맞게 모델링을 하면된다. 이 둘을 어떻게 매핑해야하는지 매핑 방법만 ORM 프레임워크에 알려주면 된다.

이렇게 되면 개발자는 데이터 중심인 관계형 데이터 베이스를 사용하더라도 객체지향 애플리케이션 개발에 집중을 할 수 있다.

2. JPA를 사용해야는 이유?

그렇다면 JPA를 사용해야하는 이유를 알아보자.

2.1 생산성

JPA를 사용하면 자바 컬레션에 객체를 저장하듯 JPA에게 저장할 객체를 전달하면 된다. INSERT SQL을 작성하고 JDBC API를 사용하는 반복적인 작업을 JPA가 대신 처리해준다.

jpa.pesist(member); // 저장
Member member = jpa.find(memberId); // 조회
  • 반복적인 코드와 CRUD SQL을 개발자가 직접 작성하지 않아도 된다.
  • DDL문을 자동으로 생성해주는 기능도 있다.
  • 위의 기능들을 사용함으로써 데이터베이스 설계 중심의 패러다임을 객체 설계 중심으로 역전시킬 수 있다.

2.2 유지보수

SQL에 의존적인 개발을 하거나 SQL을 직접 다루면 엔티티에 필드를 하나만 추가해도 관련된 등록, 수정, 조회 SQL과 결과를 매핑하기 위한 JDBC API 코드를 모두 변경해야한다. JPA를 사용하게 되면 이러한 과정을 JPA가 대신 처리해주기 때문에 필드를 추가, 삭제하더라도 수정해야할 코드가 줄어든다.

즉 다시말해 객체지향 언어가 가진 장점을 활용하여 유연하고 유지보수하기 좋은 도메인 모델을 편리하게 설계할 수 있다.

2.3 패러다임 불일치 해결

JPA는 상속, 연관관계, 객체 그래프 탐색, 비교와 같은 패러다임의 불일치 문제를 해결해준다.

2.4 성능

JPA는 애플리케이션과 데이터베이스 사이에서 다양한 성능 최적화 기회를 제공해준다.

String memberId = "helloId";
Member member1 = jpa.find(memberId);
Member member2 = jpa.find(memberId);

위와 같이 같은 트랜잭션 안에서 같은 회원을 두번 조회할 경우, JDBC API를 사용해서 해당 코드를 직접 작성했다면 회원을 조회할 때마다 데이터베이스와 SELECT SQL을 통해 두번 통신을 했을 것이다. 하지만 JPA를 사용하면 SQL을 하번만 데이터베이스에 전달하고 두번째는 조회한 객체를 재사용한다.

2.5 데이터 접근 추상화와 벤더 독립성

관계형 데이터베이스는 같은 기능도 벤더마다 사용법이 다른 경우가 많다. 페이징 처리의 경우 데이터베이스마다 달라서 사용법을 각가 배워야만 한다. 결국 애플리케이션은 처음 선택한 데이터베이스 기술에 종속되고 다른 데이터베이스로 변경하기가 어려워지게 된다.

JPA는 애플리케이션과 데이터베이스 사이에 추상화된 데이터 접근 계층을 제공하여 특정 데이터베이스 기술에 종속되지 않도록 한다. 만약 데이터베이스를 변경하면 JPA에게 데이터베이스의 변경을 알려주기만 하면된다. JPA를 사용하면 로컬개발 환경에서는 H2를 사용하고 사용환경은 오라클이나 MySQL을 사용할 수 있다.

JPA --사용--> Dialect <---- MySQLDialect, OracleDialect, H2Dialect

3. Summery / Conclusion

JPA를 사용함으로써 보다 더 객체지향적인 프로그래밍을 설계할 수 있고, 유지보수 및 코드의 변경에 유연하게 대처할 수 있다는 것을 알수 있었다. 하지만 JPA를 사용한다고 해서 SQL과 데이터베이스를 몰라도 되는 것이 아니라 오히려 좀더 깊게 공부를 해야한다는 것도 알았다. 저자의 말처럼 ORM이 객체지향과 관계형데이터베이스라는 두 기둥 위에 있기 때문이다. 그래서 데이터베이스와 객체를 올바르게 매핑하고 사용하기 위해서는 양쪽 모두를 이해하기 위해 좀더 공부를 더 많이 해야겠다.

4. References

본 글은 자바 ORM 표준 JPA 프로그래밍를 읽고 개인적으로 학습한 내용 복습하기 위해 작성된 글로 내용상 오류가 있을 수 있습니다. 오류가 있다면 지적 부탁 드리겠습니다.